模塊化

為什么要使用模塊化

在以前,網(wǎng)頁功能很簡單,幾行JS就能滿足交互需求。
現(xiàn)在網(wǎng)頁變得越來越復(fù)雜,JS也變得越來越龐大,這個時候就要對JS進(jìn)行模塊化的管理,把不同功能的JS劃分為不同模塊,需要什么功能只要調(diào)用該模塊就可以。
模塊化以后,提高了代碼的復(fù)用性,同時也能更好的管理文件與文件之間的依賴。

CMD、AMD、CommonJS

編寫模塊需要遵守一些規(guī)范,大家都按照一個規(guī)范進(jìn)行模塊的編寫,這樣才能相互調(diào)用。假如每個人都按自己的規(guī)范編寫模塊,就會變得混亂,失去了模塊化的初衷。
CommonJS
Node.js的模塊系統(tǒng),就是參照CommonJS規(guī)范實現(xiàn)的
假如有這么一個Math模塊,可以這樣調(diào)用

var Math = require('Math')
Math.add(1,1)

通過require()這個方法加載模塊,然后就可以使用該模塊的功能
而在Math這個模塊中,需要使用exports來輸出該模塊提供的功能

exports.add = function() {
    //code..
}

但是該規(guī)范在瀏覽器中有個缺陷,以上面的例子,當(dāng)我require('Math')時,Math這個模塊是存放在服務(wù)器中的,只有當(dāng)Math模塊下載完成了,Math.add(1,1)才會執(zhí)行,就是所謂的“同步加載”。
假設(shè)我網(wǎng)速很慢,Math模塊加載時間相當(dāng)長,瀏覽器就會進(jìn)入“假死狀態(tài)”,這顯然不是我們想要的。
這個問題在服務(wù)器端就不存在,因為服務(wù)器的模塊都存在本地,加載模塊的時間就是讀取硬盤數(shù)據(jù)的時間。
AMD
AMD(Asynchronous Module Definition),意為"異步模塊定義"。
在前端中,模塊的加載都需要采取“異步加載”,避免出現(xiàn)假死的情況,因此誕生了AMD規(guī)范
而requie.js是遵循AMD的庫之一
requie.js和CommonJS一樣,都采用require()方法進(jìn)行模塊的加載,但是其接受不一樣的參數(shù)

require([module], callback);

[module]為模塊名,callback為模塊加載成功后需要執(zhí)行的函數(shù),因此Math的例子可以寫為

require(['Math'],function(Math){
    Math.add(1,1)
})

模塊則要按ADM規(guī)范寫

define(id?, dependencies?, factory);

id是可選參數(shù),為該模塊名稱,不提供該參數(shù),則模塊名默認(rèn)為該腳本的名字
dependencies?為該模塊的依賴,依賴模塊標(biāo)識的數(shù)組字面量,如果該模塊不依賴其他模塊,這可忽略該參數(shù),
如果忽略此參數(shù),它應(yīng)該默認(rèn)為["require", "exports", "module"]
factory是工廠函數(shù),是該模塊的初始化函數(shù)或?qū)ο?br> 上面的Math模塊假設(shè)依賴了jQuery,在AMD規(guī)范中該這樣寫

define(['jquery'],function($) {
    var Math = (function() {
        return {
            add: function() {
                //code...
            }
        }
    })()
    return Math
})

CMD
CMD是Sea.js推廣的過程中產(chǎn)生的,與AMD只是語法上的區(qū)別
ADM是預(yù)先加載好所有的依賴模塊,而CMD是當(dāng)我需要這個模塊時,才進(jìn)行加載
像上面到Math模塊在CMD中這樣寫

define(function(require, exports, module){
    exports.add = function() {
        //code..
    }
})

require是一個方法,接受模塊標(biāo)識 作為唯一參數(shù),用來獲取其他模塊提供的接口
exports是一個對象,用來向外提供模塊接口
module是一個對象,上面存儲了與當(dāng)前模塊相關(guān)聯(lián)的一些屬性和方法
調(diào)用Math時

var math = require('Math')
math.add()

由于github鏈接太慢,可能會出現(xiàn)bug
本地測試功能完整!
預(yù)覽Demo
源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,707評論 2 370

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