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数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 Javascript
用JS判断IE版本的代码 超管用!
Aug 09 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
jquery $.each()使用探讨
Sep 23 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
vue-cli扩展多模块打包的示例代码
Apr 09 Javascript
浅析JavaScript异步代码优化
Mar 18 Javascript
vue h5移动端禁止缩放代码
Oct 28 Javascript
Node 模块原理与用法详解
May 13 Javascript
基于postman获取动态数据过程详解
Sep 08 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
PHP对象Object的概念 介绍
2012/06/14 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
vuex的使用步骤
2021/01/06 Vue.js
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
python 标准差计算的实现(std)
2019/07/29 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
两年的个人工作自我评价
2014/01/10 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
软件售后服务承诺书
2014/05/21 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2014年电厂工作总结
2014/12/04 职场文书
业务内勤岗位职责
2015/04/13 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书