一、遵循的规范不同
RequireJS 遵循的是 Modules/AMD 规范。
SeaJS 遵循的 Modules/Wrappings 规范是 CMD 规范。 区别:
1.对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从
2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
// CMD
define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此处略去 100 行 var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ... })
// AMD 默认推荐的是
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething() // 此处略去 100 行 b.doSomething() // ... })
3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。
二、factory 的执行时机不同
在 RequireJS 里,模块有多种书写格式,推荐的是:
define(["./a", "./b"], function(a, b) {
a.doSomething(); b.doSomething();
每个模块都有自己的 factory. 在 AMD 的书写格式下,上面例子中,模块 c 的 factory 在执行时,会接收 a 和 b 两个参数。这意味着,c 依赖的所有模块,都是在一开始就得执行好,即便有可能不需要执行
}); 在 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 之前,都会确保依赖的模块已经下载好:
/* a.js */
define(factory); /* b.js */
define(factory); /* c.js */
define(['./a', './b'], factory);
require(‘a’) — gets exports of module a 获取模块的输出
require(['a']) — fetch module a according to module name scheme根据模块名称a获取模块
require(['a.js']) — fetch a.js directly relative to current page获取a.js直接关联到当前页面