无阻塞加载脚本分析[全]


Posted in Javascript onJanuary 20, 2011

由于浏览器是单线程的,因此脚本在载的时候会阻塞下载其它资源;虽然在现在浏览器已经有所改善,但仍然有待改进。
很显然,脚本必须按顺序执行,但没有必要按顺序下载,解决方法:
1。内嵌JS
通常由于页面大小和缓存能带来更多好处,因此外部文件引入JS更好一些;
在少数情况下,比如首页、少量JS情况下尚可接受。
2。XHR Eval
通过XMLHttpRequest从服务器端获取脚本。
主要缺陷是,通过XHR获取的脚本必须部署在和主页面相同的域中。

Ajax.get("test.js", function (xhr) { 
eval(xhr.responseText); 
});

3。XHR注入
使用XHR获取脚本并创建script标签。
同样,通过XHR获取的脚本必须部署在和主页面相同的域中。
Ajax.get('test.js', function (xhr) { 
injectscript(xhr.responseText); 
}); 
function injectscript(scriptText) { 
var s = document.createElement('script'); 
s.text = scriptText; 
document.getElementsByTagName('head')[0].appendChild(s); 
}

4。Script in Iframe
将需要的脚本放入到一个页面中,然后通过iframe来加载该页面。
缺点是iframe本身的开销比较大,另外浏览器安全机制不允许iframe中的js访问跨域的父页面,反之亦然。
5。Script DOM Element
JS动态创建script DOM元素并设置其src属性。
var scriptElem = document.createElement('script'); 
scriptElem.src = 'http://domain.com/test.js'; 
document.ge('head')[0].appendChild(scriptElem);

6。Script Defer
给script标签添加defer属性。
缺点是只有IE和一些新浏览器支持。
<script defer src='test.js'></script>

7。document.write Script Tag
使用document.write把HTML标签script写入页面。
缺点是只有在IE中是并行加载脚本的。
document.write("<script type='text/javascript' src='test.js'><\/script>");

有一个大家不曾广泛讨论的不同点是对于浏览器忙碌状态的影响,包括浏览器的状态栏、进度条、Tab图标以及鼠标。
当你加载多个彼此间有依赖关系的脚本时,还需要一种能够保证执行顺序的技术。
技术    并行下载    可以跨域    存在Script标签    忙碌指示  顺序保证  大小 (bytes)
XHR Eval IE, FF, Saf, Chr, Op no no Saf, Chr - ~500
XHR Injection IE, FF, Saf, Chr, Op no yes Saf, Chr - ~500
Script in Iframe IE, FF, Saf, Chr, Op no no IE, FF, Saf, Chr - ~50
Script DOM Element IE, FF, Saf, Chr, Op yes yes FF, Saf, Chr FF, Op ~200
Script Defer IE, Saf4, Chr2, FF3.1 yes yes IE, FF, Saf, Chr, Op IE, FF, Saf, Chr, Op ~50
document.write Script Tag IE, Saf4, Chr2, Op yes yes IE, FF, Saf, Chr, Op IE, FF, Saf, Chr, Op ~100
在大多数情况下,Script DOM Element是一个好的选择。这种方式适用于所有的浏览器,而且没有跨域的限制,实现起来也非常的简单和易于理解。唯一的缺点是不能保证各个脚本的执行顺序。如果需要加载多个有依赖关系的脚本,应该将这些脚本拼成一个来保证其按需要的顺序执行,或者使用别的技术。
目前异步加载时保持执行顺序的方法有下面几种,由于篇幅原因,暂不详细描述。
单个脚本
1、Hardcoded Callback
2、Window Onload
3、Timer
4、Script Onload
5、Degrading Script Tags
多个脚本
1、Managed XHR
2、DOM Element and Doc Write
本文参考《高性能网站建设进阶指南》
Javascript 相关文章推荐
用jQuery实现检测浏览器及版本的脚本代码
Jan 22 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
jQuery中用dom操作替代正则表达式
Dec 29 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
Mar 30 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
javascript使用正则实现去掉字符串前面的所有0
Jul 23 Javascript
小程序绑定用户方案优化小结
May 15 Javascript
vue子路由跳转实现tab选项卡
Jul 24 Javascript
vue  elementUI 表单嵌套验证的实例代码
Nov 06 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 #Javascript
jqeury eval将字符串转换json的方法
Jan 20 #Javascript
通过Jquery遍历Json的两种数据结构的实现代码
Jan 19 #Javascript
JQuery动态给table添加、删除行 改进版
Jan 19 #Javascript
jQuery 1.5最新版本的改进细节分析
Jan 19 #Javascript
基于Jquery与WebMethod投票功能实现代码
Jan 19 #Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
Jan 19 #Javascript
You might like
新闻分类录入、显示系统
2006/10/09 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
php实现微信支付之退款功能
2018/05/30 PHP
javascript 隔行换色函数代码
2010/10/24 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
jQuery实现form表单reset按钮重置清空表单功能
2012/12/18 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
2017/05/12 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
Python中的进程分支fork和exec详解
2015/04/11 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
python绘制漏斗图步骤详解
2019/03/04 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
捐赠仪式主持词
2014/03/19 职场文书
年会主持词结束语
2014/03/27 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
学校工会工作总结2015
2015/05/19 职场文书