javaScript模塊化規範ADM與CMD

模塊化:模塊化是指在解決某一個複雜問題時,依照一種分類的思惟把問題進行系統性的分解處理,能夠想象一個巨大的系統代碼,被整合優化分割成邏輯性很強的模塊時,對於軟件是一種何等意義的存在。html

 

模塊化系統所必須的能力:git

一、定義封裝的模塊github

二、定義新模塊對其餘模塊的依賴ajax

三、可對其餘模塊的引入支持api

 

 

AMD模塊規範:其實就是異步模塊定義,全部的模塊將被異步加載,模塊加載不影響後面語句運行,全部依賴某些模塊的語句均放置在回調函數中。 數組

AMD規範定義了一個全局變量define函數,格式爲:define(id, dependencies, factory)瀏覽器

第一個參數:id爲字符串類型,表示模塊標識,爲可選參數,若是忽略這個參數,則模塊標識默認爲加載器中被請求的文件的URL爲模塊標識。若是須要填寫這個id,則最好是加載器中該模塊的URL(填寫id通常是爲了合併多個模塊減小網站中HTTP請求)dom

第二個參數:dependencies是一個數組,爲可選參數,裏面存放着當前模塊所依賴的其餘模塊標識.異步

第三個參數:factory是一個函數或者對象async

案例:建立模塊

define('./bsSave', ['./ajax', './lib/domApi'], function (ajax, domApi){

  var remArr = [];

  //模塊代碼

  return remArr;

})

 

//無依賴模塊能夠直接使用對象字面量來定義

define({

  add: function (x, y){return x + y;},

  age: 25,

  name: 'luke'

})

 

 

CMD模塊規範:在CMD中,一個模塊就是一個文件。全局函數define,用來定義一個模塊。格式爲:define(id, dependencies, factory);

第一個參數:id爲字符串類型,表示模塊標識,爲可選參數,若是忽略這個參數,則模塊標識默認爲加載器中被請求的文件的URL爲模塊標識。若是須要填寫這個id,則最好是加載器中該模塊的URL(填寫id通常是爲了合併多個模塊減小網站中HTTP請求)

第二個參數:dependencies是一個數組,爲可選參數,裏面存放着當前模塊所依賴的其餘模塊標識。

第三個參數:factory能夠是一個函數,也能夠爲對象或者字符串。當factory爲對象或者字符串時,表示模塊的接口就是該對象或者字符串。

案例:定義一個模塊

define('./BsSave', ['./ajax'], function (require, exports, module){

  var BsSave = {};

  //模塊代碼

  return BsSave

})

 

//定義JSON數據模塊

define({"name": "csh"})

 

//經過字符串定義模板模塊

define('this is {{data}}');

 

//factory爲函數的時候,表示模塊的構造方法,經過return能夠輸出該模塊的數據

define(function (){

  var modArr = [];

  //模塊代碼

  return modArr; //輸出該模塊的數據

})

 

當模塊的第三個參數是函數的時候,這個函數也有三個參數,分別是requireexportsmodule

require是一個方法,接受模塊標識做爲惟一的參數,用來引入其餘模塊,require方法是同步往下執行的,須要異步加載模塊可使用require.async方法,可使用require.resolve方法來返回模塊路徑

案例:加載模塊

define(function(require, exports, module){

  //同步加載模塊

  var ajax = require('./ajax');

 

  //異步加載模塊

  require.async('./ajax', function (ajax){

    ajax.get();

  })

 

  //返回模塊的路徑,但它不會加載模塊

  require.resolve('./ajax');

})

 

exports用來向外提供模塊接口,固然直接使用return也是能夠的

案例:爲模塊向外提供接口

define(function(require, exports, module){

  exports.name = 'csh';          //向外提供的屬性

  exports.do = function (){};     //向外提供的方法

 

  //這樣也能夠向外提供接口

  return {

    name: 'csh',

    do: function (){}

  }

 

  //這樣也能夠向外提供接口

  module.exports = {

    name: 'csh',

    do: function (){}

  }

 

  //注意,如下方式是錯誤的

  exports = {

    name: 'csh',

    do: function (){}

  }

})

 

module爲一個對象,上面存儲了一些與當前模塊相關聯的屬性與方法

module.id爲模塊的惟一標識。

module.uri根據模塊系統的路徑解析規則獲得模塊的絕對路徑。

module.dependencies表示模塊的依賴。

module.exports當前模塊對外提供的接口。

 

 

下面是玉伯對於 AMD 與 CMD 區別的解釋(詳細的區別可對照上文)

AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出。

CMD 是 SeaJS 在推廣過程當中對模塊定義的規範化產出。

相似的還有 CommonJS Modules/2.0 規範,是 BravoJS 在推廣過程當中對模塊定義的規範化產出還有很多

這些規範的目的都是爲了 JavaScript 的模塊化開發,特別是在瀏覽器端的。

目前這些規範的實現都能達成瀏覽器端模塊化開發的目的。

 

擴展閱讀:

AMD規範文檔 https://github.com/amdjs/amdjs-api/wiki/AMD

RequireJS官網接口文檔  http://www.requirejs.org/docs/api.html 

CMD 模塊定義規範 https://github.com/seajs/seajs/issues/242

SeaJS API快速參考 https://github.com/seajs/seajs/issues/266

知乎  AMD 和 CMD 的區別有哪些? http://www.zhihu.com/question/20351507 

相關文章
相關標籤/搜索