前者已经推出了一个博客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. 百度MIP移动页面加速——不只是CDN

    MIP是用CDN做加速的么?准确答案是:是,但不只是. MIP全称Mobile Instant Pages,移动网页加速器,是百度提出的页面加速解决方案.MIP从前端渲染和页面网络传输两方面进行优化, ...

  2. MIP如何为页面加速?

    MIP是近日由百度发起的开源项目,它的核心是一套应用于移动网页的开放性技术标准,通过提供MIP-HTML规范.MIP-JS运行环境以及MIP-Cache页面缓存系统,实现移动网页加速. 换言之就是,M ...

  3. 【页面加速】配置Nginx加载ngx_pagespeed模块,加快网站打开的速度

    ngx_pagespeed 是一个 Nginx 的扩展模块,可以加速你的网站,减少页面加载时间,它会自动将一些提升web性能的实践应用到网页和相关的资源(CSS.JS和图片)上,无需你修改内容和流程. ...

  4. 在 Laravel 应用中使用 pjax 进行页面加速

    说明# PHPHub 使用 pjax 来加速网页的加载, 这篇文章是在开发完此功能后做的笔记. 什么是 Pjax# .--. / \ ## a a ( '._) |'-- | _.\___/_ ___ ...

  5. 理解WebKit和Chromium(电子书)

    前言   基础篇 WebKit, WebKit2, Chromium和Chrome介绍 WebKit和Blink WebKit和Chromium代码目录结构介绍 WebKit和Chromium功能模块 ...

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

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

  7. 国内CDN加速现状

    什么是CDN CDN的全称是Content Delivery Network,即内容分发网络.是位于网络层与应用层之间的网络应用,其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内 ...

  8. MIP缓存加速原理 MIP不仅仅只是CDN

    什么是MIP?我想我们现在都知道.可是你真的了解MIP吗?MIP加速原理是什么?MIP 是用 CDN 做加速的么?准确答案是:是,但不只是. 很多人并认为MIP百度排名会靠前,甚至权重会提高?作为一个 ...

  9. 关于CDN对动态网站加速的一些看法

    CDN的全称是Content Delivery Network,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘" ...

随机推荐

  1. 全文检索引擎Solr 指南

    全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T

  2. libpomelo 增加编译静态库cocos2d-x xcode 工程

    离 https://github.com/NetEase/libpomelo 下载最新版本.拉开拉链,静态库 ./pomelo_gyp -DTO=ios ./build_ios ./build_ios ...

  3. singleton pattern

    1 normal mode class Singleton { private Singleton(){}; Singleton singleton; static Singleton getInst ...

  4. JavaScript向select下拉框中加入和删除元素

    JavaScript向select下拉框中加入和删除元素 1.说明 a   利用append()方法向下拉框中加入元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源代码 < ...

  5. 请注意CSDN社区微通道,许多其他的精彩等着你

    CSDN社区微信公众号"程序人生"(微信ID:coder_life)来了,每天我们会将CSDN社区中大量的优质内容浓缩成1~3篇文章.推送到您的手机中,让您不管何时何地都能感受到知 ...

  6. Android_使用StrictMode 调试开发

    本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/40076049 1.StrictMode简单介绍 自Android 2 ...

  7. CKEditor上传插件

    CKEditor上传插件 前言 CKEditor上传插件是不是免费的,与您分享在此开发.这个插件是基于ASP.NET MVC下开发的,假设是webform的用户或者其他语言的用户.能够參考把serve ...

  8. 查看SQLSERVER内部数据页面的小插件Internals Viewer

    原文:查看SQLSERVER内部数据页面的小插件Internals Viewer 查看SQLSERVER内部数据页面的小插件Internals Viewer 感觉internals viewer这个名 ...

  9. java学习笔记2015-6-6

    类与对象  (概念型  Demo演示)    面向对象   java  C++   包裹  承受  多态    分类  物    面向过程   C    结构体 1.获取用户输入  2.逻辑推断   ...

  10. Windows8.1和Ubuntu14.04双系统卸载Ubuntu參考教程[图]

    我之前编写并公布了<Windows8.1安装Ubuntu14.04双系统參考教程及双硬盘注意事项>这篇教程,而本文提供的卸载Ubuntu方法适用于这篇教程,其它方法安装的Ubuntu可适当 ...