前端為什么要模塊化童番?模塊化的好處?
- javascript這門語言本身被創(chuàng)造出來時(shí),它是基于瀏覽器的恕齐,作為嵌入式的腳本語言乞娄。隨著web的發(fā)展,Ajax技術(shù)得到廣泛應(yīng)用檐迟,jQuery等前端庫層出不窮补胚,前端代碼日益膨脹,這時(shí)候JavaScript作為嵌入式的腳本語言的定位動(dòng)搖了追迟。
- 避免變量污染,命名沖突
- 提高代碼復(fù)用率
- 提高代碼維護(hù)性
- 依賴(引入庫)關(guān)系的管理
模塊化的發(fā)展
一骚腥、原始
1敦间、函數(shù)封裝
函數(shù)的一個(gè)功能就是實(shí)現(xiàn)特定邏輯的一組語句打包。
在一個(gè)文件里面編寫幾個(gè)相關(guān)函數(shù)就是最開始的模塊了
function m1(){
//...
}
function m2(){
//...
}
這樣做的缺點(diǎn)很明顯束铭,污染了全局變量廓块,并且不能保證和其他模塊起沖突
2、對(duì)象封裝
為了解決函數(shù)過多污染全局變量的問題契沫,可以將所有模塊成員(方法function)封裝在一個(gè)對(duì)象中
var module = new Object({
a:0,
b:'哈哈',
m1:function (){ ``` },
m2:function (){ ``` }
})
這樣兩個(gè)函數(shù)就被包在這個(gè)對(duì)象中带猴,當(dāng)我們要使用的時(shí)候,就是調(diào)用這個(gè)對(duì)象的屬性懈万。
但是又一個(gè)問題來了拴清,這種寫法會(huì)暴露全部的模塊成員(方法或變量)靶病,內(nèi)部狀態(tài)可以被外部改變,比如外部代碼可直接改變對(duì)象中的值
module.b= '啦啦啦';
module.m1=function (){ ``` };
3口予、立即執(zhí)行函數(shù)(也可以說是閉包)
最后娄周,人們又找到了新的方法——立即執(zhí)行函數(shù)(也可以說是閉包),這樣就可以達(dá)到不暴露私有成員的目的
var module = (function (){
var _count = 5;
var m1 = function (){ ``` };
var m2 = function (){ ``` };
return{
m1:m1,
m2:m2
}
})()
二沪停、規(guī)范
1煤辨、commonjs 規(guī)范
09年出現(xiàn)了nodejs:,就是將 javascrit 脫離瀏覽器運(yùn)行. 但是帶來了問題木张,js 只剩下了語法規(guī)范(ECMAScript), 沒有了 DOM 與 BOM众辨。
這個(gè)時(shí)候需要為脫離瀏覽器的 js 提供新的 api,就引入了 commonjs 規(guī)范舷礼,也引入了模塊的概念鹃彻。commonjs 是一個(gè)更偏向于服務(wù)器端的規(guī)范。Node.js采用了CommonJS規(guī)范且轨。
Commonjs解決了模塊化的問題浮声,并且可以用在瀏覽器中,但是Commonjs是同步加載模塊旋奢,在瀏覽器訪問時(shí)泳挥,js 都是放在服務(wù)器中的, 需要加載完才可以用,而加載限制于網(wǎng)速至朗,網(wǎng)速差的時(shí)候會(huì)阻止瀏覽器的后續(xù)處理屉符,停止后續(xù)的解析,用戶體驗(yàn)不好锹引。
2矗钟、AMD規(guī)范
為了解決這個(gè)問題,又出現(xiàn)了一個(gè)AMD規(guī)范嫌变,這個(gè)規(guī)范可以實(shí)現(xiàn)模塊的異步加載吨艇。require.js采用了AMD規(guī)范。
AMD基本都是提前說明依賴模塊腾啥,然后預(yù)加載這些模塊东涡,實(shí)際上這就要求你提前想好這些依賴,提前寫好倘待,不然寫代碼過程中要回到開頭繼續(xù)添加依賴疮跑。
3、CMD規(guī)范
CMD規(guī)范是sea.js在推廣過程中的規(guī)范化產(chǎn)出凸舵,sea.js是另一種前端模塊化工具祖娘,它的出現(xiàn)緩解了requireJS的幾個(gè)痛點(diǎn)。
Seajs也是預(yù)加載依賴js啊奄,跟AMD的規(guī)范在預(yù)加載這一點(diǎn)上是相同的渐苏,明顯不同的地方是調(diào)用和聲明依賴的地方掀潮。
CMD標(biāo)準(zhǔn)傾向于在使用過程中提出依賴,就是不管代碼寫到哪突然發(fā)現(xiàn)需要依賴另一個(gè)模塊整以,那就在當(dāng)前代碼用require引入就可以了胧辽,即按需加載,規(guī)范會(huì)幫你搞定預(yù)加載公黑。
但是AMD標(biāo)準(zhǔn)讓你必須提前在頭部依賴參數(shù)部分寫好邑商。這就是最明顯的區(qū)別。(AMD和CMD都是用difine和require)