AMD 是 RequireJS 在推廣過程中對模塊定義的規范化產出。
CMD 是 SeaJS 在推廣過程中對模塊定義的規范化產出。
對於依賴的模塊,AMD 是提前執行,CMD 是延遲執行。
不過 RequireJS 從 2.0 開始,也改成可以延遲執行(根據寫法不同,處理方式不同)。
CMD 推崇 as lazy as possible.
CMD 推崇依賴就近,AMD 推崇依賴前置。
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴可以就近書寫
b.doSomething()
// ...
})
// AMD 默認推薦的是
require.config({
paths: {
'jquery': '../vendor/jquery-1.12.0.min',
'jquery-ui':'../assets/js/jquery-ui.min',
'd3': "../vendor/d3.v3",
// 'dagre-d3': "../vendor/dagre-d3",
'dagre-d3': "../assets/compress/dagre-d3.min",
'interact': "../vendor/interact.min",
'mousetrap': "../vendor/mousetrap.min",
'sinbad': '../sinbad/js/sinbad.min',
'bootstrap':'../assets/js/bootstrap',
'ace':'../assets/js/ace', //ace框架
//'aceCode':'../vendor/editor/ace', //ace代碼插件
'aceCode':'../assets/compress/ace-code.min',
'aceElements':'../assets/js/ace-elements',
'slimscroll':'../vendor/transparent-dark/lib/slimScroll/jquery.slimscroll.min', //light blue scroll插件
'modify':'../statics/flow/modify',
},
shim: {
'jquery-ui': {
deps: ['jquery']
},
'bootstrap': {
deps: ['jquery'],
exports: 'bootstrap'
},
'editor': {
deps: ['aceCode']
}
}
});
上面requirejs === require
///
require([
'd3',
'property',
'sinbad',
'editor',
'jquery-ui',
'bootstrap',
'modify',
'aceCode',
'link-rules',
], function (d3, property, sinbad,editor, scroll) {
console.log(1)
require('jquery-ui');
});
上面requirejs === require === define
shim,是依賴,{deps:"xxx"}
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
a.doSomething()
b.doSomething()
})
AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。
CMD 里,沒有全局 require,而是根據模塊系統的完備性,提供 seajs.use 來實現模塊系統的加載啟動。CMD 里,每個 API 都簡單純粹。
- 定位有差異。RequireJS 想成為瀏覽器端的模塊加載器,同時也想成為 Rhino / Node 等環境的模塊加載器。Sea.js 則專注於 Web 瀏覽器端,同時通過 Node 擴展的方式可以很方便跑在 Node 環境中。
- 遵循的規范不同。RequireJS 遵循 AMD(異步模塊定義)規范,Sea.js 遵循 CMD (通用模塊定義)規范。規范的不同,導致了兩者 API 不同。Sea.js 更貼近 CommonJS Modules/1.1 和 Node Modules 規范。
- 推廣理念有差異。RequireJS 在嘗試讓第三方類庫修改自身來支持 RequireJS,目前只有少數社區采納。Sea.js 不強推,采用自主封裝的方式來“海納百川”,目前已有較成熟的封裝策略。
- 對開發調試的支持有差異。Sea.js 非常關注代碼的開發調試,有 nocache、debug 等用於調試的插件。RequireJS 無這方面的明顯支持。
- 插件機制不同。RequireJS 采取的是在源碼中預留接口的形式,插件類型比較單一。Sea.js 采取的是通用事件機制,插件類型更豐富。
