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

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

 

[[37962]]

 

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

优点:

◆ 按需加载

◆ 无阻塞加载

◆ 依赖关系管理

◆ 颗粒化模块管理

如何使用?

A.引入In.js

  1. <script type="text/javascript" src="in.js" autoload="true" core="jquery.min.js"></script> 

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

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

core: 底层核心库的路径 – {可选参数 – url}

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

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

  1. In.add('mod-a',{path:'mods/a.js',type:'js',charset:'utf-8'});  
  2. In.add('mod-b',{path:'mods/b.js',type:'js',charset:'utf-8',rely:['mod-b-css']});  
  3. In.add('mod-b-css',{path:'mods/b.css',type:'css',charset:'utf-8',rely:['mod-a']}); 

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

C.加载队列In(queue)

  1. var demo=In('mod-b',function() {  
  2.     //do something  
  3. },function() {  
  4.     //do something  
  5.     return false;  
  6. }); 

加载mod-b模块,加载完后执行functionA和functionB,在此假设引入in.js时设置了autoload=true,那么队列中的加载顺序依次为:

  1. jquery.min.js >>> mod-a >>> mod-b-css >>> mod-b >>> functionA() >>> functionB() 

队列全部加载完成后,demo会被赋值为一个数组,其中存放的是每个function的返回值:

  1. demo={returns:[undefined,false],complete:true

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

  1. In.ready('mod-b',function() {  
  2.     //do something  
  3. }); 

队列加载顺序:

  1. jquery.min.js >>> {domReady} >>> mod-a >>> mod-b-css >>> mod-b >>> function() 

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

◆ In.ready()中的队列只有在domReady之后才会执行

◆ In.ready()没有返回值

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

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

  1. var model=In('model',function() {  
  2.     //do something  
  3.     return 123;  
  4. });  
  5. In.watch(model,'complete',function(prop,old,new) {  
  6.     if(model[prop]==true) {  
  7.         console.log(model.returns[0]);//print 123  
  8.         In.unwatch(model,prop);//destroy the watch event of model.complete  
  9.     }  
  10. }); 

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

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

下图是In.js的英文版使用图册:

 

In.js Manual

 

在哪下载?

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

http://project.benben.cc/In

http://github.com/PaulGuo/In

原文:http://www.qianduan.net/particles-with-in-js-management-load-your-javascript-module.html

【编辑推荐】

  1. 使用Jscex改善JavaScript异步编程体验
  2. 使用node.js进行服务器端JavaScript编程
  3. JavaScript实现页面滚动图片加载
  4. 10个对JavaScript开发者超级有用的工具
  5. 5个有趣的JavaScript代码片段分享
责任编辑:陈贻新 来源: 前端观察
相关推荐

2016-10-09 11:03:41

Javascript模块化Web

2019-08-28 16:18:39

JavaScriptJS前端

2013-08-20 18:39:34

JavaScript模requireJS

2015-11-02 19:11:27

阮一峰javascript循环加载

2020-12-30 11:22:11

Node.js前端模块

2012-11-08 10:21:41

JSrequireJavaScript

2012-03-12 09:33:04

JavaScript

2020-08-31 15:00:17

Node.jsrequire前端

2011-09-08 14:07:28

Node.js

2011-12-09 11:16:48

Node.js

2021-09-16 05:32:31

No.js 模块加载器module1.js

2015-11-23 09:50:15

JavaScript模块化SeaJs

2012-11-08 09:45:44

JavaScriptrequireJS

2020-05-12 08:39:50

JavaScript工具技术

2011-02-21 12:52:00

JavaScript

2022-02-04 21:33:34

Ajaxjs网站

2022-11-16 08:43:30

Node.js模块

2017-04-10 14:23:01

typescriptjavascriptwebpack

2021-11-22 22:14:46

JavaScript开发模块

2020-04-08 08:35:20

JavaScript模块函数
点赞
收藏

51CTO技术栈公众号