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


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 相关文章推荐
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
Nov 30 Javascript
jQuery输入城市查看地图使用介绍
May 08 Javascript
javascript的解析执行顺序在各个浏览器中的不同
Mar 17 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
js库Modernizr的介绍和使用
May 07 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
基于jquery插件实现拖拽删除图片功能
Aug 27 Javascript
Javascript中常用类型的格式化方法小结
Dec 26 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
Jun 23 Javascript
react高阶组件经典应用之权限控制详解
Sep 07 Javascript
vue百度地图 + 定位的详解
May 13 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
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
jquery 插件学习(六)
2012/08/06 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python字符串替换示例
2014/04/24 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
python 实现视频 图像帧提取
2019/12/10 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Python pip使用超时问题解决方案
2020/08/03 Python
Django实现随机图形验证码的示例
2020/10/15 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
大学毕业的自我鉴定
2013/10/08 职场文书
写自荐信要注意什么
2013/12/26 职场文书
红旗渠导游词
2015/02/09 职场文书
教师个人培训总结
2015/02/11 职场文书
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL