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 相关文章推荐
De facto standard 世界上不可思议的事实标准
Aug 29 Javascript
js删除所有的cookie的代码
Nov 25 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
May 19 Javascript
用jquery方法操作radio使其默认选项是否
Sep 10 Javascript
JavaScript 语言基础知识点总结(思维导图)
Nov 10 Javascript
js导出txt示例代码
Jan 14 Javascript
js获取页面传来参数的方法
Sep 06 Javascript
jQuery实现自动切换播放的经典滑动门效果
Sep 12 Javascript
JavaScript实现复制文章自动添加版权
Aug 02 Javascript
微信小程序实现登录注册tab切换效果
Dec 29 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 Javascript
jQuery实现穿梭框效果
Jan 19 jQuery
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
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
php经典趣味算法实例代码
2020/01/21 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
Python中列表(list)操作方法汇总
2014/08/18 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Python turtle库的画笔控制说明
2020/06/28 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
交通安全寄语大全
2014/04/08 职场文书
考核评语大全
2014/04/29 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
离婚协议书范文2015
2015/01/26 职场文书
任命书格式模板
2015/09/22 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
PHP策略模式写法
2021/04/01 PHP
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python