详解HTML5中rel属性的prefetch预加载功能使用


Posted in HTML / CSS onMay 06, 2016

在HTML5中,有个很有用但常被忽略的特性,就是预先加载(prefetch),它的原理是:
利用浏览器的空闲时间去先下载用户指定需要的内容,然后缓存起来,这样用户下次加载时,就直接从缓存中取出来,效率就快了.

举个例子说明:比如要预先加载某个页面,可以这样:

XML/HTML Code复制内容到剪贴板
  1. <link rel="prefetch" href="http://www.example.com/"> <!-- Firefox -->    

但如果是google的话,要用另外的一个名称,即:

XML/HTML Code复制内容到剪贴板
  1. <link rel="prerender" href="http://www.example.com/"> <!-- Chrome -->   

即使在不支持的浏览器,用了这个特性其实是不会出错的,只不过浏览器解析不到而已,
所以,如果你感觉能有办法预先预测到用户期望点的页面(比如用户看最新的受欢迎的热图,他 可能看了第一页后,会继续看下一页,这个时候就可以用预先加载这个特性了).比如

XML/HTML Code复制内容到剪贴板
  1. <link rel="prefetch" href="<?php echo get_next_posts_page_link(); ?>">   

而单独取一张图片也是可以的,比如:

XML/HTML Code复制内容到剪贴板
  1. <link rel="prefetch" href="/images/test.jpg"/>   

有了浏览器缓存,为何还需要预加载?
1.用户可能是第一次访问网站,此时还无缓存
2.用户可能清空了缓存
3.缓存可能已经过期,资源将重新加载
4.用户访问的缓存文件可能不是最新的,需要重新加载
5.Chrome 的预加载技术
现在的 chrome 聪明到根据你的浏览记录,预测到你可能访问或搜索哪些网站,在你打开网站之前就加载好了一些资源了。
举个栗子,当你在搜索框输入 "amaz" 时,它猜测到你可能要访问 amazon.com,可能就帮你加载了这个网站的一些资源。
如果这个预测算法精准的话,就能大大地提高用户的浏览体验了。

DNS prefetch
我们知道,当我们访问一个网站如 www.amazon.com 时,需要将这个域名先转化为对应的 IP 地址,这是一个非常耗时的过程。
DNS prefetch 分析这个页面需要的资源所在的域名,浏览器空闲时提前将这些域名转化为 IP 地址,真正请求资源时就避免了上述这个过程的时间。

XML/HTML Code复制内容到剪贴板
  1. <meta http-equiv='x-dns-prefetch-control' content='on'>  
  2. <link rel='dns-prefetch' href='http://g-ecx.images-amazon.com'>  
  3. <link rel='dns-prefetch' href='http://z-ecx.images-amazon.com'>  
  4. <link rel='dns-prefetch' href='http://ecx.images-amazon.com'>  
  5. <link rel='dns-prefetch' href='http://completion.amazon.com'>  
  6. <link rel='dns-prefetch' href='http://fls-na.amazon.com'>  

应用场景1:我们的资源存在在不同的 CDN 中,那提前声明好这些资源的域名,就可以节省请求发生时产生的域名解析的时间。
应用场景2:如果我们知道用户接下来的操作一定会发起一起资源的请求,那就可以将这个资源进行 DNS-Prefetch,加强用户体验。

Resource prefetch
在 Chrome 下,我们可以用 link标签声明特定文件的预加载:

XML/HTML Code复制内容到剪贴板
  1. <link rel='subresource' href='critical.js'>  
  2. <link rel='subresource' href='main.css'>  
  3. <link rel='prefetch' href='secondary.js'>  

在 Firefox 中或用 meta 标签声明:

XML/HTML Code复制内容到剪贴板
  1. <meta http-equiv="Link" content="<critical.js>; rel=prefetch">  

rel='subresource' 表示当前页面必须加载的资源,应该放到页面最顶端先加载,有最高的优先级。
rel='prefetch' 表示当 subresource 所有资源都加载完后,开始预加载这里指定的资源,有最低的优先级。
注意:只有可缓存的资源才进行预加载,否则浪费资源!

Pre render
前面说到的预解析DNS、预加载资源已经够强悍了有木有,可还有更厉害的预渲染(Pre-rendering)!
预渲染意味着我们提前加载好用户即将访问的下一个页面,否则进行预渲染这个页面将浪费资源,慎用!

XML/HTML Code复制内容到剪贴板
  1. <link rel='prerender' href='http://www.pagetoprerender.com'>  

rel='prerender' 表示浏览器会帮我们渲染但隐藏指定的页面,一旦我们访问这个页面,则秒开了!
在 Firefox 中或用 rel='next' 来声明

XML/HTML Code复制内容到剪贴板
  1. <link rel="next" href="http://www.pagetoprerender.com">  

不是所有的资源都可以预加载
当资源为以下列表中的资源时,将阻止预渲染操作:
1.URL 中包含下载资源
2.页面中包含音频、视频
3.POST、PUT 和 DELETE 操作的 ajax 请求
4.HTTP 认证(Authentication)
5.HTTPS 页面
6.含恶意软件的页面
7.弹窗页面
8.占用资源很多的页面
9.打开了 chrome developer tools 开发工具

手动触发预渲染操作
在 head 中强势插入 link[rel='prerender'] 即可:

JavaScript Code复制内容到剪贴板
  1. var hint =document.createElement("link")   
  2. hint.setAttribute(“rel”,”prerender”)   
  3. hint.setAttribute(“href”,”next-page.html”)   
  4. document.getElementsByTagName(“head”)[0].appendChild(hint)  
HTML / CSS 相关文章推荐
纯CSS3实现图片无间断轮播效果
Aug 25 HTML / CSS
css3实现超立体3D图片侧翻倾斜效果
Apr 16 HTML / CSS
css3实现可滑动跳转的分页插件示例
May 08 HTML / CSS
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
Apr 26 HTML / CSS
深入解析HTML5中的Blob对象的使用
Sep 08 HTML / CSS
使用HTML5里的classList操作CSS类
Jun 28 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
Jul 26 HTML / CSS
html5简单示例_动力节点Java学院整理
Jul 07 HTML / CSS
详解HTML5中的picture元素响应式处理图片
Jan 03 HTML / CSS
Canvas中设置width与height的问题浅析
Nov 01 HTML / CSS
div或img图片高度随宽度自适应的方法
Feb 06 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
Aug 13 HTML / CSS
深入剖析HTML5 内联框架iFrame
May 04 #HTML / CSS
HTML5 Canvas绘制五星红旗
May 04 #HTML / CSS
字中字效果的实现【html5实例】
May 03 #HTML / CSS
html5需遵循的6个设计原则
Apr 27 #HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
Apr 26 #HTML / CSS
HTML5标签嵌套规则详解【必看】
Apr 26 #HTML / CSS
HTML 5.1来了 9月份正式发布 更新内容预览
Apr 26 #HTML / CSS
You might like
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
smarty简单入门实例
2014/11/28 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
海量经典的jQuery插件集合
2010/01/12 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
简述vue状态管理模式之vuex
2018/08/29 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
安全承诺书格式
2014/05/21 职场文书
电气自动化求职信
2014/06/24 职场文书
学生会任命书范本
2015/09/21 职场文书