Javascript无阻塞加载具体方式


Posted in Javascript onJune 28, 2013

看了《高性能JavaScript》的读书笔记

几个原则:

1、将脚本放在底部

<link>还是在head中,用以保证在js加载前,能加载出正常显示的页面。

<script>放在</body>前。

2、成组脚本

由于每个<script>标签下载时阻塞页面解析过程,所以限制页面的<script>总数也可以改善性能。适用于内联脚本和外部脚本。

3、非阻塞脚本

等页面完成加载后,再加载js代码。也就是,在window.load事件发出后开始下载代码。

(1)defer属性:支持IE4和fierfox3.5更高版本浏览器

<script defer>...</script>

内联和外部文件

带defer属性的<script>可出现在文档的任何位置,对应的js文件将在<script>被解析时启动下载,但代码不会执行,直到DOM加载完毕(在onload事件句柄被调用之前)。所以实现了和也卖弄其他资源一起并行下载。

(2)动态脚本元素

文档对象模型(DOM)允许你使用js动态创建HTML的几乎全部文档内容。

var script=document.createElement("script");
script.type="text/javascript";
script.src="file.js";
document.getElementByTagName_r("head")[0].appendChild(script);

此技术的重点在于:无论在何处启动下载,文件额下载和运行都不会阻塞其他页面处理过程。即使在head里(除了用于下载文件的http链接)。

(3)The YUI3 approach

理念:用一个很小的初始代码,下载其余的功能代码,先引入文件:

<script type="text/javascript src=//img.jbzj.com/file_images/article/201306/yuanma/combo.js></script>

此种子文件大约10KB,

使用:

YUI().use("dom",function(Y){

Y.Dom.addclass(...)
})

当所有代码可用时,回调函数被调用,YUI实例作为参数传入,就可以立即使用新下载的功能。

The LazyLoad library

使用:先引入:lazyload-min.js

(4)

LazyLoad.js("a.js",function(){
Appliction.init();
})

多个文件:
LazyLoad.js(["a.js","b.js"],function(){
Application.init();
})

(5)The LABjs library

先引入:lab.js

$LAB.script("a.js").wait(function(){
Application.init();
})

多个文件,就链式写法

他的独特之处在于能够管理依赖关系。

可以通过wait()函数指定哪些文件应该等待其他文件。

例如:b.js的代码保证不在a.js之前运行

$LAB.script("a.js").wait().script("b.js").wait(function(){
Application.init();
})

这样,虽然两个文件是并行下载的,却能保证a.js能在b.js之前执行
Javascript 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
Jun 27 Javascript
JSON为什么那样红为什么要用json(另有洞天)
Dec 26 Javascript
javascript学习(二)javascript常见问题总结
Jan 02 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
Jan 07 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
jQuery中[attribute]选择器用法实例
Dec 31 Javascript
JavaScript学习笔记之Cookie对象
Jan 22 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
vue-cli+webpack记事本项目创建
Apr 01 Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
Extjs4 类的定义和扩展实例
Jun 28 #Javascript
JavaScript和CSS通过expression实现Table居中显示
Jun 28 #Javascript
jquery异步跨域访问代码
Jun 28 #Javascript
基于SVG的web页面图形绘制API介绍及编程演示
Jun 28 #Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
Jun 28 #Javascript
jquery中通过父级查找进行定位示例
Jun 28 #Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 #Javascript
You might like
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
python相对企业语言优势在哪
2020/06/12 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
初中物理教学反思
2014/01/14 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
如何优化vue打包文件过大
2022/04/13 Vue.js
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis