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 相关文章推荐
Prototype PeriodicalExecuter对象 学习
Jul 19 Javascript
利用js实现选项卡的特别效果的实例
Mar 03 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
bootstrap table配置参数例子
Jan 05 Javascript
Javascript中弹窗confirm与prompt的区别
Oct 26 Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 Javascript
微信小程序封装分享与分销功能过程解析
Aug 13 Javascript
小程序实现图片预览裁剪插件
Nov 22 Javascript
Vue表单控件数据绑定方法详解
Feb 05 Javascript
JS实现联想、自动补齐国家或地区名称的功能
Jul 07 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 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
论坛头像随机变换代码
2006/10/09 PHP
php 特殊字符处理函数
2008/09/05 PHP
apache php模块整合操作指南
2012/11/16 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
谈谈python垃圾回收机制
2020/09/27 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
七年级数学教学反思
2014/01/22 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
委托书怎样写
2014/08/30 职场文书
《学会看病》教学反思
2016/02/17 职场文书
辞职申请书范本
2019/05/20 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
如何使用pdb进行Python调试
2021/06/30 Python