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


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定时器
Nov 17 Javascript
js实现省市联动效果的简单实例
Feb 10 Javascript
jQuery实现页面滚动时动态加载内容的方法
Mar 20 Javascript
实现非常简单的js双向数据绑定
Nov 06 Javascript
原生node.js案例--前后台交互
Feb 20 Javascript
layui选项卡效果实现代码
May 19 Javascript
AngularJs定时器$interval 和 $timeout详解
May 25 Javascript
Vue2.0子同级组件之间数据交互方法
Feb 28 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
JS数组属性去重并校验重复数据
Jan 10 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 06 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
php无限遍历目录示例
2014/02/21 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
2015/03/25 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
jQuery的框架介绍
2016/05/11 Javascript
Javascript之String对象详解
2016/06/08 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
js实现交通灯效果
2017/01/13 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
Python中bisect的用法
2014/09/23 Python
在Python中编写数据库模块的教程
2015/04/29 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
2014年班主任自我评价范文
2014/04/23 职场文书
公司运动会策划方案
2014/05/25 职场文书
论群众路线学习笔记
2014/11/06 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
大学入学感言
2015/08/01 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle