前一篇博文已经介绍通过prefetch预先载入网页的资源来提升网页载入速度,以下我们一起来看一下网页加速之chromium prerendering.在介绍prerendering之前,先介绍两个概念:

1.PLT(page load time) :用户浏览网页触发浏览器内核 onPageStarted 到onPageFinished即网页開始到完毕的时间。
2.PPLT(perceived page load time):用户可感知的网页载入时间,从用户发起页面载入请求到页面呈现。

背景:

2011年6月14号 Google chrome公布支持新的feature prerendering http://blog.chromium.org/2011/06/prerendering-in-chrome.html.
 打开这个链接我们能够看到视频里的Google搜索结果页对照, 使用prefetching 的效果能马上显示出网页. 这样的结果相信大家都会感到吃惊. so amazing!!

可能技术人员更加关心Google chrome怎样做到的。以下我们一起来探秘prerendering实现。

什么是prerendering ?

     有时候站点会预測用户下一步会点哪个链接, 比方用户在阅读有几页新闻,那用户阅读完当前的页面非常有可能会点击下一页继续新闻阅读.浏览器假设能提前获取下一页资源或者准好下一页全部资源那么当用户点击下一页时页面能马上呈现到用户面前。这是个相当酷的体验。

用户的下一页能马上显示就是通过prerendering技术实现的。

prerendering
扩展prefetching概念, 不只预先获取顶层的资源, prerendering 会预先在后台准备下一个页面所须要的全部资源。Prerending的行为有点像我们open behind(后台打开页面) 。当我们把后台页面切换到前台时能马上显示网页。"background tab" 用户是全然不可见的, 当用户要切换到这个background 页面时。 后面的background tab 会被swap到前段, 这样用户能马上看到网页信息。

     在chrome 17版本号開始支持prerendering。  网页前端开发人员能够使用prerendering来提升页面体验. chrome本身自己会在地址栏上智能prerendering.

触发prerendering语法

<span style="font-size:14px;"><link rel="prerender" href="http://www.cmcm.com"> prerendercmcm </link></span>

prerendering 触发方式非常像firefox的prefetching 也是一个HTML中得<link> tag,可是chrome的 prerendering 不支持 meta-http和 hettp header触发。

当chrome邂逅这个标记时,它会记录这个页面。并在特定时机生成后台页面.

浏览器怎样prerendering & prerendering时机

prerendering和prefetching有一点非常大不同的是,prerendering假设你网页不想触发。chrome浏览器也会帮你在合适的时机触发,比方chrome的智能地址栏. 支持prerendering浏览器会在HTML parse阶段当发现tag包括"prerender" 则会创建PrerenderHandler。并加入任务到PrerenderDispatcher中。PrerenderDispatcher会发送一个消息到主进程把任务加到prerender任务列表中。


使用prerendering 限制与开关

为了防止过期数据以及资源浪费,chrome对prerender的页面设置有效期。当后台页面被创建出来后,30ms内没被使用,则会丢弃这个后台页面,这个有效期在后面的chrome版本号有可能会变化。

以下是一些prerendering不能触发的场景:
1) 初始化下载
2) 视频、音频页面
3) XMLPHTTPRequests 的 post。put,delete
4) HTTP 认证
5) HTTPS 页面
6) Pop window
7) 大页面须要载入非常多资源
8) 开发中模式下
測试你的浏览器是否支持prerendering prerender-test
假设你想探測自己的站点是否正在被prerender, 

hl=zh-CN">Page Visibility API 提供方便的途径来探測你的站点是否正在prerender。

前面提到chrome会在地址栏上进行prerender, chrome也提供开关。让用户选择是否开启这个功能。关闭这个功能能够从地址栏上输入--prerender-from-omnibox=disabled.

探測一个网页是否正在被prerender

1)打开Chrome Task Manager(Chrome浏览器右上角三个点工具栏--->工具--->任务管理器)
2)载入一个包括prerender的页面
3)在Chrome Task Manager中假设看到prerender打头的任务,说明你的页面正在被prerender。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHlwZW5hbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">




Prerender性能測试

測试环境:
小米2
Android 4.1.1
chrome 浏览器
site/page load time enable prerendering none prerendering improve(%)
www.cmcm.com instant page 9470 100
www.taobao.com instant page 1112 100

Prerender 在chromium中的实现

Prerendering 在解析网页过程中包括<link rel="prerender"> elements 则会触发prerendering。后台页面会被创建用来prerendered url,这个后台页面会载入全部资源,包括可运行的javascript。当用户訪问prerendered页面时,  后台页面会被swap到前台。

以下我们看一下chromium prerender过程。




      内核解析HTML过程中会触发HTMLLinkElement 的parseAttribute方法。 假设页面中包括<link rel="prerender"> 会记录状态,在process()方法中调用LinkLoad--->loadLink方法 创建PrerenderHandle的对象,在chromium其中这些都是在渲染进程中完毕,chromium的prerender 管理是在主进程中。这时PrerenderHandle对象会向主进程发送一个请求PrerenderHostMsg_AddLinkRelPrerender,把这个link相关的信息发送到主进程增加到prerenderManager管理列表中。

 
    当chromium主进程收到PrerenderHostMsg_AddLinkRelPrerender时。会检測当前是否有过多的渲染进程,假设已经有同样的任务在进行则不做处理,反之就会对接收到的url进行prerender。在android上因为有限的资源限制会重用prerendering使用的process,
为了回收资源chromium会在此启动一个计时器来销毁未被使用的prerender 后台页面。

在chromium35版本号中定时器时间是1000毫秒(ms) 在早期的chromium实现其中是30ms,当然这个数值未来还会发生变化。

相关代码路径:
third_party/WebKit/Source/core/html/LinkRelAttribute.cpp  : 负责解析网页的tags 并设置属性状态。"prerender“ 在此解析
./third_party/WebKit/Source/core/loader/LinkLoader.cpp  :负责管理连接资源载入,创建维护prerenderHandle对象
third_party/WebKit/Source/core/html/HTMLLinkElement.cpp : 负责解析HTML链接信息
chrome/browser/prerender/prerender_manager.cc  : 负责管理prerender, 触发開始,结束。丢弃,取消
chrome/browser/prerender/prerender_message_filter.cc :负责prerender相关消息的调度处理
third_party/WebKit/Source/core/loader/PrerenderHandle.cpp :负责Prerender的处理基础单元,维护一个prerender task的基础信息包括url, detach状态

參考资料地址:
http://www.chromium.org/developers/design-documents/prerender
https://developers.google.com/chrome/whitepapers/prerender?

hl=zh-CN


转载请说明出处。 谢谢!

欢迎共同探讨.

http://blog.csdn.net/typename/article/details/38536167  powered  by miechal zhao.

 
  

网页加速之Chromium 预载入 Prerendering的更多相关文章

  1. seo网页加速技术,预加载 DNS Prefetching 详解

    seo网页加速技术,预加载 DNS Prefetching 详解 DNS Prefetching 是什么 : DNS 是什么-- Domain Name System,域名系统,作为域名和IP地址相互 ...

  2. 网页加速特技之 AMP

    据统计,40%的人会放弃使用加载时间超过3秒的网站.对于加载慢的页面我也是没耐心等待的,同类型网站那么多,为什么不选择加载速度更快体验更好的呢.为了解决网页加载慢的问题,Google联合数十家技术机构 ...

  3. 【转】W3C中国与百度联合组织移动网页加速技术研讨会

    2017 年 8 月 30 日,W3C 会员百度在北京中关村软件园国际会议中心主办了 "移动网页加速技术研讨会",W3C 中国以及腾讯.阿里巴巴及 UC.搜狗.小米.傲游.中国移动 ...

  4. 预载入和JavaScript Image()对象

    预载入和JavaScript Image()对象 很多high-res图像真的可以使 Web 站点更加整洁.但是它们也会使站点的访问速度变慢——图像是文件,文件使用带宽,带宽直接与等待时间相关.是该了 ...

  5. ViewPage+frament不预载入下一个Frament数据解决的方法

    在做一个ViewPage+Frament 滑动数效果,当滑动到每一页时载入哪一页的数据,可是ViewPage会预载入下一也数据.这个问题之前做项目是一直未解决,今天找到一个方法一下子就解决的这个问题, ...

  6. ie 8在打印网页的时候打印预览是空白的

    win 7专业版系统中的ie 8在打印网页的时候打印预览是空白的,打印出来也是空白的,但是用别的浏览器打印没有问题 根据您的描述,该问题主要是由于保护模式下%Temp%\Low不正常工作引起的. 建议 ...

  7. 学习ThinkPHP的第21天---关联预载入、关联统计

    ThinkPHP关联预载入 预载入的作用是减少执行SQL语句,进而提升程序的性能. public function join(){ //用于监听SQL Db::listen(function ($sq ...

  8. 【网页加速】lua redis的二次升级

    之前发过openresty的相关文章,也是用于加速网页速度的,但是上次没有优化好代码,这次整理了下,优化了nginx的配置和lua的代码,感兴趣的话可以看看上篇的文章: https://www.cnb ...

  9. jqprint的网页打印,打印预览可以包含图片

    自己负责的模块需要有个试卷打印的功能,需要将网页特定范围内的内容打印出来,所以选择了jquery.jqprint脚本 用起来也非常简单. //打印    $("#printPage" ...

随机推荐

  1. PuTTY登录交换机后Backspace键不能删除

    使用PuTTY登录后,发现如果键入字符有误,不能使用键盘上Backspace键删除.查看PuTTY终端(Terminal)键盘(Keyboard)设置,修改上述两项设置如下(红框所示):即“The B ...

  2. pyinstall 常见错误

    字符编码错误: https://blog.csdn.net/weixin_42426496/article/details/81102665 https://blog.csdn.net/qq_4206 ...

  3. [HDU5685]2016"百度之星" - 资格赛 Problem A

    题目大意:给你一个字符串,和一些问题,每个问题问你[l,r]子串的哈希值是多少. 哈希值计算方法为:$H(s)=\prod _{i=1} ^{i\leq len(s)}(s_i-28)(mod\ 99 ...

  4. [洛谷P2370]yyy2015c01的U盘

    题目大意:有n个文件,每个文件有一个大小和价值,有一个容量为s的U盘,要装这些文件.传输文件需要接口,一个大小为k的接口能传输的最大文件的大小为k.问最少要多大的接口,才能使传输的文件价值$\ge p ...

  5. 记录python之递归函数

    函数move(n,a,b,c)的定义是将n个圆盘从a借助b移动到c. def move(n,a,b,c): if n==1: print a,'-->',c move (n-1,a,c,b) p ...

  6. C#串口调试工具 (WPF/MVVM结构完整示例版)

    前文 由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天,  网上各种版本的也很多, 功能扩展的很开也多.所以现在自己做了一个够用 ...

  7. SpringMVC+Jquery -页面异步载入数据

    背景: 做项目时涉及到页面.当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新.这都是几百年前使用的技术了.你用 ...

  8. oracle 登录

    命令行登录 sql plus登录 plsql登录 自己电脑登录 既然是登录自己电脑的数据库,肯定是已经安装过了oralce,而且已经创建了数据库等等. 局域网登录 1.必须安装oracleclient ...

  9. light oj 1317

    Description You probably have played the game "Throwing Balls into the Basket". It is a si ...

  10. STL源代码学习(vector篇)

    #include <concept_checks.h> #include<stl_allocate.h> /// The vector base class's constru ...