前端入門22-講講模組化
宣告
本篇內容梳理自以下來源:
- ofollow,noindex" target="_blank">Github:smyhvae/web
- JavaScript/">JavaScript模組化開發的演進歷程
- JavaScript模組化七日談
- ES6:Module 的載入實現
- CommonJS規範
感謝各位大佬的分享,解惑了很多。
正文-模組化
現在回過頭來想想,也許選擇以《JavaScript權威指南》一書來作為入門有些不好,因為這本書畢竟是很早之前的,書中所講的思想、標準也基本都只是 ES5 及那時代的相關技術。
這也就導致了,在書中看到的很多例子,雖然覺得所用到的思想很奇妙,比如臨時名稱空間之類的處理,但其實,有些技術到現在已經有了更為強大的技術替代了。
就像這篇要講的模組化,目前,以我看到的各資料後,所收穫的知識是,大概有四種較為常用且熱門的模組化技術,也許還有更新的技術,也許還有我不知道的技術,無所謂,慢慢來,這篇的內容已經夠我消化了。
目前四種模組化技術:
- CommonJS規範&node.js
- AMD規範&Require.js
- CMD規範&Sea.js
- ES6標準
前面是規範,規範就是類似於 ES5,ES6 只是提出來作為一種標準規範,而不同規範有具體的實現,比如 nodeJS 實現了 CommonJS 規範。
模組化歷程
在宣告部分中的第二、第三連結裡那兩篇,以時間線介紹了模組化的相關技術的發展歷程,我覺得很有必要一看,對於掌握和理解目前的模組化技術挺有幫助的。
這裡,就稍微摘抄其中一些內容,詳細內容還是需要到原文閱讀。
1.全域性變數、全域性函式(1999年)
這時候的多個 js 指令碼檔案之間,直接通過全域性變數或全域性函式的方式進行通訊,這種方式叫做:直接定義依賴。
雖然做的好一些的會對這些 js 檔案做一些目錄規劃,將資源歸類整理,但仍無法解決全域性名稱空間被大量汙染,極其容易導致變數衝突問題。
2.物件作為名稱空間(2002年)
為了解決遍地的全域性變數問題,這時候提出一種名稱空間模式的思路,即將本要定義成全域性變數、全域性函式的這些全都作為一個物件的屬性存在,這個物件的角色充當名稱空間,不同模組的 JS 檔案中通過訪問這個物件的屬性來進行通訊。
3.立即執行的函式作為臨時名稱空間 + 閉包(2003年)
雖然提出利用一個物件來作為名稱空間的思路,一定程度解決了大量的全域性變數的問題,但仍舊存在很多侷限,比如沒有模組的隱藏性,所以針對這些問題,這時候又新提出一種思路:利用立即執行的函式來作為臨時名稱空間,這樣就可以避免汙染全域性名稱空間,同時,結合閉包特性,來實現隱藏細節,只對外暴露指定介面。
雖然這種思路,解決了很多問題,但仍舊有一些侷限,比如,缺乏管理者,什麼意思,就是說,在前端裡,開發人員得手動將不同 JS 指令碼檔案按照它們之間的依賴關係,以被依賴在前面的順序來手動書寫 <script> 載入這些檔案。
也就是不同 <script> 的前後順序實際上表示著它們之間的依賴關係,一旦檔案過多,將會很難維護,這是上述方案都存在的問題。