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


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 实用的文字链提示框效果
Jun 30 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
Jul 22 Javascript
Json字符串转换为JS对象的高效方法实例
May 01 Javascript
node.js中的fs.close方法使用说明
Dec 17 Javascript
js+jquery实现图片裁剪功能
Jan 02 Javascript
Vue.js学习笔记之 helloworld
Aug 14 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
Vue-Access-Control 前端用户权限控制解决方案
Dec 01 Javascript
实现高性能javascript的注意事项
May 27 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
php实现微信公众平台发红包功能
2018/06/14 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
js 通用javascript函数库整理
2011/08/14 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
python练习程序批量修改文件名
2014/01/16 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
使用Python绘制图表大全总结
2017/02/11 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
python selenium firefox使用详解
2019/02/26 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
安全责任协议书
2014/04/21 职场文书
大学活动总结范文
2014/04/29 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
体育馆的标语
2014/06/24 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers