天天看點

AMD規範與CMD規範的差別是什麼?

在比較之前,我們得先來了解下什麼是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函數了。

   })

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

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

 require.resolve(id)

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

exports

 或者如下書寫:

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

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

module

  什麼是amd規範?

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

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

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

還可以這樣書寫:

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

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

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

 cmd規範與amd規範的差別如下:

 1. cmd依賴就近:比如如下代碼

   代碼在運作時,首先是不知道依賴的,需要周遊所有的require關鍵字,找出後面的依賴。具體做法是将function tostring後,用正則比對出require關鍵字後面的依賴。

   而amd依賴前置:如下代碼:

AMD規範與CMD規範的差別是什麼?
AMD規範與CMD規範的差別是什麼?

代碼在一旦運作到此處,能立即知曉依賴。而無需周遊整個函數體找到它的依賴,是以性能有所提升,缺點就是開發者必須顯式得指明依賴——這會使得開發工作量變大,比如:當依賴項有n個時候 那麼寫起來比較煩 且容易出錯。不過 requirejs 從 2.0 開始,也改成可以延遲執行(根據寫法不同,處理方式不同)。

2. 執行順序上:

  cmd是延遲執行的,而amd是提前執行的。

3. api設計角度:

  amd 的 api 預設是一個當多個用,cmd 的 api 嚴格區分,推崇職責單一。比如 amd 裡,require 分全局 require 和局部 require,都叫 require。cmd 裡,沒有全局 require,而是根據子產品系統的完備性,提供 seajs.use 來實作子產品系統的加載啟動。cmd

裡,每個 api 都簡單純粹。

下一篇: Git使用教程

繼續閱讀