Even Faster Web Sites: 读书笔记(二)

这次因为一个项目的原因,又重读了《Even Faster Web Sites》书里的第四章:Loading scripts without blocking,并且在Cuzillion里做了大量测试,又发现了很多有意思的细节。发现自己读书太糙,自责一下。结合实际工作,加上自己的理解,再把这一章的实用内容总结一下。

要解决的问题

页面的script标签引入外部js文件时,会阻塞后续外部资源的下载和加载,包括图片、CSS文件、iframe等等。

1. Script DOM Element比较常用

“Script DOM Element”方法是常见的方法,也就是createElement(“script”)的方法下载js文件,以此并行加载后续资源。这其实是很棒的一个方法,因为不需要担心跨域,而且我们在中文应用中,不用担心编码的问题(可以为<script>指定编码)。但这里需要注意的是,非IE浏览器下,这种方法会阻止window.onload事件,因此如果你的js文件很大,可能会带来用户体验不好。IE浏览器对这种贴script标签的行为是“无动于衷”的,不会在状态栏、光标和进度圈上做任何指示。看来IE也不是一无是处嘛,哈哈!测试地址

2. 个人不提倡使用XHR Eval

XHR Eval方法我不提倡使用,首先是中文编码上会遇到麻烦,其次跨域问题。另外就是下面这句:

eval(xhrObj.responseText);

当js文件比较大的时候,用eval会相对较慢,并带来安全性隐患。

3. XHR Inject是个好东西

如果编码和跨域问题都不是问题,那么XHR Inject就是最好的方法了。这是XHR Eval和DOM Script的一个这种办法,实现机制就是:

var s = document.createElement('script');
s.text = xhrObj.responseText;

这种方法避开了evil eval,并且和DOM Script一样,可以按顺序加载js文件,当然,不会阻塞后续资源的加载。更为重要的是,在所有浏览器下,这种方法都不会阻止渲染和onload事件,体现了XMLHTTPRequest的本色。测试地址在此

4. defer属性可以快速尝试

Script标签的defer属性,可以让后续资源并行加载。在实际的项目中,偶尔也可以尝试使用,因为比较快捷。Firefox 3.1以后,也开始支持script的defer属性啦。

5. document.write(“a.js”)的注意事项

注意:在<head>用document.write来插入js脚本,只能让浏览器并行加载<head>里的资源。也就是说,<head>里write脚本,会阻塞<body>的加载。测试地址。另外关于document.write,还有两个需要注意的问题。第一,它只能带来“并行加载js文件”的效果,对其他资源无效;第二,IE、Chrome支持,Firefox不支持。

6. Script in Iframe方法强烈不赞同

在iframe放js,来实现页面资源并行加载,无疑是得不偿失的行为。首先,iframe太沉重了;其次,你还得改你的js代码。反正我是不能接受的,哈哈。

结束语

在开发中,如果要加载数个js大文件,比较实际的做法还是插入script标签的方法。如果没有编码和跨域问题,用XHR Inject方法当然更好啦。

欢迎指正!

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>