热门关键字:

LABjs

1006
作者:管理员
发布时间:2015/6/3 22:47:41
评论数:0
转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=617

LABjs

1、什么是LABjs

LABjs的核心是 LAB(Loading and Blocking):Loading 指异步并行加载,Blocking是指同步等待执行。
LABjs通过优雅的语法(script 和 wait)实现了这两大特性,核心价值是性能优化。
LABjs是一个javascript文件加载器。

2、LABjs的使用
<script src="LAB.js"></script>
<script type="text/javascript">
  $LAB
  .script("script1.js").wait()
  .script("script2.js")
  .wait(function(){
    initScript1();
    initScript2();
  })
  .script("script3.js")
  .wait(function(){
    initScript3();
  });
</script>

说明:
首先,$LAB对象替代了<script>标签,然后.script()方法表示加载Javascript文件,不带参数的.wait()方法表示立即运行刚才加载的Javascript文件,带参数的.wait()方法也是立即运行刚才加载的Javascript文件,但是还运行参数中指定的函数。

这里需要注意的是,可以同时运行多条$LAB链,但是它们之间是完全独立的,不存在次序关系。

如果你要确保一个Javascript文件在另一个文件之后运行,你只能把它们写在同一个链操作之中。

只有当某些脚本是完全无关的时候,你才应该考虑把它们分成不同的$LAB链,表示它们之间不存在相关关系。


3、LABjs的加载方式
LABjs里的动态加载脚本文件,是指页面的js脚本执行时,通过多种方法去加载外部的js(主要区别于html页面里,通过<script>标签静态加载的脚本),动态加载脚本的方式有很多,优缺点不一,此处不赘述,有兴趣的童鞋可以参见本文末尾的参考链接)。

LABjs里主要使用了三种技巧,分别为Script Element、XHR Injection以及Cache Trick,首先对这三种加载方式进行简单介绍,第四部分再分析LABjs源码实现里面对着三种方式分别的使用场景

Script Element(LABjs默认采用加载方式)
最常见的脚本动态加载方式,优点很多,包括:1、实现简单 2、可跨域 3、不会阻塞其他资源的加载等,Opera/Firefox(老版本)下脚本执行的顺序与节点被插入页面的顺序一致,IE/Safari/Chrome下执行顺序无法得到保证。
注意:
新版本的Firefox下,脚本执行的顺序与插入页面的顺序不一定一致,但可通过将script标签的async属性设置为false来保证顺序执行
老版本的Chrome下,脚本执行的顺序与插入页面的顺序不一定一致,但可通过将script标签的async属性设置为false来保证顺序执行 

XHR Injection
通过ajax请求加载脚本文件,然后再通过以下方式执行:
eval:常见方式
XHR injection:创建一个script元素,并将请加载的脚本文件的内容注入
主要限制:无法跨域 

Cache Trick(强依赖于浏览器的特性实现,不推荐使用)
当你将script元素的type属性设置为浏览器不认识的值,比如"text/cache"、"text/casper"、"text/hellworld"等,不同浏览器的行为如下:

IE/Safari/Chrome(老版本)里:脚本照常加载,但不会执行。

假设浏览器没有禁用缓存,加载后的脚本会被浏览器缓存起来,当需要用到的时候,只需要重新创建个script标签,将type设为正确的值,src指向之前请求的文件url即可(相当于从缓存里读文件)

Opera/Firefox:不加载

备注:
强依赖于浏览器的特性实现,有可能随着浏览器特性实现的改变而失效,不推荐使用
新版本的chrome浏览器,将script元素的type设置为非"text/javascript",不会再对脚本文件进行加载

4、LABjs脚本加载采用方案的判断
忽略技术细节,通过一段伪代码来描述LABjs里面的实现,大致为:
首先判断是否对请求的脚本进行预加载(是否进行预加载的判断条件看伪代码注释);
如进行预加载,再判断浏览器是否支持真正的预加载;如支持真正的预加载,则预加载之;如否,判断请求的脚本是否跟当前页面同域,如实,采用XHR Injection,如否,采用Cache Trick;

如不进行预加载,判断浏览器支不支持script元素的async属性(见伪代码注释),如是,设置async属性,并请求脚本文件;如否,直接通过script元素加载脚本文件;




如果您觉得本文的内容对您的学习有所帮助:支付鼓励



关键字:LABjs javascript Script Element XHR Injection Cache Trick
友荐云推荐