1: 為什么要使用模塊化?
前端開發(fā)從最開始的嵌入script標(biāo)簽實現(xiàn)特效,到現(xiàn)在js得到重視應(yīng)用逐漸廣泛起來,前端項目越來越復(fù)雜,開發(fā)工作需要一個團隊分工協(xié)作、進度管理、單元測試等等。然而,JavaScript卻沒有為組織代碼提供任何明顯幫助,甚至沒有類的概念,更不用說模塊(module)了。Javascript模塊化編程,已經(jīng)成為一個迫切的需求。理想情況下,開發(fā)者只需要實現(xiàn)核心的業(yè)務(wù)邏輯,其他都可以加載別人已經(jīng)寫好的模塊。引入模塊化開發(fā)能解決命名沖突,避免污染全局變量;更有效的管理文件間的依賴。提高代碼可讀性;代碼解耦提高復(fù)用性。
2: CMD、AMD、CommonJS 規(guī)范分別指什么?有哪些應(yīng)用
Commonjs:用于服務(wù)器端模塊化,有一個全局性方法require(),用于加載模塊。定義模塊接口使用module.exports對象。著名的應(yīng)用是Nodejs。commonjs是同步加載,這對服務(wù)器端不是一個問題,因為所有的模塊都存放在本地硬盤,可以同步加載完成,等待時間就是硬盤的讀取時間。
AMD:異步模塊定義,瀏覽器端的模塊化開發(fā)規(guī)范。由于不是JavaScript原生支持,所以使用AMD規(guī)范進行頁面開發(fā)需要用到對應(yīng)的庫函數(shù)RequireJS。實際上AMD規(guī)范是 RequireJS 在推廣過程中總結(jié)出的模塊定義規(guī)范。它采用異步方式加載模塊,模塊的加載不影響它后面語句的運行。所有依賴這個模塊的語句,都定義在一個回調(diào)函數(shù)中,等到加載完成之后,這個回調(diào)函數(shù)才會運行。
加載模塊requirejs()語法:require([module], callback) 第一個參數(shù)[module],是一個數(shù)組,里面的成員就是要加載的模塊;第二個參數(shù)callback,則是加載成功之后的回調(diào)函數(shù)。
定義模塊define()語法:define(id?,[dependencies],factory)第一個參數(shù)模塊名稱(可選),第二個參數(shù)當(dāng)前所定義模塊的依賴(可選),第三個參數(shù)工廠函數(shù)定義模塊初始化執(zhí)行的函數(shù)或?qū)ο?,為函?shù)時僅執(zhí)行一次,為對象時此對象為模塊的輸出值。
CMD:通用模塊定義,是seajs在推廣過程中總結(jié)出的模塊定義規(guī)范。AMD推崇依賴前置。,CMD推崇依賴就近。