Script的加载方法小结


Posted in Javascript onJanuary 12, 2011

1.静态加载
CSS,图片资源文件在页面渲染过程中可以并行下载,不会阻塞。在IE8,FF下,也可以支持JS的并行下载。尽管页面的JS下载加速了,但是JS对页面渲染的阻塞还是依然存在的,只有JS加载完毕了,页面的剩余部分才能继续渲染。放在Head部分的Script是最为恶劣的,因为对页面来说,Head部分是require的,是后部分所必须的,Head部分不加载完毕,Body部分不会开始解析,Body解析之前,页面是空白的。静态Script放到页面的哪部分来说都是阻塞,从浏览器实现的角度来说很好理解,因为JS代码中完全有可能修改页面元素影响Dom结构。因为浏览器对JS行为的不可预知,所以只好等前面的Script加载完毕后再继续渲染。所以最佳实践往往是说将Script放到页面底部</body>附近。
JS加载对前台性能的影响,雅虎优化原则之一是减少Http请求数,压缩JS,合并JS,减少JS数。
若是业务上有很多独立模块化的JS需要加载,可以考虑在线打包的方案。

2。延迟加载
W3C标准HTML4.01给Script标签定义了一个defer属性,指明该JS不会改变Dom的content,浏览器可继续解析和渲染,无需阻塞在该Script。
http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html

 Script的加载方法小结
但部分浏览器并不支持该属性。所以它不是个很好的跨浏览器解决方案。

3.动态加载


<script type="text/javascript"> 
var js = document.createElement("script"); 
js.src = '**.js'; 
document.getElementsByTagName("head")[0].appendChild(js); 
</script>

这段代码创建了script标签,并插入这条标签到文档中。关键在于,这个脚本的加载时异步的,不会影响页面渲染的进程,不会阻塞页面内容的展示。这样的方式尽管不会阻塞页面资源的加载,但却可能会阻塞其他的script脚本,不同浏览器在这点上的表现是有非常大的差异的,参看这篇文章动态引入的外部 JS 文件在各浏览器中的加载顺序不一致
有两点非常突出,

1.同样的动态加载代码,不同浏览器对动态加载进来的js,是否阻塞下条Script标签的表现是不一样的

Script的加载方法小结

2.实现动态加载的那段代码顺序不同,对同一个浏览器来说,结果可能是非常迥异的,
如:

Script的加载方法小结 Script的加载方法小结

代码顺序的调换,IE的表现就不一样

所以,对动态加载脚本,需要重点关注的一个问题是,所动态加载的JS脚本的接口依赖问题。这个问题的解决方案也不复杂,既根据实现业务的需要跟踪所加载脚本的加载状态。加载状态的判断在IE下用readyState属性,非IE浏览器支持,脚本加载完成后的onload方法的调用。

业界优秀的延迟加载库

Ryan Grove 的LazeLoad https://github.com/rgrove/lazyload
Kyle Simpson 的 LABjs http://labjs.com/

Javascript 相关文章推荐
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
JQuery Tips(2) 关于$()包装集你不知道的
Dec 14 Javascript
JavaScript中的原型继承基础学习教程
May 06 Javascript
浅谈js中的三种继承方式及其优缺点
Aug 10 Javascript
JavaScript中的ajax功能的概念和示例详解
Oct 17 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
Nov 27 Javascript
webpack4 处理SCSS的方法示例
Sep 03 Javascript
vue动画打包后失效问题的解决方法
Sep 18 Javascript
vuex存取值和映射函数使用说明
Jul 24 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
原生JS实现音乐播放器
Jan 26 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 #Javascript
javascript smipleChart 简单图标类
Jan 12 #Javascript
javascript Window及document对象详细整理
Jan 12 #Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 #Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 #Javascript
从盛大通行证上摘下来的身份证验证js代码
Jan 11 #Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 #Javascript
You might like
PHP分页显示制作详细讲解
2006/10/09 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
php+mysql 实现身份验证代码
2010/03/24 PHP
php下批量挂马和批量清马代码
2011/02/27 PHP
php自动加载机制的深入分析
2013/06/08 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
Python 3中的yield from语法详解
2017/01/18 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
python3 线性回归验证方法
2019/07/09 Python
Python类中self参数用法详解
2020/02/13 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
教师年终个人自我评价
2013/10/04 职场文书
四年级语文教学反思
2014/02/05 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
党员带头倡议书
2015/04/29 职场文书
2015中秋祝酒词
2015/08/12 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
利用Python实现Picgo图床工具
2021/11/23 Python