小程序uni-app分包優(yōu)化、頁(yè)面預(yù)加載、頁(yè)面跳轉(zhuǎn)封裝

優(yōu)化

因小程序有體積和資源加載限制,各家小程序平臺(tái)提供了分包方式,優(yōu)化小程序的下載和啟動(dòng)速度。在小程序啟動(dòng)時(shí),默認(rèn)會(huì)下載主包并啟動(dòng)主包內(nèi)頁(yè)面,當(dāng)用戶進(jìn)入分包內(nèi)某個(gè)頁(yè)面時(shí),會(huì)把對(duì)應(yīng)分包自動(dòng)下載下來(lái),下載完成后再進(jìn)行展示。



一、分包優(yōu)化

注意:

subPackages 里的pages的路徑是 root 下的相對(duì)路徑,不是全路徑。

微信小程序每個(gè)分包的大小是2M,總體積一共不能超過(guò)16M。

分包下支持獨(dú)立的 static 目錄,用來(lái)對(duì)靜態(tài)資源進(jìn)行分包。

uni-app內(nèi)支持對(duì)微信小程序、QQ小程序、百度小程序、支付寶小程序、字節(jié)小程序(HBuilderX 3.0.3+)分包優(yōu)化,即將靜態(tài)資源或者js文件放入分包內(nèi)不占用主包大小。

針對(duì)vendor.js過(guò)大的情況可以使用運(yùn)行時(shí)壓縮代碼

HBuilderX創(chuàng)建的項(xiàng)目勾選運(yùn)行–>運(yùn)行到小程序模擬器–>運(yùn)行時(shí)是否壓縮代碼

cli創(chuàng)建的項(xià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是我們的主包,里面有登錄頁(yè)和index開(kāi)頭的3個(gè)底部tabBar選項(xiàng)卡頁(yè)面。pagesOther里面是我們的分包,里面有個(gè)人中心的一些訂單和消息頁(yè)面。

注意:tabBar 頁(yè)面以及引用的頁(yè)面都需要放在主包,靜態(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 配置,點(diǎn)擊源碼視圖,在 mp-weixin 中加入以下代碼

修改 pages.json 配置,在 pages 同級(jí)下新增 subPackages,分包中配置了 page 路徑后,主包 pages 中就不需要了

"pages": [
  // 登錄
  {
    "path": "pages/login/login",
    "style": {
      "navigationBarTitleText": "登錄"
    }
  },
  // 選項(xiàng)卡
  {
    "path": "pages/idnex1/idnex1",
    "style": {
      "navigationBarTitleText": "選項(xiàng)卡一"
    }
  },
  {
    "path": "pages/idnex2/idnex2",
    "style": {
      "navigationBarTitleText": "選項(xiàng)卡二"
    }
  },
  {
    "path": "pages/idnex3/idnex3",
    "style": {
      "navigationBarTitleText": "選項(xiàng)卡三"
    }
  }
   ],
"subPackages": [{
  "root": "pagesOther",  // 分包名稱
  "pages": [
    // 省略無(wú)數(shù)個(gè)頁(yè)面路徑
    ...
    // 個(gè)人中心
    {
      "path": "personal/order",
      "style": {
        "navigationBarTitleText": "訂單"
      }
    },
    {
      "path": "personal/message",
      "style": {
        "navigationBarTitleText": "消息"
      }
    }
   ]
}],
3.頁(yè)面預(yù)加載






配置preloadRule后,在進(jìn)入小程序某個(gè)頁(yè)面時(shí),由框架自動(dòng)預(yù)下載可能需要的分包,提升進(jìn)入后續(xù)分包頁(yè)面時(shí)的啟動(dòng)速度

在剛剛 pages.json 中繼續(xù)添加 preloadRule 預(yù)加載配置

packages:表示進(jìn)入 pages/index/index1 這個(gè)頁(yè)面后加載pagesOther這個(gè)分包,值為 __APP__ 時(shí)表示主包

network:在指定網(wǎng)絡(luò)下預(yù)下載,可選值為:all(不限網(wǎng)絡(luò))、wifi(僅wifi下預(yù)下載)

"preloadRule": {
  "pages/index/index1": {
    "network": "all",
    "packages": ["pagesOther"]
  }
},
然后我們可以看下運(yùn)行時(shí)的依賴分析


二、頁(yè)面跳轉(zhuǎn)

類似HTML中的 <a> 組件,但只能跳轉(zhuǎn)本地頁(yè)面。目標(biāo)頁(yè)面必須在pages.json中注冊(cè)

1.UNI跳轉(zhuǎn)方法

uni方法進(jìn)行跳轉(zhuǎn)

uni.navigateTo

保留當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面,使用uni.navigateBack可以返回到原頁(yè)面

uni.redirectTo

關(guān)閉當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面

uni.reLaunch

關(guān)閉所有頁(yè)面,打開(kāi)到應(yīng)用內(nèi)的某個(gè)頁(yè)面

uni.switchTab

跳轉(zhuǎn)到 tabBar 頁(yè)面,并關(guān)閉其他所有非 tabBar 頁(yè)面

uni.navigateBack

關(guān)閉當(dāng)前頁(yè)面,返回上一頁(yè)面或多級(jí)頁(yè)面??赏ㄟ^(guò) getCurrentPages() 獲取當(dāng)前的頁(yè)面棧,決定需要返回幾層

uni.preloadPage

預(yù)加載頁(yè)面,是一種性能優(yōu)化技術(shù)。被預(yù)載的頁(yè)面,在打開(kāi)時(shí)速度更快


2.封裝為vue方法

我們可以自己封裝為Vue方法,來(lái)調(diào)用跳轉(zhuǎn)與傳參跳轉(zhuǎn)

var utils = {};
//公共處理方法
utils.install = function(Vue, option) {
  // 頁(yè)面跳轉(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一下就可以在頁(yè)面用了

import utils from './common/util.js'
Vue.use(utils)
攜帶 userid 跳轉(zhuǎn)到 order 頁(yè)面

togoOrderList(userid) {
  this.togo('/pagesOther/personal/order',{userId: userid})
}


當(dāng)然也可以使用uni三方組件進(jìn)行頁(yè)面跳轉(zhuǎn)







作者:小碼哥

歡迎關(guān)注微信公眾號(hào) :碼出宇宙

掃描添加好友邀你進(jìn)技術(shù)交流群,加我時(shí)注明【姓名+公司(學(xué)校)+職位】