seaJS && requireJS

本文详细比较了RequireJS和SeaJS两种JavaScript模块加载器之间的主要差异,包括它们所遵循的规范、API的不同以及模块加载和执行时机的区别。

RequireJS与SeaJS比较

不同之处
两者的主要区别如下:


1)遵循的规范不同。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。CMD 推崇 as lazy as possible。

(

RequireJS 遵循的是 Modules/AMD 规范。

SeaJS 遵循的是 Mdoules/Wrappings 规范的 define 形式。

)

// CMD
define(function(require, exports, module) {
	var a = require('./a')
	a.doSomething()
	// ...
	var b = require('./b') // 依赖可以就近书写
	b.doSomething()
	// ... 
})


// AMD 默认推荐的是
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
	a.doSomething()
	// ...
	b.doSomething()
	...
}) 

2) factory 的执行时机不同

在 RequireJS 里,模块有多种书写格式,推荐的是:

define(["./a", "./b"], function(a, b) {
    a.doSomething();
    b.doSomething();
});

在 SeaJS 里,模块只有一种书写格式:
define(function(require, exports, module) {
     require("./a").doSomething();
     require("./b").doSomething();
});

SeaJS 的模块书写格式,RequireJS 也支持。我们称呼 define 方法中的 function 参数为模块的 factory。  无论是在 RequireJS 还是 SeaJS 里,在执行 factory 之前,都会确保依赖的模块已经加载好。

/* c.js */
define(['./a', './b'], factory);

每个模块都有自己的 factory. 在 AMD 的书写格式下,上面例子中,模块 c 的 factory 在执行时,会接收 a 和 b 两个参数。这意味着,c 依赖的所有模块,都是在一开始就得执行好,即便有可能不需要执行,比如:

define(function(require) {
     // BEGIN
    if(some_condition) {
        require('./a').doSomething();
    } else {
       require('./b').soSomething();
    }
    // END
});
在 AMD 规范里,在 BEGIN 处,a 和 b 的 factory 都已经执行好。在 Wrappings 规范里,在 BEGIN 处,a 和 b 的 factory 还没未执行,在 END 处时,根据条件,只会执行其中一个。
可以看出,Wrappings 规范更“懒”,更节省 CPU. 更符合 nodejs 等环境下的使用习惯。


RequireJS的做法是并行加载所有依赖的模块, 并完成解析后, 再开始执行其他代码,SeaJS一样是并行加载所有依赖的模块, 但不会立即执行模块, 等到真正需要(require)的时候才开始解析。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值