文档章节

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

蓝色犀牛
 蓝色犀牛
发布于 2017/04/23 18:56
字数 2012
阅读 7
收藏 0

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

2013年10月22 日

预加载器(也称为推测式或预先预分析器)可能是浏览器性能的最大改进。

在实施过程中,Mozilla报告说,加载时间有19%的改善,而对Alexa来说,前两千个站点的测试发现,Google发现约有20%的改进

这不是一个新的浏览器功能,但有些似乎认为它只是Chrome,而其他人则认为这是“最具破坏性”的性能提升“曾经有过”!

那么预装载机是什么,它如何提高性能?

浏览器如何加载网页

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

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

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

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

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

虽然浏览器能够并行地进行多个请求,但是通常这样的行为往往不会与脚本并行地下载任何资源。

这是浏览器用来表现和使用史蒂夫· 波斯的Curzillion的方式,我们可以创建一个在IE7中演示的测试页面。

测试页有两种样式,然后在头两个脚本,然后在体内,它有两个图片,脚本,最后另一幅图像。

瀑布使得在下载脚本时可以轻松看到并行下载停止。


Cuzillion瀑布在IE7中生成测试页面

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

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

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

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

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

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

使用IE8重复以前的测试显示其他资源现在与脚本并行下载,为此测试案例提供了巨大的性能提升:7s vs 14s。


Cuzillion瀑布在IE8中生成测试页

预装载程序行为因浏览器而异,仍然是实验领域,有些浏览器似乎具有天真的实现,它们按照发现的顺序下载资源,但其他浏览器会优先下载,例如Safari给出不适用于当前的视口是一个低优先级,Chrome调度脚本(甚至是页面底部的脚本),其优先级高于页面上的大多数图像。

优先级机制没有很好的记录(您可以阅读某些浏览器的来源!),但如果您想更好地了解自己可以做什么,詹姆斯·西蒙森写了一些关于他们在Chrome中尝试的方法的优秀笔记

预装载机

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

有些情况下,使用javascript插入资源也可以跳过一些预装载。

我在Stack Overflow中遇到了一个答案,建议使用JavaScript来根据浏览器宽度将链接插入移动或桌面样式表:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16
<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被延迟,直到其中一个图像完成并且连接变为可用。


测试页面加载在IE9中

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

影响预装载机

目前我们有限的方式可以影响预装载程序的优先级(使用javascript隐藏资源是一个),但W3C资源优先级规范提出了两个属性来帮助表明我们的意图。

lazyload :除非没有标记为lazyload的其他资源已经开始下载,否则不应下载资源

postpone :资源不能下载,直到用户可见,即在视口内,显示不是没有。

虽然我不确定polyfill是多么容易,也许延期可能会实现一个简单的实现响应图像的方法?

预加载与预取

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

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

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

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

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

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

还有两种链接类型,允许我们推测提示下一步的内容,并将以比当前页面上的资源更低的优先级进行下载。

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

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

在后台选项卡中预取并呈现整个页面:

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

Ilya Grigorik的Preconnect,preetch,prerender ...从WebPerfDays 谈话纽约是一个很好的开始,如果你想了解更多关于预取。

概要

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

它被广泛实现 - 我测试了以下浏览器以确认他们有一个预加载器:

  • IE8 / 9/10
  • Firefox
  • Chrome(包括Android)
  • Safari(inc iOS)
  • Android 2.2.2 / 2.3(2.2.2测试2014年5月18日)

Bruce Lawson也证实了Opera Mini使用了Presto引擎,它具有一个预装载器。

资源优先事项(也许<link rel=subresource...)将给我们一些方法来表明我们的优先事项。

如果你发现任何打字错误,或有问题,并添加他们在评论中,我会尽力解决和回答。

本文转载自:https://andydavies.me/blog/2013/10/22/how-the-browser-pre-loader-makes-pages-load-faster/

共有 人打赏支持
蓝色犀牛
粉丝 0
博文 21
码字总数 5800
作品 0
沙坪坝
其他
私信 提问
前端性能优化:客户端从输入到展示讲解

性能优化的根本目的:   要思考的是用户使用网站的体验如何,而不是我们可以节省多少字节,只有准确感知用户的感受,我们才有必要谈毫秒、字节和请求数量等问题。 针对优化注意事项: 防止...

仲强
2017/10/11
0
0
【性能优化】quicklink:实现原理与给前端的启发

近来,GoogleChromeLabs 推出了 quicklink,用以实现链接资源的预加载(prefetch)。本文在介绍其实现思路的基础上,会进一步探讨在预加载方面前端工程师还可以做什么。 1. quicklink 是什么...

AlienZHOU
2018/12/26
0
0
标签实现预加载功能详解

前言 最近在研究 vue-cli 3.0生成的工程,在构建后生成的 index.html里面发现了下面这种用法: 这就触到了本人的知识盲区了,本着扫盲的目的,研究了下 link 标签,发现这个小东西功能还是挺...

2018/06/15
0
0
标签实现预加载功能

前言 最近在研究 vue-cli 3.0生成的工程,在构建后生成的 index.html里面发现了下面这种用法: 前言 最近在研究 vue-cli 3.0生成的工程,在构建后生成的 index.html里面发现了下面这种用法:...

a独家记忆
2018/06/18
0
0
[译]从内部了解现代浏览器(2)

原文链接 导航会发生什么 这是本系列博客的第2部分。在上一篇文章中,我们研究了不同的进程和线程如何处理浏览器的不同部分。在这篇文章中,我们深入将深入研究每个进程和线程如何进行通信以...

biorz
2018/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
34分钟前
1
0
按钮点击-30秒钟Jquery倒计时实现

记录一个按钮点击后倒计时定时器的功能(常用于短信验证码功能),方便以后查看复用! //(1)定义按钮点击事件,下面第一句应该在jquery的ready函数 $('#querybbs').click(queryBbs);  ...

em_aaron
38分钟前
1
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
3
0
看了一下Maven的内容

了解了Maven其实是一个跨IDE的标准构建工具,能推广的原因估计是借了仓库的便利。 另一个作用是可以通过Maven的功能在社区版的IDEA去创建Web项目,下次实践看看

max佩恩
昨天
3
0
day27:expect批量杀进程|

1、linux下当前目录有一个文件ip-pwd.ini,内容如下: [root@localhost_002 shell100]# cat ip-pwd.ini 10.111.11.1,root,xyxyxy10.111.11.2,root,xzxzxz10.111.11.3,root,12345610.......

芬野de博客
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部