当我们谈到前端的性能时,总是会提到比如合并、压缩、缓存或者在服务器上开启gzip之类的,目的都是为了让页面加载的更快。

资源预拉取(prefetch)则是另一种性能优化的技术。通过预拉取可以告诉浏览器用户在未来可能用到哪些资源。

Pre-fetching会提示浏览器那些未来一定或可能使用到的资源,有时在当前页面见效,有些则在未来可能打开的页面生效。 作为开发者,我们比浏览器更懂自己的应用。我们可以利用这些技术提前告知浏览器web中用到的核心资源。

以前这种实践也被称为『prebrowsing』。但这并不是一种单一的技术,实际上可以拆分成很多小点:dns-prefetch, subresource, prefetch, preconnect, 和 prerender.

DNS prefetch

DNS prefetching通过指定具体的URL来告知客户端未来会用到相关的资源,这样浏览器可以尽早的解析DNS。比如我们需要一个在example.com的图片或者视频文件。在<head>就可以这么写:

1

<linkrel="dns-prefetch"href="//example.com">

​当请求这个域名下的文件时就不需要等待DNS查询了。项目中有用到第三方的代码时这么做尤其有益(其他的使用场景,比如当静态资源和HTML不在一个域上,而在CDN上;又比如在重定向前可以加上DNS prefetch)。

Harry Roberts在他的前端性能优化文章中建议:

简单的一行就能让支持的浏览器提前解析DNS。也就是说在浏览器请求资源时,DNS查询就已经准备好了。

这可能看起来是个非常微不足道的性能提升,而且还不是必须的–Chrome总是会做类似的处理,用户只要在地址栏敲入一部分域名,如果命中了历史常用的网站,Chrome就会提前解析DNS、预拉取页面。(效果确实有限,但是聊胜于无)

caniuse

Preconnect

和DNS prefetch类似,preconnect不光会解析DNS,还会建立TCP握手连接和TLS协议(如果需要)。用法如下:

1

<linkrel="preconnect"href="http://css-tricks.com">

Ilya Grigorik写了一篇文章详细说明了这种技术:

现代浏览器竭尽所能的尝试预测网站可能需要哪些链接。通过提前连接,浏览器可以提前建立必要的通信,消除了实际请求中DNS、TCP和TLS的耗时。不过,即使是只能的现代浏览器,也没办法为每个网站可靠的预测所有连接。

幸运的是开发者可以告诉浏览器哪些通信需要在实际请求发起前就提前建立连接。

举个栗子: 上半张图显示了浏览器先拉html、再拉CSS并建立好CSSOM后,发现需要两个外链的字体(在fonts.gstatic.com上),然后浏览器开始发起两个请求,具体来说,需要对这个域进行DNS解析、TCP和TLS握手(一个建立后可以复用给另一个连接)。

1

2

<linkhref='https://fonts.gstatic.com'rel='preconnect'crossorigin>

<linkhref='https://fonts.googleapis.com/css?family=Roboto+Slab:700|Open+Sans'rel='stylesheet'>

下半张图增加了上面的代码来从fonts.gstatic.com preconnect资源。可以看到,浏览器在请求CSS的同时并行的建立字体资源需要的连接,等到真正开始需要字体时立刻就开始返回数据。

更多详细的内容可以参考Ilya Grigorik的文章。

目前只支持Firefox 39+和Chrome 46+,具体参见caniuse

Prefetch

当能确定网页在未来一定会使用到某个资源时,开发者可以让浏览器提前请求并且缓存好以供后续使用。prefetch支持预拉取图片、脚本或者任何可以被浏览器缓存的资源。

1

<linkrel="prefetch"href="image.png">

不同于DNS prefetch,上面的写法可是会去请求、下载资源并且缓存起来。当然也是有一些发生条件的。比如,客户端可能会在弱网络下不去请求较大的字体文件,Firefox则只会在浏览器空闲的时候prefetch资源(译者注:这里是MDN上对浏览器空闲的定义和一些FAQ,建议阅读)。

正如Bram Stein在他的文章中指出,prefetch很适用于优化webfonts的性能。以前,字体文件必须等DOM和CSSOM创建好后才能下载,可如果prefetch了字体,这个瓶颈就能轻松解决了。

注意:prefetch并没有同域的限制

caniuse

Subresource

subresource可以用来指定资源是最高优先级的。比如,在Chrome和Opera中我们可以加上下面的代码:

1

<linkrel="subresource"href="styles.css">

Chromium的文档这么解释:

和 "Link rel=prefetch"的语义不同,"Link rel=subresource"是一种新的连接关系。rel=prefetch指定了下载后续页面用到资源的低优先级,而rel=subresource则是指定当前页面资源的提前加载。

所以,如果资源是在当前页面需要,或者马上就会用到,则推荐用subresource,否则还是用prefetch。

Prerender

prerender是一个重量级的选项,它可以让浏览器提前加载指定页面的所有资源。

1

<linkrel="prerender"  href="/thenextpage.html"/>

Steve Souders的文章详细解释了这个技术:

prerender就像是在后台打开了一个隐藏的tab,会下载所有的资源、创建DOM、渲染页面、执行JS等等。如果用户进入指定的链接,隐藏的这个页面就会进入马上进入用户的视线。Google Search多年前就利用了这个特性实现了Instant Pages功能。微软最近也宣布会让Bing在IE11上用类似prerender的技术。

但是要注意,一定要在十分确定用户回点某个链接时才用这个特性,否则客户端就会无端的下载很多资源和渲染这个页面。

正如任何提前的动作一样,预判总是有一定风险出错。如果提前的动作是昂贵的(比如高CPU、耗电、占用带宽),就要谨慎使用了。虽然不容易预判用户会点进哪个页面,但还是存在一些典型的场景:

  • 如果用户搜索到了一个明显正确的结果时,那么这个页面就很有可能被点入

  • 如果用户在登录页面,那么登录成功后的页面就很可能接下来会被加载了

  • 如果用户在阅读一个多页面的文章或者有页码的内容时,下一页就很可能会马上被点击了

利用Page Visibility API可以用来防止页面在还没真正展示给用户时就触发了JS的执行。

caniuse

未来:Preload

以上是已有的技术,我们再谈谈未来。 preload草案建议允许始终预加载某些资源,不像prefetch有可能被浏览器忽略,浏览器必须请求preload标记的资源。

1

<linkrel="preload"href="image.png">

然而,这项草案还没有任何浏览器支持,不过值得关注。

总结

预判用户的操作虽然不易,而且还需要大量的设计和测试工作,但是性能的提升是值得我们孜孜不倦的去追求的。如果我们愿意试验这些预加载技术,我们肯定能显著地提升用户体验。

前端性能优化--预加载技术相关推荐

  1. 前端性能优化:页面加载速度慢怎么办?

    文章目录 前端性能优化 如何识别页面加载速度慢的原因 性能优化的方式 提高资源的请求速度 http缓存 --提升二次访问的响应速度 CDN缓存静态资源缓存 webpack的hash策略-文件资源缓存 ...

  2. 需要某个字体包才能正确显示此页面_[三分钟小文]前端性能优化-页面加载速度优化...

    本期内容请记住一个核心:JavaScript很快,DOM很慢 阅读本文您将收获: 从用户输入URL到看得到页面的过程 页面渲染过程 在页面加载层级的性能优化 用户看到页面之前都经历了什么 这一部分是面 ...

  3. 前端优化——预加载篇

    #预加载 1.什么是预加载 资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到.预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就 ...

  4. ios 微信浏览器 预加载_小程序页面预加载技术

    lightning-load-project 集成方式 看不效果览图的话,请看博客 https://blog.csdn.net/sinat_27612147/article/details/80802 ...

  5. 转javascript图片预加载技术

    今天看一篇文章,再谈javascript图片预加载技术(http://www.planeart.cn/?p=1121) http://www.qiqiboy.com/2011/05/20/javasc ...

  6. 图片无序预加载技术一

    看视频记录一下. 预加载分为无序预加载和有序预加载. demo1.html <!DOCTYPE html> <html lang="en"> <hea ...

  7. 很山寨的网页游戏图片预加载技术

    很山寨的网页游戏图片预加载技术 以下一种简单易懂,方便易用的网页图片预加载技术.:=D. 这种预加载技术使用了javascript技术.静态页面技术.div隐藏技术.gif动态图片技术.bash脚本技 ...

  8. 网页性能优化02-懒加载工作原理

    懒加载工作原理 1.1-懒加载介绍(以图片懒加载为例) 1.为什么要有懒加载技术 (1)img标签特点:不管图片隐藏还是显示 有src属性都会去加载 例如电商类网站,一个页面有几百张图片.有时候假设用 ...

  9. react性能优化-懒加载原理

    编译阶段的优化 开发阶段构建更快 loader的include和exclude属性 {test: /.(j|t)sx?$/,use: [{loader: "thread-loader&quo ...

最新文章

  1. 21个令程序员泪流满面的瞬间
  2. Nmap参数--探索网络
  3. magento 插件
  4. Java集合(3)--Iterator迭代器
  5. postMessage 实现跨源通信 iframe 跨域获取url
  6. mysql从备份,mysql 主从同步范例-从同步备份步骤
  7. X86_64 CR3控制寄存器详解
  8. AST实战|某CloudFlare 5秒盾第一层混淆代码一键还原思路分享
  9. 为什么选择电阻式温度传感器呢
  10. Consul + fabio 实现自动服务发现、负载均衡 - DockOne.io
  11. 新宜中国携手fone,踏上预算管理新征程
  12. 音乐手记之民谣二:Chamber
  13. C#窗体加标尺的两种方式及显现效果
  14. 新星计划Day2【JavaSE】 枚举类与注解
  15. 华为交换机SNMP读取LLDP邻居信息的特殊配置
  16. Android通讯录(联系人)-ContentProvider
  17. Onvif/RTSP安防流媒体服务-配置CDN加速互联网直播
  18. 因未登记版权,商标被异议掉,论版权的重要性
  19. 电子--软件--电子(嵌入式)--学习之路断得漫长
  20. java dozer 官网,Dozer-JavaBean映射工具

热门文章

  1. Brain-X交叉脑科学:新刊正式启动!
  2. 操作系统 页面置换算法模拟
  3. 什么是Handler的同步屏障机制?
  4. 编程题——完全数计算
  5. 网页被重新刷新(网址后面自动添加了?)
  6. 解决华为系列手机真机调试Logcat不显示问题
  7. ubuntu普通用户不能sudo的问题
  8. 学习Vue3.0,先来了解一下Proxy
  9. 在selenium中使用tor浏览器驱动
  10. 零基础如何入门和学习软件测试?