CommonJs,AMD,CMD區(qū)別
CommonJs
CommonJs是服務(wù)器端模塊的規(guī)范,Node.js采用了這個(gè)規(guī)范。
根據(jù)CommonJS規(guī)范,一個(gè)單獨(dú)的文件就是一個(gè)模塊。加載模塊使用require方法,該方法讀取一個(gè)文件并執(zhí)行,最后返回文件內(nèi)部的exports對(duì)象。 例如:
// foobar.js//私有變量vartest =123;//公有方法functionfoobar(){this.foo =function(){// do someing ...}this.bar =function(){//do someing ...} }//exports對(duì)象上的方法和變量是公有的varfoobar =newfoobar(); exports.foobar = foobar;//require方法默認(rèn)讀取js文件,所以可以省略js后綴vartest =require('./boobar').foobar; test.bar();
CommonJS 加載模塊是同步的,所以只有加載完成才能執(zhí)行后面的操作。像Node.js主要用于服務(wù)器的編程,加載的模塊文件一般都已經(jīng)存在本地硬盤,所以加載起來(lái)比較快,不用考慮異步加載的方式,所以CommonJS規(guī)范比較適用。但如果是瀏覽器環(huán)境,要從服務(wù)器加載模塊,這是就必須采用異步模式。所以就有了 AMD CMD 解決方案。
AMD(Asynchromous Module Definition)
AMD是requireJs在推廣過(guò)程中對(duì)模塊定義的規(guī)范產(chǎn)出。AMD規(guī)范適用define方法定義模塊。
AMD異步加載模塊。它的模塊支持對(duì)象 函數(shù) 構(gòu)造器 字符串 JSON等各種類型的模塊。例如:
//通過(guò)數(shù)組引入依賴 ,回調(diào)函數(shù)通過(guò)形參傳入依賴define(['someModule1', ‘someModule2’],function(someModule1, someModule2){functionfoo(){/// someingsomeModule1.test(); }return{foo: foo} });//AMD規(guī)范允許輸出模塊兼容CommonJS規(guī)范,這時(shí)define方法如下:define(function(require, exports, module){varreqModule =require("./someModule"); requModule.test(); exports.asplode =function(){//someing} });
CMD
CMD是SeaJS 在推廣過(guò)程中對(duì)模塊定義的規(guī)范化產(chǎn)出
CMD和AMD的區(qū)別有以下幾點(diǎn):
對(duì)于依賴的模塊AMD是提前執(zhí)行,CMD是延遲執(zhí)行。不過(guò)RequireJS從2.0開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不通過(guò))。
CMD推崇依賴就近,AMD推崇依賴前置。
//AMDdefine(['./a','./b'],function(a, b){//依賴一開始就寫好a.test(); b.test(); });//CMDdefine(function(requie, exports, module){//依賴可以就近書寫vara =require('./a'); a.test(); ...//軟依賴if(status) {varb = requie('./b'); b.test(); } });
雖然AMD也支持CMD寫法,但依賴前置是官方文檔的默認(rèn)模塊定義寫法。
AMD的api默認(rèn)是一個(gè)當(dāng)多個(gè)用,CMD嚴(yán)格的區(qū)分推崇職責(zé)單一。
例如:AMD里require分全局的和局部的。CMD里面沒(méi)有全局的 require,提供 seajs.use()來(lái)實(shí)現(xiàn)模塊系統(tǒng)的加載啟動(dòng)。CMD里每個(gè)API都簡(jiǎn)單純粹。
評(píng)論
查看更多