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 绑定键盘鼠标事件示例代码
Feb 12 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
Oct 26 Javascript
ajax在兼容模式下失效的快速解决方法
Mar 22 Javascript
jQuery添加和删除输入文本框标签代码
May 20 Javascript
jquery二级目录选中当前页的css样式
Dec 08 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
Mar 08 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
Oct 20 Javascript
深入剖析Node.js cluster模块
May 23 Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 Javascript
微信小程序在text文本实现多种字体样式
Nov 08 Javascript
Vue computed 计算属性代码实例
Apr 22 Javascript
如何用threejs实现实时多边形折射
May 07 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP的5个安全措施小结
2012/07/17 PHP
CI框架Session.php源码分析
2014/11/03 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
php给图片加文字水印
2015/07/31 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
JavaScript prototype对象的属性说明
2010/03/13 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
js实现筛选功能
2020/11/24 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
详解用 python-docx 创建浮动图片
2021/01/24 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
家具厂厂长岗位职责
2014/01/01 职场文书
污水厂厂长岗位职责
2014/01/04 职场文书
促销活动计划书
2014/05/02 职场文书
党建工作经验交流材料
2014/05/25 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
小学生校园广播稿
2014/09/28 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
三八妇女节主持词
2015/07/04 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
PHP判断是否是json字符串
2021/04/01 PHP