根據玉伯等人在知乎上的回答整理。整理中。。。javascript
AMD 規範在這裏:https://github.com/amdjs/amdjs-api/wiki/AMDcss
CMD 規範在這裏:https://github.com/seajs/seajs/issues/242java
要想將JavaScript提高到和其餘編程語言一個級別的編程體驗,包管理是一個必須之物。git
早期如labjs首先解決的是js文件加載管理的問題。github
LABjs 的核心是 LAB(Loading and Blocking):Loading 指異步並行加載,Blocking 是指同步等待執行。LABjs 經過優雅的語法(script 和 wait)實現了這兩大特性,核心價值是性能優化。LABjs 是一個文件加載器。編程
RequireJS 和 SeaJS 則是模塊加載器,倡導的是一種模塊化開發理念,核心價值是讓 JavaScript 的模塊化開發變得更簡單天然。api
模塊加載器通常可降級爲文件加載器用,所以使用 RequireJS 和 SeaJS,也能夠達成 LABjs 的性能優化目的。瀏覽器
AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出。性能優化
CMD 是 SeaJS 在推廣過程當中對模塊定義的規範化產出。服務器
相似的還有 CommonJS Modules/2.0 規範,是 BravoJS 在推廣過程當中對模塊定義的規範化產出。還有很多⋯⋯
這些規範的目的都是爲了 JavaScript 的模塊化開發,特別是在瀏覽器端的。目前這些規範的實現都能達成瀏覽器端模塊化開發的目的。通常來講,AMD擅長在瀏覽器端、CMD擅長在服務器端。
對於依賴的模塊,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 默認推薦的是 define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好 a.doSomething() // 此處略去 100 行 b.doSomething() ... })
雖然 AMD 也支持 CMD 的寫法,同時還支持將 require 做爲依賴項傳遞,但 RequireJS 的做者默認是最喜歡上面的寫法,也是官方文檔裏默認的模塊定義寫法。
AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。好比 AMD 裏,require 分全局 require 和局部 require,都叫 require。CMD 裏,沒有全局 require,而是根據模塊系統的完備性,提供 seajs.use 來實現模塊系統的加載啓動。CMD 裏,每一個 API 都簡單純粹。
還有一些細節差別,具體看這個規範的定義就好,就很少說了。
另外,SeaJS 和 RequireJS 的差別,能夠參考:https://github.com/seajs/seajs/issues/277
RequireJS 和 SeaJS 都是很不錯的模塊加載器,二者區別以下:
二者定位有差別。RequireJS 想成爲瀏覽器端的模塊加載器,同時也想成爲 Rhino / Node 等環境的模塊加載器。SeaJS 則專一於 Web 瀏覽器端,同時經過 Node 擴展的方式能夠很方便跑在 Node 服務器端
二者遵循的標準有差別。RequireJS 遵循的是 AMD(異步模塊定義)規範,SeaJS 遵循的是 CMD (通用模塊定義)規範。規範的不一樣,致使了二者 API 的不一樣。SeaJS 更簡潔優雅,更貼近 CommonJS Modules/1.1 和 Node Modules 規範。
二者社區理念有差別。RequireJS 在嘗試讓第三方類庫修改自身來支持 RequireJS,目前只有少數社區採納。SeaJS 不強推,而採用自主封裝的方式來「海納百川」,目前已有較成熟的封裝策略。
二者代碼質量有差別。RequireJS 是沒有明顯的 bug,SeaJS 是明顯沒有 bug。
二者對調試等的支持有差別。SeaJS 經過插件,能夠實現 Fiddler 中自動映射的功能,還能夠實現自動 combo 等功能,很是方便便捷。RequireJS 無這方面的支持。
二者的插件機制有差別。RequireJS 採起的是在源碼中預留接口的形式,源碼中留有爲插件而寫的代碼。SeaJS 採起的插件機制則與 Node 的方式一致:開放自身,讓插件開發者可直接訪問或修改,從而很是靈活,能夠實現各類類型的插件。
還有很多細節差別就很少說了。
總之,SeaJS 從 API 到實現,都比 RequireJS 更簡潔優雅。若是說 RequireJS 是 Prototype 類庫的話,則 SeaJS 是 jQuery 類庫。
用了5年多的RequireJs,和一段時間的SeaJs,補充一下區別吧,
一、對於第3點,其實,RequireJS早有了Shim等支持,不須要修改第三方類庫就能夠徹底支持.如Ember,JQuery等引用,都直接能夠異步加載爲一個模塊.
二、對於調試的支持,RequireJS2.1版本也支持了.
三、RequireJs的打包功能很強大,很適合在CI下作各類配置下的打包發佈,很是靈活方便,SeaJs這方面略力不從心.
四、對於模塊的語法,RequireJs比較靈活,支持相似於SeaJs的語法
五、整體來講兩個框架都很不錯.SeaJs借鑑了前人框架的不少優勢,發展勢頭不錯.
RequireJs支持更全面一些,如Txt等文本文件的依賴,多版本的Js依賴,多語言支持,打包比SeaJs要簡單些,在Jenkins等CI環境中,不受系統環境的限制.文檔和範例比SeaJs全多了.缺點是:官方更新比較快,有好屢次新版本都有些不兼容,若是你英文比較吃力,看文檔可能就比較痛苦了.
SeaJs很簡潔,不少功能也在慢慢完善,但底層細節暴露比較多,文檔須要再補充些.但願在之後能再接再礪,加以改進.
就我我的使用來看,requirejs上手就比seajs容易的多。
1.seajs打包spm實在是太難了,這跟r.js比起來簡直不是一個檔次。
2.requirejs支持css @import依賴的打包,對於不喜歡使用less的童鞋,就方便多了。
3.對於非AMD規範的js插件,require js提供了shim支持,很是方便。
4.requirejs目前支持了sourcemap,配合grunt,簡直爽爆了。
出於從上手和配置上的方便性來看,我最終拋棄了seajs。