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 17 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
JavaScript Math.round() 方法
Dec 18 Javascript
酷炫jQuery全屏3D焦点图动画效果
Mar 22 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
laydate日历控件使用方法详解
Nov 20 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
Jan 02 Javascript
解决JavaScript layui 下拉框不显示的问题
Aug 14 Javascript
微信小程序的mpvue框架快速上手指南
May 15 Javascript
JavaScript中的几种继承方法示例
Dec 06 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中实现Javascript的escape()函数代码
2010/08/08 PHP
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
JS查看对象功能代码
2008/04/25 Javascript
ext实现完整的登录代码
2008/08/08 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
深入了解Django中间件及其方法
2019/07/26 Python
python实现两个文件夹的同步
2019/08/29 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python3实现简单飞机大战
2020/11/29 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
回复函范文
2015/07/14 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python