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