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)的时候才开始解析。
本文详细比较了RequireJS和SeaJS两种JavaScript模块加载器之间的主要差异,包括它们所遵循的规范、API的不同以及模块加载和执行时机的区别。
1911

被折叠的 条评论
为什么被折叠?



