小程序uni-app分包優(yōu)化、頁面預加載、頁面跳轉(zhuǎn)封裝
優(yōu)化
因小程序有體積和資源加載限制,各家小程序平臺提供了分包方式,優(yōu)化小程序的下載和啟動速度。在小程序啟動時,默認會下載主包并啟動主包內(nèi)頁面,當用戶進入分包內(nèi)某個頁面時,會把對應(yīng)分包自動下載下來,下載完成后再進行展示。
一、分包優(yōu)化
注意:
subPackages 里的pages的路徑是 root 下的相對路徑,不是全路徑。
微信小程序每個分包的大小是2M,總體積一共不能超過16M。
分包下支持獨立的 static 目錄,用來對靜態(tài)資源進行分包。
uni-app內(nèi)支持對微信小程序、QQ小程序、百度小程序、支付寶小程序、字節(jié)小程序(HBuilderX 3.0.3+)分包優(yōu)化,即將靜態(tài)資源或者js文件放入分包內(nèi)不占用主包大小。
針對vendor.js過大的情況可以使用運行時壓縮代碼
HBuilderX創(chuàng)建的項目勾選運行–>運行到小程序模擬器–>運行時是否壓縮代碼
cli創(chuàng)建的項目可以在package.json中添加參數(shù)–minimize,示例:“dev:mp-weixin”: “cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize”
1.目錄
pages是我們的主包,里面有登錄頁和index開頭的3個底部tabBar選項卡頁面。pagesOther里面是我們的分包,里面有個人中心的一些訂單和消息頁面。
注意:tabBar 頁面以及引用的頁面都需要放在主包,靜態(tài)文件夾名為 static
┌─pages
│ ├─index
│ │ └─index.vue
│ ├─index2
│ │ └─index2.vue
│ ├─index3
│ │ └─index3.vue
│ └─login
│ └─login.vue
├─pagesOther
│ ├─static
│ └─personal
│ └─order.vue
│ └─message.vue
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json
2.分包配置
修改 mainfest.json 配置,點擊源碼視圖,在 mp-weixin 中加入以下代碼
修改 pages.json 配置,在 pages 同級下新增 subPackages,分包中配置了 page 路徑后,主包 pages 中就不需要了
"pages": [
// 登錄
{
"path": "pages/login/login",
"style": {
"navigationBarTitleText": "登錄"
}
},
// 選項卡
{
"path": "pages/idnex1/idnex1",
"style": {
"navigationBarTitleText": "選項卡一"
}
},
{
"path": "pages/idnex2/idnex2",
"style": {
"navigationBarTitleText": "選項卡二"
}
},
{
"path": "pages/idnex3/idnex3",
"style": {
"navigationBarTitleText": "選項卡三"
}
}
],
"subPackages": [{
"root": "pagesOther", // 分包名稱
"pages": [
// 省略無數(shù)個頁面路徑
...
// 個人中心
{
"path": "personal/order",
"style": {
"navigationBarTitleText": "訂單"
}
},
{
"path": "personal/message",
"style": {
"navigationBarTitleText": "消息"
}
}
]
}],
3.頁面預加載
配置preloadRule后,在進入小程序某個頁面時,由框架自動預下載可能需要的分包,提升進入后續(xù)分包頁面時的啟動速度
在剛剛 pages.json 中繼續(xù)添加 preloadRule 預加載配置
packages:表示進入 pages/index/index1 這個頁面后加載pagesOther這個分包,值為 __APP__ 時表示主包
network:在指定網(wǎng)絡(luò)下預下載,可選值為:all(不限網(wǎng)絡(luò))、wifi(僅wifi下預下載)
"preloadRule": {
"pages/index/index1": {
"network": "all",
"packages": ["pagesOther"]
}
},
然后我們可以看下運行時的依賴分析
二、頁面跳轉(zhuǎn)
類似HTML中的 <a> 組件,但只能跳轉(zhuǎn)本地頁面。目標頁面必須在pages.json中注冊
1.UNI跳轉(zhuǎn)方法
uni方法進行跳轉(zhuǎn)
uni.navigateTo
保留當前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面,使用uni.navigateBack可以返回到原頁面
uni.redirectTo
關(guān)閉當前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面
uni.reLaunch
關(guān)閉所有頁面,打開到應(yīng)用內(nèi)的某個頁面
uni.switchTab
跳轉(zhuǎn)到 tabBar 頁面,并關(guān)閉其他所有非 tabBar 頁面
uni.navigateBack
關(guān)閉當前頁面,返回上一頁面或多級頁面。可通過 getCurrentPages() 獲取當前的頁面棧,決定需要返回幾層
uni.preloadPage
預加載頁面,是一種性能優(yōu)化技術(shù)。被預載的頁面,在打開時速度更快
2.封裝為vue方法
我們可以自己封裝為Vue方法,來調(diào)用跳轉(zhuǎn)與傳參跳轉(zhuǎn)
var utils = {};
//公共處理方法
utils.install = function(Vue, option) {
// 頁面跳轉(zhuǎn)
Vue.prototype.jump = function(path) {
uni.navigateTo({
url: path
})
};
// 返回
Vue.prototype.back = function(obj) {
uni.navigateBack(obj);
};
// 帶參跳轉(zhuǎn)
Vue.prototype.togo = function(url,data){
url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
uni.navigateTo({
url
})
};
function param(data) {
let url = ''
for (var k in data) {
let value = data[k] !== undefined ? data[k] : ''
url += '&' + k + '=' + encodeURIComponent(value)
}
return url ? url.substring(1) : ''
};
// 獲取登錄用戶
Vue.prototype.getUserInfo = function() {
let res = uni.getStorageSync('userInfo');
if (res) {
return res
} else {
return {}
}
};
};
export default utils;
在 main.js 中use一下就可以在頁面用了
import utils from './common/util.js'
Vue.use(utils)
攜帶 userid 跳轉(zhuǎn)到 order 頁面
togoOrderList(userid) {
this.togo('/pagesOther/personal/order',{userId: userid})
}
當然也可以使用uni三方組件進行頁面跳轉(zhuǎn)
作者:小碼哥
歡迎關(guān)注微信公眾號 :碼出宇宙
掃描添加好友邀你進技術(shù)交流群,加我時注明【姓名+公司(學校)+職位】