說起模塊化開發(fā)大家想必都不陌生,特別是隨著前端應(yīng)用復(fù)雜化,代碼呈倍數(shù)增長,我們不得不耗費大量的時間去進(jìn)行管理,模塊化也就逐漸的被大家所接受。
所以具體來講的話,模塊化開發(fā)就是指將復(fù)雜的應(yīng)用功能分為多個模塊進(jìn)行開發(fā),這樣一來一個模塊就是實現(xiàn)特定功能的文件,有了模塊,最直接的價值就是我們可以更方便地管理代碼,甚至是直接引入使用別人的代碼,想要什么功能,就加載什么模塊。
模塊化開發(fā)的發(fā)展
其實早期 JAVAScript 的模塊化是基于文件劃分的方式去實現(xiàn)的,這是我們 web 當(dāng)中最原始化的模塊系統(tǒng),當(dāng)然這個方式下有幾個突出的問題,例如命名沖突、全局污染等。
后面我們采用命名空間方式,約定每一個模塊只暴露一個全局的對象,所有的模塊成員都掛載到這個對象下面,具體做法就是在 JavaScript 的模塊化的基礎(chǔ)上,將每一個模塊包裹成為全局對象的方式去實現(xiàn),類似于在模塊內(nèi)去為我們的模塊一些成員去添加命名空間,但這種方式有一個明顯的問題就是沒有解決模塊之間的依賴性問題。
再到后面也出現(xiàn)了立即執(zhí)行函數(shù)的方式(IIFE),他的原理就是將每一個模塊都放到函數(shù)私有作用域當(dāng)中,對于需要暴露的成員,再通過掛載到全局對象的方式去實現(xiàn),這里也有一個實際的例子:
;(function () {
var name = 'module1'
function moduleFn() {
console.log(name + '---> moduleFn');
}
window.module1 = {
moduleFn: moduleFn
}
})()
而發(fā)展至今,模塊化開發(fā)又有了新的發(fā)展和技術(shù)實現(xiàn)方式,特別是在混合應(yīng)用快速發(fā)展的今天,應(yīng)用功能更加多樣,代碼更加復(fù)雜,模塊化開發(fā)的重要性似乎成為一項共識。
模塊化開發(fā)的優(yōu)點
如果要說模塊化開發(fā)和傳統(tǒng)開發(fā)模式最大的區(qū)別,個人認(rèn)為除了實現(xiàn)的方式不一致外,其實模塊化開發(fā)還能在開發(fā)效率、便捷度上面有不小的提升。更為具體來講,我認(rèn)為主要體現(xiàn)在以下四個方面:
1、架構(gòu)靈活,焦點分離
在模塊化開發(fā)中模塊化本身能夠根據(jù)實際需求和變化進(jìn)行靈活的調(diào)整和擴(kuò)展,可以將系統(tǒng)劃分為不同的層次,如數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層、表示層等。這種分層設(shè)計方式可以降低系統(tǒng)的耦合性,在一定程度上提升系統(tǒng)的擴(kuò)展能力。
焦點分離上面則表現(xiàn)為可以將關(guān)注點分為功能需求和性能需求,然后分別進(jìn)行開發(fā)和測試,從而實現(xiàn)系統(tǒng)復(fù)雜性的降低。
2、方便模塊間組合、分解
在模塊化開發(fā)中,組合和分解都很好理解,組合顧名思義就是指將不同的模塊按照一定的方式組裝起來,這樣可以實現(xiàn)更為復(fù)雜的功能或場景,而分解反過來就是將一個復(fù)雜模塊分解為若干個簡單的子模塊,以便更好地功能實現(xiàn)和維護(hù)。
3、方便單個模塊功能調(diào)試、升級
當(dāng)我們采用模塊化開發(fā)后,很多的復(fù)雜功能成為單獨的一個模塊,如果對于某個模塊需要進(jìn)行功能的debug或者升級,那可以很快的針對這個功能模塊開展,而不用牽一發(fā)而動全身。
4、多人協(xié)作互不干擾
這個非常好理解,由于模塊化本身就是系統(tǒng)解耦方式實現(xiàn)的,分為多個模塊化也就對應(yīng)著多個代碼包,這樣一來相互協(xié)作不受影響也是提升效率的一種方式。
模塊化開發(fā)的現(xiàn)狀
模塊化也是隨著技術(shù)的發(fā)展不斷的更新,例如目前受到眾多開發(fā)者青睞的開發(fā)方式就包括依賴打包和依賴加載。
1、依賴加載
目前這種方式是應(yīng)用較為廣泛的,像 require js、sea.js等,除了編寫規(guī)范不一樣,實際都是通過相關(guān)require api把模塊 chunk 文件拿回來,當(dāng)加載完成之后再運行邏輯代碼。
2、依賴打包
經(jīng)典代表就 Webpack,其實就是寫代碼的時候分開模塊,但打包的時候按依賴關(guān)系找到各個模塊,最后打包到同一個文件上,并給每個chunk標(biāo)識id,運行邏輯代碼時將模塊引用指向該id,從而實現(xiàn)模塊化。
3、小程序化
此外,隨著微信、支付寶等App的實踐,小程序容器技術(shù) FinClip 也成為模塊化的一種選擇,他的原理其實就和前面模塊化開發(fā)的模式一直,將復(fù)雜緊耦合的功能應(yīng)用解耦為一個一個的小模塊,但不同的是這些小模塊的承載方式都換為了小程序,從開發(fā)和管理的角度來看更為簡約一些。
如果以一個復(fù)雜的手機銀行app為例,相當(dāng)于應(yīng)用小程序容器技術(shù)將臃腫的APP功能打散,功能模塊互相解耦,每個業(yè)務(wù)功能都最小化、積木化、樂高化的小程序。