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 事件对象的实现
Jul 13 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
js类定义函数时用prototype与不用的区别示例介绍
Jun 10 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
Jul 06 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
jquery判断当前浏览器的实现代码
Nov 07 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
详解React+Koa实现服务端渲染(SSR)
May 23 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
微信小程序 如何保持登录状态
Aug 16 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
2014/10/16 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
中学生操行评语大全
2014/04/24 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
公积金具结保证书
2015/05/11 职场文书