在兼容CommonJS的系統(tǒng)中,你可以使用JavaScript開發(fā)以下程序:
(1).服務(wù)器端JavaScript應(yīng)用程序
(2).命令行工具
(3).圖形界面應(yīng)用程序
(4).混合應(yīng)用程序(如,Titanium或Adobe AIR)
JS模塊化進(jìn)程的起因
現(xiàn)今的很多網(wǎng)頁(yè)其實(shí)可以看做是功能豐富的應(yīng)用,它們擁有著復(fù)雜的JavaScript代碼和一大堆依賴包。當(dāng)一個(gè)項(xiàng)目開發(fā)的越來越復(fù)雜的時(shí)候,會(huì)遇到一些問題:命名沖突(變量和函數(shù)命名可能相同),文件依賴(引入外部的文件數(shù)目、順序問題)等。
什么是模塊化
模塊化開發(fā)是一種管理方式,是一種生產(chǎn)方式,一種解決問題的方案。他按照功能將一個(gè)軟件切分成許多部分單獨(dú)開發(fā),然后再組裝起來,每一個(gè)部分即為模塊。當(dāng)使用模塊化開發(fā)的時(shí)候可以避免剛剛的問題,并且讓開發(fā)的效率變高,以及方便后期的維護(hù)。
模塊化的好處
- 避免命名沖突(減少命名空間污染)
- 更好的分離,按需加載
- 更高復(fù)用性
- 高可維護(hù)性
JS中的模塊規(guī)范(CommonJS,AMD,CMD)
發(fā)展歷程一:CommonJS規(guī)范
允許模塊通過require方法來 同步 加載(同步意味阻塞)所要依賴的其他模塊,然后通過module.exports來導(dǎo)出需要暴露的接口。CommonJS 是以在瀏覽器環(huán)境之外構(gòu)建JavaScript 生態(tài)系統(tǒng)為目標(biāo)而產(chǎn)生的項(xiàng)目,比如在服務(wù)器和桌面環(huán)境中。
發(fā)展歷程二:AMD/CMD
AMD
AMD 是 RequireJS 在推廣過程中對(duì)模塊定義的規(guī)范化產(chǎn)出(異步模塊定義)。
AMD是"Asynchronous Module Definition"的縮寫,意思就是"異步模塊定義"。它采用異步方式加載模塊,模塊的加載不影響它后面語(yǔ)句的運(yùn)行。所有依賴這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回調(diào)函數(shù)中,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。
AMD標(biāo)準(zhǔn)中定義了以下兩個(gè)API:
require([module], callback);
define(id, [depends], callback);
require接口用來加載一系列模塊,define接口用來定義并暴露一個(gè)模塊。
優(yōu)點(diǎn):
- 適合在瀏覽器環(huán)境中異步加載模塊
- 可以并行加載多個(gè)模塊
CMD
CMD 是 SeaJS 在推廣過程中對(duì)模塊定義的規(guī)范化產(chǎn)出。(在CommomJS和AMD基礎(chǔ)上提出)
優(yōu)點(diǎn):
- 依賴就近,延遲執(zhí)行
- 可以很容易在服務(wù)器中運(yùn)行
AMD 和 CMD 的區(qū)別
AMD和CMD起來很相似,但是還是有一些細(xì)微的差別:
- 對(duì)于依賴的模塊,AMD是提前執(zhí)行,CMD是延遲執(zhí)行。
- AMD推崇依賴前置;CMD推崇依賴就近,只有在用到某個(gè)模塊的時(shí)候再去require。
- AMD 的 API 默認(rèn)是一個(gè)當(dāng)多個(gè)用,CMD 的 API 嚴(yán)格區(qū)分,推崇職責(zé)單一
發(fā)展歷程三:ES6模塊化
EcmaScript6 標(biāo)準(zhǔn)增加了JavaScript語(yǔ)言層面的模塊體系定義。
在 ES6 中,我們使用export關(guān)鍵字來導(dǎo)出模塊,使用import關(guān)鍵字引用模塊。