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 相关文章推荐
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
Dec 25 Javascript
js onclick事件传参讲解
Nov 06 Javascript
wap图片滚动特效无css3元素纯js脚本编写
Aug 22 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
Nov 17 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
javascript基于定时器实现进度条功能实例
Oct 13 Javascript
jQuery中库的引用方法
Jan 06 jQuery
详解react内联样式使用webpack将px转rem
Sep 13 Javascript
Vue退出登录时清空缓存的实现
Nov 12 Javascript
详解vue-flickity的fullScreen功能实现
Apr 07 Javascript
vue项目在线上服务器访问失败原因分析
Aug 14 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
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
PHP检测用户语言的方法
2015/06/15 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
js动态切换图片的方法
2015/01/20 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
老生常谈js数据类型
2017/08/03 Javascript
JavaScript监听手机物理返回键的两种解决方法
2017/08/14 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
python中强大的format函数实例详解
2018/12/05 Python
使用python实现对元素的长截图功能
2019/11/14 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
2013年员工自我评价范文
2013/12/27 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
运动会解说词200字
2014/02/06 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
请病假条范文
2015/08/17 职场文书
2016年情人节问候语
2015/11/11 职场文书
纪律委员竞选稿
2015/11/19 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL