前端基礎(chǔ)(問答29)


keywords: 模塊化向拆、AMD亚茬、CMD、CommonJS浓恳。


  • 為什么要使用模塊化刹缝?

什么是模塊?模塊就是對實現(xiàn)特定功能的一組屬性和方法的封裝颈将。使用模塊化能解決長久以來困擾我們的兩大問題:1梢夯、命名沖突;2吆鹤、文件依賴厨疙。

對于小團(tuán)隊或簡單頁面來說,還可以通過人為約定來避免這兩個問題疑务;但隨著網(wǎng)頁逐步向應(yīng)用程序方向發(fā)展沾凄,頁面所使用到的JS代碼越來越龐大,越來越復(fù)雜知允,命名沖突與文件依賴這兩個問題越發(fā)突出撒蟀,拖延了項目的開發(fā)進(jìn)度。通過使用模塊化温鸽,所有組件可以彼此獨立保屯,職責(zé)單一手负,協(xié)同完成開發(fā)。

  • CMD姑尺、AMD竟终、CommonJS 規(guī)范分別指什么?有哪些應(yīng)用

**CommomJS **: NodeJS提出的服務(wù)器端的模塊化規(guī)范切蟋。

1统捶、定義模塊:一個單獨的文件就是一個模塊。每一個模塊都是單獨的作用域柄粹。

2喘鸟、模塊輸出 模塊只有一個出口,即module.exports對象驻右,需要把希望輸出的內(nèi)容放入該對象什黑。

3、加載模塊:加載模塊使用require方法堪夭,該方法讀取一個文件并執(zhí)行愕把,返回文件內(nèi)部的module.exports對象。

//定義模塊:myMod.js
var name = 'Byron'

function printName(){
    console.log(name)
}

function printFullName(firstName) {
    console.log(firstName + name)
}

//輸出模塊
module.exports = {
    printName : printName,
    printFullName:printFullName
}
==================================
//加載模塊
var nameMod = require('./myMod.js')

nameMod.printName()

不同的實現(xiàn)對require時的路徑有不同要求茵瘾,一般情況可以省略js擴(kuò)展名礼华,可使用相對路徑和絕對路徑。

AMD:即Asynchronous Module Definition拗秘,是一個瀏覽器端模塊化開發(fā)的規(guī)范圣絮。使用該規(guī)范的有requireJS。

1雕旨、定義模塊:通過define函數(shù)來定義模塊扮匠,它是全局變量。

    define(
        module_id /*可選*凡涩,沒有則為匿名模塊/, 
        [dependencies] /*可選*,當(dāng)前模塊依賴的模塊組/, 
        definition function /*用來初始化模塊或?qū)ο蟮暮瘮?shù)*/
    );

2棒搜、輸出模塊:define函數(shù)中的回調(diào)函數(shù)return出的內(nèi)容即為模塊的接口。

3活箕、加載模塊:使用require方法加載模塊:

    require([dependencies],callback)
    require函數(shù)接收兩個參數(shù):
        1力麸、第一個參數(shù)是一個數(shù)組,表示加載的模塊育韩;
        2克蚂、第二個參數(shù)是一個回調(diào)函數(shù),當(dāng)?shù)谝粋€參數(shù)的模塊加載成功后筋讨,它將被調(diào)用埃叭。
             加載的模塊會以參數(shù)形式傳入該函數(shù),從而在回調(diào)函數(shù)內(nèi)部使用這些模塊悉罕。

顯然赤屋,require加載的模塊是異步的立镶。

//math.js   定義math模塊,回調(diào)函數(shù)中的return為暴露的接口
define(function(){      
    return function () {
        var sum = 0,i=0,args = arguments,len = arguments.length
        while(i<leen) {
            sum += args[i++]
        }
        return sum
    }
})

//inc.js    定義inc模塊类早,回調(diào)函數(shù)中的return為暴露的接口
define(['math',function(math){
    return function (val) {
        return match(val + 1)
    }
}])

//index.js  加載inc模塊
requirejs.config({
    baseUrl:'js'    //用于模塊查找的基準(zhǔn)路徑
})

requirejs(['inc'],function(inc){
    console.log(inc(10))
})

CMD:即Common Module Definition媚媒,是一個瀏覽器端模塊化開發(fā)的規(guī)范。使用該規(guī)范的有SeaJS莺奔。

1欣范、定義模塊:通過define函數(shù)定義模塊。

define(id?,desp?,factory)
    1令哟、一個文件一個模塊,一般用文件名作為模塊id妨蛹;
    2屏富、CMD推崇就近依賴,一般不再define的參數(shù)中寫依賴蛙卤,而是在factory中寫狠半。
    3、factory有3個參數(shù):require(方法),exports(對象),module(對象)颤难。

2神年、輸出模塊:通過factory中的參數(shù)exports對象向外提供模塊接口。

3行嗤、加載模塊:使用require函數(shù)加載模塊

//定義模塊 math.js
define(function(require,exports,module){
    exports.add = function() {
        var sum = 0,i = 0,args = arguments,len = args.length
        while(i < len) {
            sum += args[i++]
        }
        return sum
    }
})

//定義inc模塊  
define(function(require,exports,module){
    var add = require('math').add
    exports.increment = function(val) {
        return add(val,1)
    }
})

AMD與CMD的區(qū)別

1已日、對依賴的處理不同。AMD推崇依賴前置栅屏,在定義模塊的時候就要聲明其依賴的模塊飘千;CMD推崇就近依賴,只有在用到某個模塊的時候再去require栈雳。

2护奈、對依賴的執(zhí)行時機(jī)不同。AMD在加載模塊完成后就執(zhí)行該模塊哥纫,所有模塊執(zhí)行完成后則進(jìn)入require的回調(diào)并執(zhí)行霉旗。而CMD加載模塊后并不執(zhí)行該模塊,在所有模塊加載完成執(zhí)行callback蛀骇,遇到require才執(zhí)行相應(yīng)的模塊厌秒。

參考:
前端模塊化
使用AMD、CommonJS松靡、及ES Harmony編寫模塊化的JavaScript

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末简僧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雕欺,更是在濱河造成了極大的恐慌岛马,老刑警劉巖棉姐,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啦逆,居然都是意外死亡伞矩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門夏志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乃坤,“玉大人,你說我怎么就攤上這事沟蔑∈铮” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵瘦材,是天一觀的道長厅须。 經(jīng)常有香客問我,道長食棕,這世上最難降的妖魔是什么朗和? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮簿晓,結(jié)果婚禮上眶拉,老公的妹妹穿的比我還像新娘。我一直安慰自己憔儿,他們只是感情好忆植,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皿曲,像睡著了一般唱逢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋休,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天坞古,我揣著相機(jī)與錄音,去河邊找鬼劫樟。 笑死痪枫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠艳。 我是一名探鬼主播奶陈,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼附较!你這毒婦竟也來了吃粒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拒课,失蹤者是張志新(化名)和其女友劉穎徐勃,沒想到半個月后事示,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡僻肖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年肖爵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臀脏。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡劝堪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揉稚,到底是詐尸還是另有隱情秒啦,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布窃植,位于F島的核電站帝蒿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巷怜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一暴氏、第九天 我趴在偏房一處隱蔽的房頂上張望延塑。 院中可真熱鬧,春花似錦答渔、人聲如沸关带。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筋蓖,卻和暖如春雏掠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背介评。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚪燕。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像奔浅,于是被迫代替她去往敵國和親馆纳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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