如何通过预加载器提升网页加载速度

预加载器(Pre-loader)可以说是提高浏览器性能最重要的举措。Mozilla 官方发布数据,通过预加载器技术网页的加载性能提升了19%,Chrome测试了 Alexa 排名前2000名网站,性能有20%的提升。

它并不是一门新技术,有人认为只有 Chrome 才具备这个功能。也有人认为它是有史以来提升浏览器性能最有效的方法。如果你第一次接触预加载器,也许心中已经有了无数个问号。什么是预加载器?它是如何提升浏览器性能的?

首先需要了解浏览器是如何加载网页的

一个网页的加载依赖于脚本文件、CSS样式文件。让我们看看浏览器加载网页的过程。

首先,浏览器下载 HTML 并开始解析。如果浏览器发现外部CSS资源链接则发送下载请求。 浏览器可以在下载CSS资源的同时,并行解析HTML文件,但是,一旦发现有脚本文件的引用,则必须等待脚本文件完成下载并且执行后才能继续解析。 脚本文件完成下载并且执行后,浏览器可以继续解析HTML工作,如果遇到非阻塞资源 i.e. 图片浏览器会发送下载请求并且继续解析。

即使浏览器可以并行执行多个请求,但是无法与针对脚本文件的操作并行执行。

可以通过IE7打开链接中的网页进行测试。我们可以看到,网页head标签内包含2个样式文件和2个脚本文件。在body 中,包含3个图片、1个脚本文件。

通过瀑布流我们可以查看资源加载的过程:

clip_image001

脚本文件的下载和执行,会阻断其他资源文件的下载,无疑将大大降低浏览器性能。

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

2008 年,IE、WebKit和Mozilla都实现了预加载器功能,来提升网络的利用率,改善脚本文件对其他资源文件的阻塞现状。

当浏览器被脚本文件阻塞时,另一个轻量级的解析器会继续浏览剩余的标记,寻找需要下载的资源i.e. 样式文件, 脚本文件,图片 等。

一旦发现,预加载器既可以在后台开始接收这些资源,等待主解析器完成当前的脚本操作,其他资源已经完成下载,这样就减轻了脚本阻塞带来的性能损耗。

下面这个瀑布流是使用IE8打开链接中网页的结果,性能有显著的提升:IE8=7S > IE7=14S。

clip_image002

预加载功能仍然是各大浏览器厂商乐此不疲的实验领域。很多浏览器尝试设置资源下载的优先级。例如,Safari降低了不作用于当前视图区域样式文件的优先级。Chrome 则设置脚本文件的优先级高于图片,即使脚本文件位于HTML底部。

预加载器的陷阱

预加载器只能检索HTML标签中的URL,无法检测到使用脚本代码添加的URL,直至脚本代码执行时才可以获取这类资源。

我曾经遇到过一个通过javascript判断当前Window宽度,进而决策加载CSS样式文件的例子。预加载器无法识别此类资源。

<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文件才开始下载。

clip_image003

影响预加载器的加载顺序的因素

当前,有几种方式来控制预加载器的加载顺序(使用javacript隐藏资源文件既是其中一种),同时,W3C Resource Priorities 中也提供两个特性来影响预加载器。

lazyload : 直至没有被标记为lazyload 资源下载完毕后才下载被标记资源。

postpone: 资源在对最终用户可见之后才开始下载。i.e. 标签的display属性被设置为 none。

预加载VS预读取

预读取(Pre-fetching)可以通知浏览器哪些资源可能会在未来的某一时机,在当前页面或者其他页面中使用。

下面是预读取的一个简单的应用,通知浏览器为将要访问的其他站点加载资源:

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

Chrome允许我们预先通知浏览器加载未来会用到的资源,被声明的资源将以较高的优先级被下载

<link rel=”subresource” href=”/some_other_resource.js”>

(Chromium 源码中提到,被标记为subresource的资源下载的优先级低于样式文件和脚本文件,但不低于图片加载优先级)

还有标记可以通知浏览器哪些文件是较低级别的预读取文件。

预读取未来将被使用的独立资源文件。 

<link rel=”prefetch” href=”/some_other_resource.jpeg”>

通过预读取方式,在后台渲染整个页面。 

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

总结

预加载不是一门新技术,它对提高浏览器性能具有纪念意义,我们不需要做任何操作既可以使用预加载。

它广泛应用,我测试了以下浏览器,都具有预加载功能:

  • IE8 / 9 / 10
  • Firefox
  • Chrome (inc Android)
  • Safari (inc iOS)
  • Android 2.3

Bruce Lawson (Opera公司总裁)也宣布Opera Mini 同样支持预加载。

今天头有点儿疼

今天一大早起来就拉肚子,浑身无力,感觉不是昨天晚上吃的鸡蛋吃出的问题就是晚上睡觉没有盖好被子.

刚刚在爬在桌子上睡了会儿,科长走的时候教育了我一会儿,现在还是有点儿头疼.想早点回去睡觉,张良的程序还没有弄好,郁闷…………………………

昨天晚上手机里的东西格式化了,什么Qq了,股票,魔兽了,都没有了.周六还得到卖手机的地方去复制一些文件出来.麻烦.以后会小心点儿.

冲开一切,嗬嗬,后天去拿个新手机回来

昨天晚上胡闹到半夜,蛋糕弄的到处都是,碗也忘记了涮,早上起来的时候头晕晕的,真想多睡会儿…

路上遇到一胖子,这胖子我每次从公司到家,或是从家到公司都要见上几次.
胖子站在我旁边,把手放进口袋里,紧紧盯着我的上衣袋子,我的上衣袋子里面装着我的胸卡和钥匙,背上背着黑色的包,我感觉到胖子的眼光,不自觉精神一震,用手挡住了口袋,车过三站,感觉胳膊酸痛,但眼睛的余光一点儿也没有离开胖子的眼和他的手,不时的往前边座位上的另一个迷起眼睛的中年男子扫视,后来干脆把口袋里的钥匙拿出来,攥在手里,头上开始慢慢冒汗…

胖子又过一站下车,感觉周围有点空荡,我把放在胸前的手放下,顺势扫一下裤袋,乖乖,那些钱都还在.

今天一天感觉好瞌睡,一到公司看见桌上放了个笔记本电脑,心想估计是那两家伙电脑不想修,偷偷放我这里来了,打开,显示器果然不亮…拿起螺丝刀三下五除二,搞定,显示器亮了,然后再破除原来管理员密码,一阵设置,看了看科长还没来,放在桌子上玩会儿,一直放到现在.下午问了同事,那是一台科长准备送修的电脑,不知道怎么放到我这里来了.

今天处理了很多事情.就是感觉很累,另外感觉这裤子不爽,脚底下老起皮,也不爽,后天,换个手机,去看看脚,换个裤子.仿佛一切都得劲了许多.心里感觉挺舒服的.

又八点了,趁下班的铃声没响,赶紧回去,不然人多了,得半天才能出公司门.

耳边音乐响起<冲开一切>.

今天手机卡里的照片取出来了

今天手机里的照片取出来了,好高兴。

这一张,是我在人才市场外边,

还没有找到工作,我们经常到河边玩。

向全国人民问好:

像个干部样吗?

指点江山:

胡闹:

柳树:

上班的路上:

农行门口:

这两天有点小累

今天终于又处理完一些事情, 现在的工作不算太累,但就是时间浪费的太多,每天虽然不停地在忙,但总感觉时间过的更快,中午吃的饭还没有消化完,又到食晚饭的时间了。

现在最希望的是有点什么体育活动,尽情的释放一下,感觉身体目前精神还好,但还是不够强壮,十一过后不知道怎么回事,到处都是欲睡的影子,下午在二楼的时候见一个家伙一边做CAD,一边把头一颠一颠的,仿似蜻蜓频点水,发力轻而顿挫。感觉睡梦里似到极乐之所。

一会儿就回去了,好好的休息休息,一些事情都会处理的好点儿。

太忙了,时间过的太快了。

回去了,明天好好休息下。

刚刚做完了新的单价表,还有一堆旧的单价表没有做完,今天我的值班就是放视讯是一件比较大的事情,因为台湾和珠海以及本公司的重要人士都要参加,其余的时间帮别人看看电脑,链接一下打印机,不知道为什么,平时从来没有遇到的问题总是让公司里的人遇到,而且有的问题和电脑硬件都差的远了点儿,更何况打印机坏了,我更不会修理,如果我家里有一个打印机的话,估计不到三天,里面出的一大堆问题我都能解决——不管他们了,反正今天值班解束了,明天好好的休假了(下次加班一定要选个更好点的日子)。

现在唯一想的事情就是明天去哪玩。明天一同学要过来,我来到这里还没有出去玩过,每次出去做公交都是一笔钱,虽然只有几十块,但对于还没有发过一次工资资的我来说,实在是难为至极,幸好平时里喜欢帮助一别人,今天下午一兄弟说打过来有钱,估计明天钱可及时取到,呜呼哀哉,实在是爽!

来好久了没有照过相了,明天租个相机去。找个公园,随便走走逛逛,看看,到市里看看手机和笔记本,对于我来说,笔记本目前还不是太需要,但别人都有了,自己感觉也想要一个(嘿嘿)——不管他,先换个手机再说。

八点儿了,走了。我的十一假期。

[歌词]伤痛

上周末又看了一遍<断刀客>,已经是第二,或是第三遍了,里面的故事情节很惊心动魄,也很壮观细腻,结尾的片尾曲也很好听.把电影的意境更上一层.

定安和铁头是炼烽号里长大的人,有一天他们到市集上看到天天信仰的佛的代表—-和尚因为申张正义被惨暴的猎户所杀而动手杀了那些猎户,在其师父准备将炼烽号交给定安的时候,定安国为杀死猎户会给大家带来灾难引起大家不满,定安当晚决定出走的时候听到了云和师父谈自己的身世,知道自己的父亲姓黎,然后出走,不幸遇到猎户群,在争斗中失去了自己的一只手.但最张自创了新的刀法在炼烽号危急的时候杀死了自己的仇人…

有些时候一旦有多于一个的男人喜欢自己,可能同时你也失去了他们…

夜里孤单凄身于晚空
纷飞冷雪扑面觉冰冻
泪已沾湿悲伤的眼中
心中泛着旧日断肠梦
让往昔消失于风雨中
即使以往片段更伤痛
让这凄凄清清的冷风
吹走旧日颓丧旧梦
不会知不会懂心已空
失意中悲愤中谁会懂
难道世上全是这样全被你操纵
越是逃避越是情重越伤痛
不想这生忧郁半生再失意空洞
仇恨恶梦雷电震动全部似失控
刀光剑影风声雨声渐相溶
仿佛这刻心中斗争现已全被撩动
music
夜里孤单凄身于晚空
纷飞冷雪扑面觉冰冻
泪已沾湿悲伤的眼中
心中泛着旧日断肠梦
让往昔消失于风雨中
即使以往片段更伤痛
让这凄凄清清的冷风
吹走旧日颓丧旧梦
不会知不会懂心已空
失意中悲愤中谁会懂
难道世上全是这样全被你操纵
越是逃避越是情重越伤痛
不想这生忧郁半生再失意空洞
仇恨恶梦雷电震动全部似失控
刀光剑影风声雨声渐相溶
仿佛这刻心中斗争现已全被撩动
music
难道世上全是这样全被你操纵
越是逃避越是情重越伤痛
不想这生忧郁半生再失意空洞
仇恨恶梦雷电震动全部似失控
刀光剑影风声雨声渐相溶
仿佛这刻心中斗争现已全被撩动

痴痴想著你

找了好久,終於找到以前我從電影裡剪下的一段<痴痴想著你>的歌曲了.片段,但感覺還好.

這兩天在公司裡做活有點小累,但我發現在不在座位上的時候旁邊有許多人幫我把事情處理完了,我心裡非常感謝.現在唯一不爽的是有點越俎代庖,自己的工作放下了好多.這個周末注定要加班,本來是想去找同學玩的.想想還是加十一加過班再去吧.反正還有好幾天假期,可以到公園裡溜達一下.看看這邊的風景,然後等工資發了.好好的把自己整理一下,現在什么也沒有,坐公交的車費都困難.但在公司裡唯恐一的好處是食宿無憂無慮.放下了許多擔子,謝天謝地.

昨天夜城做夢.夢的頭都暈.現在盡量讓自己早點起來,因為我發現,秋天到了,精神似乎好了點兒.可以有更好的精神和工作效率了…

聽聽歌曲,放鬆一下.

播放音频文件

錄入員工數據,手有點酸

今天人事拿過來300多個員工的數據資料,要我一下子錄入oracle,儘管在老同事的幫助下,有了一些錄入的竅門,但還是累的手都酸了,自己感覺還是編程稍等好點兒.就算是手酸,兩只手全部在勞動.感覺不明顯,一只手拿鼠標久了,酸的利害.休息一會兒,寫兩句兒外邊的景色:

青天照白雁,
綠水映碧柳,
美景收不住,
異鄉華發稠.

現在不知道怎么回事,秋天了,大門外仍然草地生機盎然,白色的花開著,綠色的草長著,水流著,我,讓自己慢慢靜下來,思考著.
今天的員工信息還沒有完全弄完,下午簽了七八個銷售單,又有兩個人辭職,美女說明天提醒我,明天再刪.

今天又找出一張舊照片

昨天到老季那裡,搞到一張照片,有點太正軌了,剛才在翻郵箱時,不經意又翻出幾張.

夠經典的了.因為那郵箱裡的標題是:"看看你那傻樣兒".