微信小程序分包加載的實(shí)現(xiàn)代碼
一、分包加載
1. 什么是分包加載
什么是分包加載 ?
小程序的代碼通常是由許多頁(yè)面、組件以及資源等組成,隨著小程序功能的增加,代碼量也會(huì)逐漸增加,體積過(guò)大就會(huì)導(dǎo)致用戶打開(kāi)速度變慢,影響用戶的使用體驗(yàn)。
分包加載是一種小程序優(yōu)化技術(shù)。將小程序不同功能的代碼,分別打包成不同的子包,在構(gòu)建時(shí)打包成不同的分包,用戶在使用時(shí)按需進(jìn)行加載,在構(gòu)建小程序分包項(xiàng)目時(shí),構(gòu)建會(huì)輸出一個(gè)或多個(gè)分包。每個(gè)使用分包小程序必定含有一個(gè)主包。每個(gè)分包可以包含多個(gè)頁(yè)面、組件、樣式和邏輯等。當(dāng)小程序需要使用某個(gè)分包時(shí),才會(huì)加載該分包中的代碼。
主包:包含默認(rèn)啟動(dòng)頁(yè)面 / TabBar 頁(yè)面 以及 所有分包都需用到公共資源的包
分包:根據(jù)開(kāi)發(fā)者的配置進(jìn)行劃分出來(lái)的子包
2、小程序分包后如何加載
在小程序啟動(dòng)時(shí),默認(rèn)會(huì)下載主包并啟動(dòng)主包內(nèi)頁(yè)面,在用戶訪問(wèn)分包內(nèi)某個(gè)頁(yè)面時(shí),微信客戶端才會(huì)把對(duì)應(yīng)分包下載下來(lái),下載完成后再進(jìn)行展示。
目前小程序分包大小有以下限制:
- 整個(gè)小程序所有分包大小不超過(guò) 20MB
- 單個(gè)分包/主包大小不能超過(guò) 2MB
?? 注意事項(xiàng):
? 整個(gè)小程序所有分包大小可能會(huì)隨時(shí)調(diào)整,截止到目前整個(gè)小程序所有分包大小不超過(guò) 20M
二、分包的基本使用
知識(shí)點(diǎn):
在進(jìn)行分包加載之前,需要對(duì)小程序的業(yè)務(wù)邏輯進(jìn)行分析,將代碼劃分成多個(gè)模塊。每個(gè)模塊應(yīng)該有一個(gè)明確的功能,并與其他模塊之間有明確的依賴關(guān)系
需要按照功能拆分分包,并且每個(gè)分包都需要與其他包有依賴關(guān)系(可以通過(guò) a 分包跳轉(zhuǎn)到 b 分包)
開(kāi)發(fā)者在小程序的配置文件 app.json
中,通過(guò) subPackages
或者 subpackages
字段聲明項(xiàng)目分包結(jié)構(gòu)。
每個(gè)分包需要指定 root
字段、name
字段和 pages
字段
root
字段指定了分包的根目錄,該目錄下的所有文件都會(huì)被打包成一個(gè)獨(dú)立的包name
字段為分包的名稱,用于在代碼中引用該分包pages
字段指定了該分包中包含的頁(yè)面,可以使用通配符 *
匹配多個(gè)頁(yè)面
{ "subPackages": [ { "root": "modules/goodModule", "name": "goodModule", "pages": [ "pages/list/list", "pages/detail/detail" ] }, { "root": "modules/marketModule", "name": "marketModule", "pages": [ "pages/market/market" ] } ] }
三、打包和引用原則(注意事項(xiàng))
1、打包原則:
tabBar 頁(yè)面必須在主包內(nèi)
最外層的 pages 字段,屬于主包的包含的頁(yè)面
按 subpackages 配置路徑進(jìn)行打包,配置路徑外的目錄將被打包到主包中
分包之間不能相互嵌套,subpackage 的根目錄不能是另外一個(gè) subpackage 內(nèi)的子目錄
2、引用原則:
主包不可以引用分包的資源,但分包可以使用主包的公共資源
分包與分包之間資源無(wú)法相互引用, 分包異步化時(shí)不受此條限制
四、 獨(dú)立分包的配置
1、什么是獨(dú)立分包:
獨(dú)立分包:獨(dú)立分包是小程序中一種特殊類型的分包,可以獨(dú)立于主包和其他分包運(yùn)行。
從獨(dú)立分包中頁(yè)面進(jìn)入小程序時(shí),不需要下載主包,但是當(dāng)用戶進(jìn)入普通分包或主包內(nèi)頁(yè)面時(shí),主包才會(huì)被下載 !
開(kāi)發(fā)者可以將功能相對(duì)獨(dú)立的頁(yè)面配置到獨(dú)立分包中,因?yàn)楠?dú)立分包不依賴主包即可運(yùn)行,可以很大程度上提升分包頁(yè)面的啟動(dòng)速度
如果是獨(dú)立分包,不需要下載主包,直接就能夠訪問(wèn),獨(dú)立分包是自己獨(dú)立運(yùn)行的
而如果是其他分包,需要先下載主包,通過(guò)路徑訪問(wèn),才能加載對(duì)應(yīng)路徑的分包
?? 注意事項(xiàng):
獨(dú)立分包中不能依賴主包和其他分包中的資源
主包中的 app.wxss 對(duì)獨(dú)立分包無(wú)效
App 只能在主包內(nèi)定義,獨(dú)立分包中不能定義 App,會(huì)造成無(wú)法預(yù)期的行為
2、如何配置獨(dú)立分包:
開(kāi)發(fā)者在app.json
中找到需要配置為獨(dú)立分包的subpackages
字段
在該字段配置項(xiàng)中定義independent
字段聲明對(duì)應(yīng)分包為獨(dú)立分包。
落地代碼:
{ "subPackages": [ { "root": "modules/goodModule", "name": "goodModule", "pages": [ "pages/list/list", "pages/detail/detail" ] }, { "root": "modules/marketModule", "name": "marketModule", "pages": [ "pages/market/market" ], "independent": true } ] }
五、分包預(yù)下載
知識(shí)點(diǎn):
分包預(yù)下載是指訪問(wèn)小程序某個(gè)頁(yè)面時(shí),預(yù)先下載分包中的代碼和資源,以提高用戶的使用體驗(yàn)。當(dāng)用戶需要訪問(wèn)分包中的頁(yè)面時(shí),已經(jīng)預(yù)先下載的代碼和資源可以直接使用,通過(guò)分包預(yù)下載加快了頁(yè)面的加載速度和顯示速度。
小程序的分包預(yù)下載需要在 app.json
中通過(guò) preloadRule
字段設(shè)置預(yù)下載規(guī)則。preloadRule
是一個(gè)對(duì)象,對(duì)象的 key
表示訪問(wèn)哪個(gè)路徑時(shí)進(jìn)行預(yù)加載,value
是進(jìn)入此頁(yè)面的預(yù)下載配置,具有兩個(gè)配置項(xiàng):
字段 | 類型 | 必填 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
packages | StringArray | 是 | 無(wú) | 預(yù)下載的分包名稱,進(jìn)入頁(yè)面后預(yù)下載分包的 root 或 name __APP__ 表示主包。 |
network | String | 否 | wifi | 在指定網(wǎng)絡(luò)下預(yù)下載, 可選值為: all : 不限網(wǎng)絡(luò) wifi : 僅wifi下預(yù)下載 |
{ "subPackages": [ { "root": "modules/goodModule", "name": "goodModule", "pages": [ "pages/list/list", "pages/detail/detail" ] }, { "root": "modules/marketModule", "name": "marketModule", "pages": [ "pages/market/market" ], "independent": true } ], "preloadRule": { "pages/index/index": { "network": "all", "packages": ["modules/goodModule"] }, "modules/marketModule/pages/market/market": { "network": "all", "packages": ["__APP__"] } } }
落地代碼:
{ "pages": [ "pages/index/index", "pages/user/user" ], "subPackages": [ { "root": "pages/music", "name": "music", "pages": [ "player/player", "lyric/lyric" ] }, { "root": "pages/settings", "name": "settings", "pages": [ "theme/theme", "language/language" ] } ], "preloadRule": { "pages/music/player/player": { "packages": ["settings"], "network": "wifi" } } }
到此這篇關(guān)于微信小程序---分包加載的文章就介紹到這了,更多相關(guān)微信小程序分包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用JS location實(shí)現(xiàn)搜索框歷史記錄功能
這篇文章主要介紹了使用JS location實(shí)現(xiàn)搜索框歷史記錄功能,本文通過(guò)實(shí)例 代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12js 阻止子元素響應(yīng)父元素的onmouseout事件具體實(shí)現(xiàn)
本文為大家介紹下js阻止子元素響應(yīng)父元素的onmouseout事件,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-12-12JavaScript表單驗(yàn)證實(shí)現(xiàn)過(guò)程詳解
表單校驗(yàn)是注冊(cè)環(huán)節(jié)中必不可少的操作,表單校驗(yàn)通過(guò)一定的規(guī)則來(lái)確保用戶提交數(shù)據(jù)的有效性,下面這篇文章主要給大家介紹了關(guān)于el-form表單驗(yàn)證的一些實(shí)用方法,需要的朋友可以參考下2023-01-01JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)參數(shù)不丟失的方法
這篇文章主要介紹了JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)參數(shù)不丟失的方法,結(jié)合實(shí)例形式對(duì)比分析了javascript URL加密函數(shù)escape()、encodeURI()與encodeURIComponent()的功能與相關(guān)使用技巧,需要的朋友可以參考下2016-11-11JavaScript擴(kuò)展運(yùn)算符的學(xué)習(xí)及應(yīng)用詳情(ES6)
這篇文章主要介紹了JavaScript擴(kuò)展運(yùn)算符的學(xué)習(xí)及應(yīng)用詳情(ES6),擴(kuò)展運(yùn)算符是ES6新增的一種運(yùn)算符,他可以幫助我們簡(jiǎn)化代碼,簡(jiǎn)化操作,具體相關(guān)知識(shí)感興趣的小伙伴可以查看下面文章的簡(jiǎn)單介紹2022-08-08js中區(qū)分深拷貝與淺拷貝的實(shí)戰(zhàn)過(guò)程
兩個(gè)對(duì)象A、B,A有數(shù)據(jù)B為空,B復(fù)制了A,我們修改A,如果B中的數(shù)據(jù)跟著變化了,那就是淺拷貝,如果沒(méi)有變化,那就是深拷貝,下面這篇文章主要給大家介紹了關(guān)于js中區(qū)分深拷貝與淺拷貝的相關(guān)資料,需要的朋友可以參考下2022-01-01