近一年来,国内外都十分热衷于异步加载的研究,为了加快页面的载入速度,无阻塞加载Javascript的方法和框架成为了前端开发的焦点和亮点之一。
国外的像基于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
2
3
|
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']});
|
上述代码声明了三个模块的依赖关系和模块的地址,并将它们加入到队列中去(仅仅是加入队列,并没有加载到页面中去)。
C.加载队列In(queue)
1
2
3
4
5
6
|
var demo=In('mod-b',function() {
//do something
},function() {
//do something
return false;
});
|
加载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
2
3
|
In.ready('mod-b',function() {
//do something
});
|
队列加载顺序:
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
2
3
4
5
6
7
8
9
10
|
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
}
});
|
————————-华丽的分割线————————-
In的魅力远远不止上述这些,它的可靠性也已经在几个大项目中得到了印证,除此之外,In也有智能的提示,比如如果用In()加载一个事先未声明的模块,就会提示你检查模块名。真心的希望有更多的前端朋友关注In,使用In,甚至投入到In的后续开发中来。
下图是In.js的英文版使用图册:
在哪下载?
In.js是一个开源的项目,你可以在下边的地址找到它的源代码或者下载它使用。
http://project.benben.cc/In
http://github.com/PaulGuo/In
关于作者
Author: Guokai (腾讯微博 / Twitter / Google+ / Blog)
Email/Gtalk: badkaikai@gmail.com
分享到:
相关推荐
`in.js` 的出现旨在提供一种简洁、高效的方式来组织和加载JavaScript模块。 ### 1. **按需加载** `in.js` 支持按需加载模块,这意味着只有在实际需要时才会加载相应的JavaScript或CSS资源,这有助于减少不必要的...
1. **模块化**:在JavaScript中,模块化是实现函数颗粒化的常用方式,可以使用`export`和`import`关键字来组织和导入功能。模块可以封装变量和函数,防止全局命名空间污染,同时允许代码按需加载,提高性能。 2. **...
下面将详细探讨这两个技术在"Spring mvc + ext 4mvc 颗粒模块化设计简单的CRUD"项目中的应用。 首先,让我们了解CRUD操作。CRUD代表创建(Create)、读取(Read)、更新(Update)和删除(Delete),这是任何数据...
1. **时间管理**:在JavaScript中,可以使用`Date对象`来获取当前时间,以及`setInterval()`或`setTimeout()`函数来定时执行特定任务,如每秒更新秒针的位置。开发者可能还使用了`requestAnimationFrame()`来平滑...
最后,为了便于复用和维护,这个源码可能会采用模块化的设计,例如使用ES6的class或者传统的JavaScript对象模式来封装动画逻辑。这样,其他开发者可以在他们的项目中轻松地引入和配置这个特效。 总的来说,这个...
10. **CSS-in-JS**:这是一种将CSS样式直接写入JavaScript文件中的现代实践,例如使用styled-components库,可以提供组件级别的样式隔离和更好的开发体验。 在`scd75.github.io`这个项目中,通过分析`scd75.github....
10. **代码组织**:项目的文件名为`purecss-francine-master`,可能暗示了项目是基于某个开源框架或模板,如PureCSS,以提供简洁、模块化的CSS布局。 总结来说,这个项目涉及了HTML和CSS的高级应用,包括滤镜效果、...
此外,Node.js为服务器端JavaScript提供了更广泛的文件系统操作功能。通过内置的fs模块,开发者可以方便地执行文件和目录的创建、删除、读取和写入等操作。例如,fs.readFile()和fs.writeFile()分别用于异步读取和...
机电设备管理系统可以分为九大功能模块:采购管理,台账管理,库存管理,故障管理,维修管理,系统管理,权限管理,资料管理,报废管理。其中采购管理又可以分为:采购申请,申请查询,申请审批,下单,合同签订,...
6. **前端开发流程**: 开发这样一个Webapp,通常会涉及到前端开发流程,包括使用ES6+语法、模块化工具(如Webpack)、状态管理(如Redux或Context API)、以及CSS预处理器(如Sass或Less)等。此外,测试和调试也是...
此外,Etch_A_Sketch的代码结构通常包括模块化设计,可能分为以下几个部分:初始化函数、事件处理函数、坐标转换函数、绘图函数等。这样的设计便于代码的维护和扩展,比如添加新的功能,如保存和加载作品,或与其他...