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 相关文章推荐
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
用js读写cookie的简单方法(推荐)
Aug 08 Javascript
Bootstrap Modal遮罩弹出层代码分享
Nov 21 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
微信小程序表单验证错误提示效果
May 19 Javascript
js 两数组去除重复数值的实例
Dec 06 Javascript
vue或react项目生产环境去掉console.log的操作
Sep 02 Javascript
Vue实现图书管理案例
Jan 20 Vue.js
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下通过POST还是GET来传值
2008/06/05 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
js函数排序的实例代码
2013/07/01 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
python3 实现口罩抽签的功能
2020/03/11 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
中科创达面试题
2016/12/28 面试题
Overload和Override的区别
2012/09/02 面试题
岗位安全生产责任书
2014/07/28 职场文书
批评与自我批评范文
2014/10/15 职场文书
信访工作汇报材料
2014/10/27 职场文书
售票员岗位职责
2015/02/15 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
python处理json数据文件
2022/04/11 Python