CMD

CMD 模塊定義規(guī)范

在?Sea.js?中狭归,所有?JavaScript?模塊都遵循?CMD(Common?Module?Definition)?模塊定義規(guī)范。該規(guī)范明確了模塊的基本書寫格式和基本交互規(guī)則如贷。

在?CMD?規(guī)范中,一個(gè)模塊就是一個(gè)文件。代碼的書寫格式如下:

define(factory);

defineFunction

define是一個(gè)全局函數(shù)谣拣,用來定義模塊募寨。

definedefine(factory)

define接受factory參數(shù),factory可以是一個(gè)函數(shù)森缠,也可以是一個(gè)對(duì)象或字符串拔鹰。

factory為對(duì)象、字符串時(shí)贵涵,表示模塊的接口就是該對(duì)象列肢、字符串。比如可以如下定義一個(gè)?JSON?數(shù)據(jù)模塊:

define({"foo":"bar"});

也可以通過字符串定義模板模塊:

define('I?am?a?template.?My?name?is?{{name}}.');

factory為函數(shù)時(shí)宾茂,表示是模塊的構(gòu)造方法瓷马。執(zhí)行該構(gòu)造方法,可以得到模塊向外提供的接口跨晴。factory方法在執(zhí)行時(shí)欧聘,默認(rèn)會(huì)傳入三個(gè)參數(shù):require、exports和module:

define(function(require,exports,module)?{

//?模塊代碼

});

definedefine(id?,?deps?,?factory)

define也可以接受兩個(gè)以上參數(shù)坟奥。字符串id表示模塊標(biāo)識(shí)树瞭,數(shù)組deps是模塊依賴。比如:

define('hello',?['jquery'],function(require,exports,module)?{

//?模塊代碼

});

id和deps參數(shù)可以省略爱谁。省略時(shí)晒喷,可以通過構(gòu)建工具自動(dòng)生成。

注意:帶id和deps參數(shù)的define用法不屬于?CMD?規(guī)范访敌,而屬于Modules/Transport規(guī)范凉敲。

define.cmdObject

一個(gè)空對(duì)象,可用來判定當(dāng)前頁面是否有?CMD?模塊加載器:

if(typeofdefine==="function"&&define.cmd)?{

//?有?Sea.js?等?CMD?模塊加載器存在

}

requireFunction

require是factory函數(shù)的第一個(gè)參數(shù)寺旺。

requirerequire(id)

require是一個(gè)方法爷抓,接受模塊標(biāo)識(shí)作為唯一參數(shù),用來獲取其他模塊提供的接口阻塑。

define(function(require,exports)?{

//?獲取模塊?a?的接口

vara=require('./a');

//?調(diào)用模塊?a?的方法

a.doSomething();

});

注意:在開發(fā)時(shí)蓝撇,require的書寫需要遵循一些簡(jiǎn)單約定

require.asyncrequire.async(id,?callback?)

require.async方法用來在模塊內(nèi)部異步加載模塊陈莽,并在加載完成后執(zhí)行指定回調(diào)渤昌。callback參數(shù)可選。

define(function(require,exports,module)?{

//?異步加載一個(gè)模塊走搁,在加載完成時(shí)独柑,執(zhí)行回調(diào)

require.async('./b',function(b)?{

b.doSomething();

});

//?異步加載多個(gè)模塊,在加載完成時(shí)私植,執(zhí)行回調(diào)

require.async(['./c','./d'],function(c,?d)?{

c.doSomething();

d.doSomething();

});

});

注意:require是同步往下執(zhí)行忌栅,require.async則是異步回調(diào)執(zhí)行。require.async一般用來加載可延遲異步加載的模塊曲稼。

require.resolverequire.resolve(id)

使用模塊系統(tǒng)內(nèi)部的路徑解析機(jī)制來解析并返回模塊路徑索绪。該函數(shù)不會(huì)加載模塊湖员,只返回解析后的絕對(duì)路徑。

define(function(require,exports)?{

console.log(require.resolve('./b'));

//?==>?http://example.com/path/to/b.js

});

這可以用來獲取模塊路徑者春,一般用在插件環(huán)境或需動(dòng)態(tài)拼接模塊路徑的場(chǎng)景下破衔。

exportsObject

exports是一個(gè)對(duì)象,用來向外提供模塊接口钱烟。

define(function(require,exports)?{

//?對(duì)外提供?foo?屬性

exports.foo='bar';

//?對(duì)外提供?doSomething?方法

exports.doSomething=function()?{};

});

除了給exports對(duì)象增加成員晰筛,還可以使用return直接向外提供接口。

define(function(require)?{

//?通過?return?直接提供接口

return{

foo:'bar',

doSomething:function()?{}

};

});

如果return語句是模塊中的唯一代碼拴袭,還可簡(jiǎn)化為:

define({

foo:'bar',

doSomething:function()?{}

});

上面這種格式特別適合定義?JSONP?模塊读第。

特別注意:下面這種寫法是錯(cuò)誤的!

define(function(require,exports)?{

//?錯(cuò)誤用法S悼獭怜瞒!!

exports={

foo:'bar',

doSomething:function()?{}

};

});

正確的寫法是用return或者給module.exports賦值:

define(function(require,exports,module)?{

//?正確寫法

module.exports={

foo:'bar',

doSomething:function()?{}

};

});

提示:exports僅僅是module.exports的一個(gè)引用。在factory內(nèi)部給exports重新賦值時(shí)般哼,并不會(huì)改變module.exports的值吴汪。因此給exports賦值是無效的,不能用來更改模塊接口蒸眠。

moduleObject

module是一個(gè)對(duì)象漾橙,上面存儲(chǔ)了與當(dāng)前模塊相關(guān)聯(lián)的一些屬性和方法。

module.idString

模塊的唯一標(biāo)識(shí)楞卡。

define('id',?[],function(require,exports,module)?{

//?模塊代碼

});

上面代碼中霜运,define的第一個(gè)參數(shù)就是模塊標(biāo)識(shí)。

module.uriString

根據(jù)模塊系統(tǒng)的路徑解析規(guī)則得到的模塊絕對(duì)路徑蒋腮。

define(function(require,exports,module)?{

console.log(module.uri);

//?==>?http://example.com/path/to/this/file.js

});

一般情況下(沒有在define中手寫id參數(shù)時(shí))淘捡,module.id的值就是module.uri,兩者完全相同池摧。

module.dependenciesArray

dependencies是一個(gè)數(shù)組焦除,表示當(dāng)前模塊的依賴。

module.exportsObject

當(dāng)前模塊對(duì)外提供的接口作彤。

傳給factory構(gòu)造方法的exports參數(shù)是module.exports對(duì)象的一個(gè)引用膘魄。只通過exports參數(shù)來提供接口,有時(shí)無法滿足開發(fā)者的所有需求宦棺。?比如當(dāng)模塊的接口是某個(gè)類的實(shí)例時(shí),需要通過module.exports來實(shí)現(xiàn):

define(function(require,exports,module)?{

//?exports?是?module.exports?的一個(gè)引用

console.log(module.exports===exports);//?true

//?重新給?module.exports?賦值

module.exports=newSomeClass();

//?exports?不再等于?module.exports

console.log(module.exports===exports);//?false

});

注意:對(duì)module.exports的賦值需要同步執(zhí)行黔帕,不能放在回調(diào)函數(shù)里代咸。下面這樣是不行的:

//?x.jsdefine(function(require,exports,module)?{

//?錯(cuò)誤用法

setTimeout(function()?{

module.exports={?a:"hello"};

},0);

});

在?y.js?里有調(diào)用到上面的?x.js:

//?y.jsdefine(function(require,exports,module)?{

varx=require('./x');

//?無法立刻得到模塊?x?的屬性?a

console.log(x.a);//?undefined

});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市成黄,隨后出現(xiàn)的幾起案子呐芥,更是在濱河造成了極大的恐慌逻杖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件思瘟,死亡現(xiàn)場(chǎng)離奇詭異荸百,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滨攻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門够话,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人光绕,你說我怎么就攤上這事女嘲。” “怎么了诞帐?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵欣尼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我停蕉,道長(zhǎng)愕鼓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任慧起,我火速辦了婚禮菇晃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘完慧。我一直安慰自己谋旦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布屈尼。 她就那樣靜靜地躺著册着,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脾歧。 梳的紋絲不亂的頭發(fā)上甲捏,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音鞭执,去河邊找鬼司顿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兄纺,可吹牛的內(nèi)容都是我干的大溜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼估脆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼钦奋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤付材,失蹤者是張志新(化名)和其女友劉穎朦拖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厌衔,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璧帝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了富寿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睬隶。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖作喘,靈堂內(nèi)的尸體忽然破棺而出理疙,到底是詐尸還是另有隱情,我是刑警寧澤泞坦,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布窖贤,位于F島的核電站,受9級(jí)特大地震影響贰锁,放射性物質(zhì)發(fā)生泄漏赃梧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一豌熄、第九天 我趴在偏房一處隱蔽的房頂上張望授嘀。 院中可真熱鬧,春花似錦锣险、人聲如沸蹄皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巷折。三九已至,卻和暖如春崖咨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背击蹲。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工署拟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歌豺。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓推穷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親类咧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馒铃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容