在比較之前,我們得先來了解下什麼是amd規範?什麼是cmd規範?當然先申明一下,我個人也是總結下而已,也是網上看到的資料,自己總結下或者可以說整理下而已,供大家更深入的了解!因為我們都知道 amd規範:是 requirejs
在推廣過程中對子產品定義的規範化産出的,而cmd規範:是seajs 在推廣過程中對子產品定義的規範化産出的。
什麼是cmd規範?
在cmd中 一個子產品就是一個檔案,如下代碼所示:
define(function(require, exports) {
exports.a = function(){
// 很多代碼
};
});
那麼現在我想在b.js裡面調用a.js裡面的a方法。我們可以如下做:
define(function(require,exports){
var fun = require('./a');
console.log(fun.a()); // 就可以調用到及執行a函數了。
})


注意: require是同步往下執行的,而require.async 則是異步回調執行。
require.resolve(id)


exports
或者如下書寫:


那麼如果我在b.js裡面想要調用a.js裡面的a方法,由于a.js使用exports對外提供了接口a方法,那麼在b.js裡面 我們隻需要先這樣 var fun = require('./a');然後執行fun.a();就可以執行a方法了。
module
什麼是amd規範?


這裡的require函數讓你能夠随時去依賴一個子產品,即取得子產品的引用,進而即使子產品沒有作為參數定義,也能夠被使用;exports是定義的 alpha 子產品的實體,在其上定義的任何屬性和方法也就是alpha子產品的屬性和方法。通過exports.verb = ...就是為alpha子產品定義了一個verb方法。例子中是簡單調用了子產品beta的verb方法。


還可以這樣書寫:


另一方面,require 則主要用來在頂層 javascript 檔案中或須要動态讀取依賴時加載代碼。用法的一個執行個體如下:




cmd規範與amd規範的差別如下:
1. cmd依賴就近:比如如下代碼
代碼在運作時,首先是不知道依賴的,需要周遊所有的require關鍵字,找出後面的依賴。具體做法是将function tostring後,用正則比對出require關鍵字後面的依賴。
而amd依賴前置:如下代碼:


代碼在一旦運作到此處,能立即知曉依賴。而無需周遊整個函數體找到它的依賴,是以性能有所提升,缺點就是開發者必須顯式得指明依賴——這會使得開發工作量變大,比如:當依賴項有n個時候 那麼寫起來比較煩 且容易出錯。不過 requirejs 從 2.0 開始,也改成可以延遲執行(根據寫法不同,處理方式不同)。
2. 執行順序上:
cmd是延遲執行的,而amd是提前執行的。
3. api設計角度:
amd 的 api 預設是一個當多個用,cmd 的 api 嚴格區分,推崇職責單一。比如 amd 裡,require 分全局 require 和局部 require,都叫 require。cmd 裡,沒有全局 require,而是根據子產品系統的完備性,提供 seajs.use 來實作子產品系統的加載啟動。cmd
裡,每個 api 都簡單純粹。