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 相关文章推荐
Javascript 读后台cookie代码
Sep 15 Javascript
新手常遇到的一些jquery问题整理
Aug 16 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
Javascript操作URL函数修改版
Nov 07 Javascript
使用JavaScript+canvas实现图片裁剪
Jan 30 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
Mar 02 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
Mar 28 Javascript
JavaScript与ActionScript3两者的同性与差异性
Sep 22 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
详解VueRouter进阶之导航钩子和路由元信息
Sep 13 Javascript
vue axios封装及API统一管理的方法
Apr 18 Javascript
js回调函数仿360开机
Dec 26 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 empty()与isset()区别的详细介绍
2013/06/17 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
php实现的RSS生成类实例
2015/04/23 PHP
jquery异步循环获取功能实现代码
2010/09/19 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
优化Python代码使其加快作用域内的查找
2015/03/30 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
python中xlrd模块的使用详解
2021/02/01 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
运动会开幕式邀请函
2014/02/03 职场文书
党委班子剖析材料
2014/08/21 职场文书
小学生运动会报道稿
2014/09/12 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers