用In.js颗粒化管理、加载你的Javascript模块

近一年来,国内外都十分热衷于异步加载的研究,为了加快页面的载入速度,无阻塞加载Javascript的方法和框架成为了Tian开发的焦点和亮点之一。

In.js Logo

国外的像基于jQuery的RequireJs,YUI Loader,LabJs,RunJs,国内也有淘宝的SeaJs,豆瓣的DoJs等,这些都是一些十分优秀的模块加载器。但是本文将会向大家介绍一个新的开源的轻量级“多线程”异步模块加载器In.js,In的开发借鉴了Do的一些思路和使用习惯,在此期间感谢@kejun同我的耐心交流,In.js压缩后只有4.77k,不仅小巧而且十分好用。

优点:

  • 按需加载
  • 无阻塞加载
  • 依赖关系管理
  • 颗粒化模块管理

如何使用?

A.引入In.js

[code=”html”]

[/code]

只需要在页面顶部引入in.js即可,这里有两个参数需要注意:

autoload: 是否在加载in.js的时候加载底层核心库 – {可选参数 – true|false}
core: 底层核心库的路径 – {可选参数 – url}

如果同时设置了core,并且autoload=true,则在引入In.js的同时加载core到页面中。

B.声明各个模块的地址和依赖关系In.add(name,{config})

[code=”javascript”]
In.add(‘mod-a’,{path:’mods/a.js’,type:’js’,charset:’utf-8′});
In.add(‘mod-b’,{path:’mods/b.js’,type:’js’,charset:’utf-8′,rely:[‘mod-b-css’]});
In.add(‘mod-b-css’,{path:’mods/b.css’,type:’css’,charset:’utf-8′,rely:[‘mod-a’]});
[/code]

上述代码声明了三个模块的依赖关系和模块的地址,并将它们加入到队列中去(仅仅是加入队列,并没有加载到页面中去)。

C.加载队列In(queue)

[code=”javascript”]
var demo=In(‘mod-b’,function() {
//do something
},function() {
//do something
return false;
});
[/code]

加载mod-b模块,加载完后执行functionA和functionB,在此假设引入in.js时设置了autoload=true,那么队列中的加载顺序依次为:
[code=”html”]
jquery.min.js >>> mod-a >>> mod-b-css >>> mod-b >>> functionA() >>> functionB()
[/code]

队列全部加载完成后,demo会被赋值为一个数组,其中存放的是每个function的返回值:
[code=”javascript”]
demo={returns:[undefined,false],complete:true}
[/code]

D.在domReady之后加载队列In.ready(queue)

[code=”javascript”]
In.ready(‘mod-b’,function() {
//do something
});
[/code]

队列加载顺序:
[code=”html”]
jquery.min.js >>> {domReady} >>> mod-a >>> mod-b-css >>> mod-b >>> function()
[/code]

In.ready()和In()的区别在于两点:

  1. In.ready()中的队列只有在domReady之后才会执行
  2. In.ready()没有返回值

E.监听变量变化,值改变则执行回调In.watch(object,property,function(prop,old,new) {})

由于In加载的队列均为异步非阻塞式加载,所以有时候为了特殊需求(比如后续的操作依赖队列中function的返回值),我们需要在确保队列执行完成后,再执行后续操作。这种情况下,可以用In.watch()监听return.complete变量,当return.complete==true的时候执行回调函数,代码如下:

[code=”javascript”]
var model=In(‘model’,function() {
//do something
return 123;
});
In.watch(model,’complete’,function(prop,old,new) {
if(model[prop]==true) {
console.log(model.returns[0]);//print 123
In.unwatch(model,prop);//destroy the watch event of model.complete
}
});
[/code]

————————-华丽的分割线————————-

In的魅力远远不止上述这些,它的可靠性也已经在几个大项目中得到了印证,除此之外,In也有智能的提示,比如如果用In()加载一个事先未声明的模块,就会提示你检查模块名。真心的希望有更多的Tian朋友关注In,使用In,甚至投入到In的后续开发中来。

下图是:

In.js Manual

在哪下载?

In.js是一个开源的项目,你可以在下边的地址找到它的源代码或者下载它使用。


关于作者

Author: Guokai ( / / / )
Email/Gtalk: [email protected]

赞(0) 打赏
未经允许不得转载:WEBTian开发 » 用In.js颗粒化管理、加载你的Javascript模块

评论 7

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-49

    如果不嫌麻烦的话, 宁可把js按加载条件写成一个主js与n个副js, 然后在主js中按照页面所需再异步加载副js, 甚至对某些(如页底广告)可以设置延时后加载.
    反正现在项目都是jQ当道, 一句if()$.getScript(…)搞定一切

    8年前 (2011-07-17)回复
    • @phoetry, 相信用加载器管理依赖关系,按需加载会对项目的扩展性和可维护性,甚至性能都大有裨益,这东西不依赖任何库,我们公司就用的mootools,模块的管理和加载完全由In完成.

      郭凯8年前 (2011-07-17)回复
  2. #-48

    受教了!

    小菜8年前 (2011-07-18)回复
  3. #-47

    弱弱的问句:能不能举几个实际的例子来说明呢?

    东城8年前 (2011-08-18)回复
    • @东城, Github项目里有demo页面,实际应用可以参见音悦台,泡蒜,和我的博客。:-)

      7年前 (2011-08-21)回复
  4. #-46

    作者有没有 和 LABjs 或者 ControlJS ,SeaJs 进行比较呢?in.js 确实是比较简单~~使用对之前的代码修改也比较小,我关心的还是性能上是不是能比LABjs 要好~~作者貌似只采用了添加script标签
    这篇文字对一些加载进行了解析https://oldj.net/article/labjs-study/

    xbl7年前 (2011-09-01)回复
  5. #-45

    貌似在FF,chrome下依赖关系存在问题

    yinc7年前 (2011-11-25)回复

Tian开发相关广告投放 更专业 更精准

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏