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


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让IE浏览器event对象符合W3C DOM标准
Nov 24 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
javascript中CheckBox全选终极方案
May 20 Javascript
简单谈谈Javascript中类型的判断
Oct 19 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
Dec 13 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
vue+layui实现select动态加载后台数据的例子
Sep 20 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 Javascript
如何开发一个渐进式Web应用程序PWA
May 10 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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 正则表达式常用函数
2014/08/17 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
python zip文件 压缩
2008/12/24 Python
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
python的else子句使用指南
2016/02/27 Python
python flask中静态文件的管理方法
2018/03/20 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Python Json数据文件操作原理解析
2020/05/09 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
美国休闲服装品牌:Express
2016/09/24 全球购物
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
中专毕业生自荐信
2013/11/16 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
节电标语大全
2014/06/23 职场文书
调研座谈会发言材料
2014/08/23 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
新生入学欢迎词
2015/01/26 职场文书
个人年终总结结尾
2015/03/06 职场文书
关于开学的感想
2015/08/10 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python