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 相关文章推荐
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
Oct 17 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 Javascript
几种响应式文字详解
May 19 Javascript
Vue.js 中的 $watch使用方法
May 25 Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
AngularJS 事件发布机制
Aug 28 Javascript
基于jquery实现九宫格拼图小游戏
Nov 30 jQuery
微信小程序indexOf的替换方法(推荐)
Jan 14 Javascript
vue中实现动态生成二维码的方法
Feb 21 Javascript
vue绑定class的三种方法
Dec 24 Vue.js
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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
js 操作css实现代码
2009/06/11 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
node中间层实现文件上传功能
2018/06/11 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
python numpy库np.percentile用法说明
2020/06/08 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
Internet主要有哪些网络群组成
2015/12/24 面试题
大学生个人推荐信范文
2013/11/25 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
2014年妇女工作总结
2014/12/06 职场文书
员工评语范文
2014/12/31 职场文书
向女朋友道歉的话
2015/01/20 职场文书
写给领导的感谢信
2015/01/22 职场文书
教师年终个人总结
2015/02/11 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL