在學習開發(fā)微信小程序中, 分析總結了最近版本微信小程序模塊化的函數(shù) require的加載與初始化模塊機制,歸納說來,小程序JS模塊加載可分為兩大步驟:JS模塊加載和JS模塊初始化。
JS模塊加載:一次性加載全部JS, 但并不一定立即執(zhí)行
先提一提微信小程序架構: 類瀏覽器 -> HTTP本地服務 -> 云端服務
微信小程序運行的架構,基本上是瀏覽器 -> HTTP本地服務 -> 云端服務, HTTP本地服務用來讀取本地文件或者代理云端的文件資源。讀取項目中JS文件, 是由HTTP本地服務取本地存儲的腳本文件.
似乎比較簡單,一個HTML 引用所有JS文件
既然采用了這種架構,那微信小程序就類似瀏覽器那樣,借助一個HTML頁面來引用加載所有的JS文件。(注:這同NODE.JS的方式區(qū)別)
在小程序開發(fā)開具的HTTP服務部分代碼,可以看到這個服務干了這件事情:
微信小程序包目錄下面所有.js文件, 會按方式插入生成一個HTML文件,然后類似瀏覽器方式加載.
讓HTTP本地服務配合,對JS文件作的包裝手法
可是事情并未結束,這種方式一加載,所有js文件都會立即執(zhí)行,亂糟糟生成一團,怎么可能..那require函數(shù)又拿來干什么呢?原來這兒,HTTP服務在返回.JS文件內容的,給腳本內容包裝上了一層: define函數(shù)
define函數(shù)非常簡單,大致如下:
二, JS模塊初始化:按需遞歸式require初始化
先看看微信小程序require函數(shù)的定義:
從上面可以看出, require函數(shù)只是通過模塊名,從內存中獲取腳本內容執(zhí)行,并置標志以保證只執(zhí)行一次.
再精簡一下:
require --調用-> factory --->模塊中可能再require另一個模塊...這樣就是一個典型的遞歸結構。
三,補充一下:頁面js 其實也是被require函數(shù)加載
所謂頁面JS,,就是在app.json中注冊的page的js, 它們并沒有被其它JS require方式引用,
那么它們在什么時候初始化?
回到之前本地代理服務器的代碼,留意下面一點:
原來它們還是使用require函數(shù)初始化,而且是加載后立即執(zhí)行。
目前通常微信小程序代碼結構不會太復雜,但隨著產品的發(fā)展,需求的增加, 代碼結構可能越來越復雜,越來越注意模塊化.同時,如何將舊有JS模塊在微信小程序中重用,這也是個重要話題。 所以深入理解微信小程序的JS模塊化機制也是很有價值的.