浏览器预加载器如何使页面加载速度更快

预加载器(也称为推测或前瞻预解析器)可能是浏览器性能有史以来最大的改进。

那么什么是预加载器以及它如何提高性能呢?

浏览器如何加载网页

网页充满了依赖关系——在下载相关的CSS之前页面无法开始渲染,然后当遇到脚本时HTML解析器会暂停直到脚本执行(当然,如果脚本是外部的,它也需要下载)。

让我们考虑一下浏览器如何加载页面:

  • 首先下载 HTML,浏览器开始解析它。它找到对外部 CSS 资源的引用并发出下载它的请求。

  • 浏览器可以在下载 CSS 时继续解析 HTML,但随后它会找到带有外部 URL 的脚本标记,现在(除非脚本具有asyncdefer属性)它必须等到脚本下载并执行。

  • 一旦脚本下载并执行,浏览器就可以继续解析 HTML,当它发现图像等非阻塞资源时,它会请求它们并继续解析,但是当它发现脚本时,它必须停止并等待脚本执行。被检索并执行。

尽管浏览器能够并行发出多个请求,但具有这种行为的浏览器通常不会与脚本并行下载任何资源。

测试页有两个样式表,头部有两个脚本,然后在正文中有两个图像、一个脚本,最后是另一个图像。

在这里插入图片描述

通过瀑布可以很容易地看到在下载脚本时并行下载停止。

如果浏览器仍然这样工作,那么页面加载速度会更慢,因为每次遇到脚本时,浏览器都需要等待脚本下载并执行,然后才能发现更多资源。

预加载器如何提高网络利用率

Internet Explorer、WebKit 和 Mozilla 都在 2008 年实施了预加载器,作为克服等待脚本下载和执行时网络利用率低的问题的一种方法。

当浏览器在脚本上被阻止时,第二个轻量级解析器会扫描标记的其余部分,查找也需要检索的其他资源,例如样式表、脚本、图像等。

然后,预加载器开始在后台检索这些资源,目的是当主 HTML 解析器到达这些资源时,它们可能已经被下载,从而减少页面稍后的阻塞。

(当然如果资源已经在缓存中那么浏览器就不需要下载它)

使用 IE8 重复之前的测试表明,其他资源现在与脚本并行下载,为此测试用例带来了巨大的性能改进:7 秒 vs 14 秒。

在这里插入图片描述

预加载器的行为因浏览器而异,并且仍然是一个实验领域,一些浏览器似乎有幼稚的实现,它们按照发现的顺序下载资源,但其他浏览器会优先考虑下载,例如 Safari 提供的样式表不适用于当前视口的优先级较低,Chrome 会以比页面上大多数图像更高的优先级安排脚本(即使是页面底部的脚本)。

预加载器陷阱

预加载器从标记中提取 URL,并且不会/无法执行 javascript,因此使用 javascript 插入的任何 URL 对它来说都是不可见的,并且这些资源的下载将被延迟,直到 HTML 解析器发现并执行加载它们的 javascript。

在某些情况下,使用 JavaScript 插入资源也会导致某些预加载器出错。

示例:

<html>
<head><script>var file = window.innerWidth < 1000 ? "mobile.css" : "desktop.css";document.write('<link rel="stylesheet" type="text/css" href="css/' + file + '"/>');</script>
</head>
<body>
<img src="img/gallery-img1.jpg" />
<img src="img/gallery-img2.jpg" />
<img src="img/gallery-img3.jpg" />
<img src="img/gallery-img4.jpg" />
<img src="img/gallery-img5.jpg" />
<img src="img/gallery-img6.jpg" />
</body>
</html>

我不使用这种方法有几个原因,但即使是这个简单的例子也足以使 IE9 的预加载器出错——注意图像如何获取所有连接,并且 CSS 被延迟,直到其中一个图像完成并且连接变为可用的。

在这里插入图片描述

一些响应式图像方法使用后备图像,预加载器通常会在执行 javascript 以选择适当的图像之前启动后备图像下载,从而导致额外的下载。

影响预加载器

目前,我们影响预加载器优先级的方法有限(使用 javascript 隐藏资源就是其中之一),但W3C 资源优先级规范提出了两个属性来帮助表明我们的意图。

lazyload:在未标记为延迟加载的其他资源开始下载之前,不应下载资源

postpone:资源必须在用户可见(即在视口内并且显示不是无)之前才能下载。

预加载与预取

预取是向浏览器暗示将来肯定会或可能使用的资源的一种方式,一些提示适用于当前页面,其他提示适用于未来可能的页面。

在最简单的层面上,我们可以告诉浏览器将 DNS 解析为我们稍后将在页面上访问的另一个主机名:

<link rel="dns-prefetch" href="other.hostname.com">

Chrome 还允许我们暗示我们稍后将在当前页面中使用另一个资源,因此应该优先下载它:

<link rel="subresource"  href="/some_other_resource.js">

(Chromium 的源代码表明它实际上下载的优先级低于样式表/脚本和字体,但优先级等于或高于图像)

还有两种链接类型允许我们推测性地暗示接下来会发生什么,并且将以比当前页面上的资源更低的优先级下载。

预取可能位于下一页的单个资源:


<link rel="prefetch"  href="/some_other_resource.jpeg">

在后台选项卡中预取并渲染整个页面:

<link rel="prerender"  href="//domain.com/next_page.html">

总结

预加载器并不是什么新鲜事,它提供了显着的性能提升,作为开发者,我们不需要做任何特殊的事情来利用它。

原文链接:https://andydavies.me/blog/2013/10/22/how-the-browser-pre-loader-makes-pages-load-faster/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/659745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04 Docker练习赛从0开始到 docker 镜像提交

1.1 本地安装 docker 工具 这里以ubutun下安装docker为例,其他操作系统安装命令略有不同,可自行百度。(建议使用阿里源安装速度快) sudo apt install docker.io如果你本地有gpu,请继续执行如下命令以支持gpu调用: 注意: 英伟达对 docker 支持的 linux 发行版:https:/…

springcloud微服务搭建多数据源(mysql,oracle,postgres,等等)管理模块,支持通过注解方式切换不同类型的数据库

1.背景 同一套微服务管理系统&#xff0c;业务完全一样&#xff0c;但不同的客户可能要求使用自己熟悉的数据库&#xff0c;比如&#xff0c;mysql&#xff0c;oracle&#xff0c;postgres&#xff0c;还有一些国产数据库。如果能够将数据库模块独立出来&#xff0c;兼容各家的…

前端发起网络请求的几种常见方式(XMLHttpRequest、FetchApi、jQueryAjax、Axios)

摘要 前端发起网络请求的几种常见方式包括&#xff1a; XMLHttpRequest (XHR)&#xff1a; 这是最传统和最常见的方式之一。它允许客户端与服务器进行异步通信。XHR API 提供了一个在后台发送 HTTP 请求和接收响应的机制&#xff0c;使得页面能够在不刷新的情况下更新部分内容…

[C++][算法基础]最大不相交区间数量(贪心 + 区间问题2)

给定 &#x1d441; 个闭区间 [&#x1d44e;&#x1d456;,&#x1d44f;&#x1d456;]&#xff0c;请你在数轴上选择若干区间&#xff0c;使得选中的区间之间互不相交&#xff08;包括端点&#xff09;。 输出可选取区间的最大数量。 输入格式 第一行包含整数 &#x1d4…

一、OSPF基础

目录 1.路由协议的优先级 2.转发原则&#xff1a;最长匹配原则 3.负载分担 4.路由备份&#xff08;浮动路由&#xff09; 5.路由协议的分类 6.动态路由 7.距离矢量路由协议&#xff08;BGP&#xff0c;RIP&#xff09; 8.链路状态路由协议&#xff08;OSPF&#xff0c;I…

基于SpringBoot+Vue养老院管理系统设计与实现

一、前言介绍 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装养老院管理系统软件来发挥其高效地信息处理的作用&am…

HEVC/H.265视频编解码学习笔记–框架及块划分关系

前言 由于本人在学习视频的过程中&#xff0c;觉得分块单元太多搞不清楚其关系&#xff0c;因此本文着重记录这些分块单元的概念以及关联。 一、框架 视频为一帧一帧的图像&#xff0c;其编码的主要核心是压缩空间以及时间上的冗余。因此&#xff0c;视频编码有帧内预测和帧间…

Acrobat Pro DC 2023:专业PDF编辑软件,引领高效办公新时代

Acrobat Pro DC 2023是一款专为Mac和Windows用户设计的专业PDF编辑软件&#xff0c;凭借其强大的功能和卓越的性能&#xff0c;成为现代职场人士不可或缺的得力助手。 这款软件拥有出色的PDF编辑能力。用户不仅可以轻松地对PDF文档中的文字、图片和布局进行编辑和调整&#xf…

MYSQL进阶部分知识点汇总~

事务&#xff1a; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撒销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 默认MyS0L的事务是自动提交的&#xff0c;也就是说&a…

动态规划- 股票问题专题(详解+多例子+源码)

动态规划做题思路 像这种股票问题&#xff0c;我们首先想多状态动态规划 &#xff0c;先分析 ① 状态表示&#xff1a; dp[ i ]表示什么 我们这里用的是多状态&#xff0c;所以不用dp命名&#xff0c;用f[ i ]和 g[ i ]命名 一般我们 用 f[ i ]表示第 i 天当前手中持有股票的最…

kaggle无法注册怎么办

在浏览kaggle网站&#xff0c;或者是参加kaggle竞赛时&#xff0c;常常会遇到需要登陆kaggle账号的情况。而在注册时&#xff0c;却发现无论如何也无法弹出人机识别的验证码&#xff0c;导致无法注册成功。本文会手把手的讲解一种注册kaggle的方法&#xff08;edge浏览器&#…

LeetCode45:跳跃游戏Ⅱ

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n …