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