如何使用分包以及分包頁面的分享(微信小程序)

1.分包

為什么使用分包
小程序第一版 推出 小程序代碼包不能超過1MB 大小,所以,小程序可以秒開,但是隨著業(yè)務(wù)的發(fā)展,又推出整個小程序所有分包大小不超過 8M,而8M不能秒開,于是就推出分包加載。

對于小程序而言

整個小程序所有分包大小不超過 8M
單個分包/主包大小不能超過 2M

在小程序啟動時,默認會下載主包并啟動主包內(nèi)頁面
當用戶用戶進入分包內(nèi)某個頁面時,客戶端會把對應分包下載下來,下載完成后再進行展示。

分包支持版本

微信客戶端 6.6.0,基礎(chǔ)庫 1.7.3 及以上版本開始支持。開發(fā)者工具請使用 1.01.1712150 及以上版本

對于小程序游戲而言

目前小游戲分包大小有以下限制:

整個小游戲所有分包大小不超過 8M
單個分包/主包大小不能超過 4M

分包支持版本

微信 6.6.7 客戶端,2.1.0 及以上基礎(chǔ)庫開始支持,請更新至最新客戶端版本,開發(fā)者工具請使用 1.02.1806120 及以上版本


分包步驟

小程序的分包步驟

step1:
添加項目目錄

├── app.js
├── app.json
├── app.wxss
├── packageA
│ └── pages
│ ├── cat
│ └── dog
├── packageB
│ └── pages
│ ├── apple
│ └── banana
├── pages
│ ├── index
│ └── logs
└── utils

step2:
在app.json中的目錄結(jié)構(gòu)中添加分包目錄("subpackages"或"subPackages"都可以)

{
  "pages":[
    "pages/index",
    "pages/logs"
  ],
  "subpackages": [
    {
      "root": "packageA",
      "pages": [
        "pages/cat",
        "pages/dog"
      ]
    }, {
      "root": "packageB",
      "name": "pack2",
      "pages": [
        "pages/apple",
        "pages/banana"
      ]
    }
  ]
}

step3:
分包配置
subpackages里面的配置項包括

root String 分包根目錄
name String 分包別名,分包預下載時可以使用
pages StringArray 分包頁面路徑,相對與分包根目錄
independent Boolean 分包是否是獨立分包

打包規(guī)則

1.聲明 subpackages 后,將按 subpackages 配置路徑進行打包,2.subpackages 配置路徑將作為分包打包,其他都被打包到 app(主包) 中
3.app(主包)也可以有自己的 pages(即最外層的 pages 字段)
4.subpackage 的根目錄不能是另外一個 subpackage 內(nèi)的子目錄
5.tabBar 頁面必須在 app(主包)內(nèi)
6.每個分包都可以使用自己分包內(nèi)的資源以及引用require app里面的資源,但是分包與分包之間 ,都是不可通信的,分包與主包下的pages里面的內(nèi)容也是不可通信的(這一點有待考證)

分包預下載

基礎(chǔ)庫 2.3.0 開始支持,低版本需做兼容處理。 開發(fā)者工具請使用 1.02.1808300 及以上版本,可點此下載。
目前只支持通過配置方式使用,暫不支持通過調(diào)用API完成。

通過配置,在進入小程序某個頁面時,由框架自動預下載可能需要的分包,提升進入后續(xù)分包頁面時的啟動速度。

配置方法

在app.json中增加 preloadRule 配置來控制。
{
  "pages": ["pages/index"],
  "subpackages": [
    {
      "root": "important",
      "pages": ["index"],
    },
    {
      "root": "sub1",
      "pages": ["index"],
    },
    {
      "name": "hello",
      "root": "path/to",
      "pages": ["index"]
    },
    {
      "root": "sub3",
      "pages": ["index"]
    },
    {
      "root": "indep",
      "pages": ["index"],
      "independent": true
    }
  ],
  "preloadRule": {
    "pages/index": {
      "network": "all",
      "packages": ["important"]
    },
    "sub1/index": {
      "packages": ["hello", "sub3"]
    },
    "sub3/index": {
      "packages": ["path/to"]
    },
    "indep/index": {
      "packages": ["__APP__"]
    }
  }
}

以上配置

key 是頁面路徑,value 是進入此頁面的預下載配置,

packages的 value是StringArray 類型,表示進入頁面后預下載分包的 root 或 name。APP 表示主包。

network 是string類型 默認 為 'wifi' ,標識在指定網(wǎng)絡(luò)下預下載,
可選值為
all: 不限網(wǎng)絡(luò)
wifi: 僅wifi下預下載

同一個分包中的頁面享有共同的預下載大小限額 2M(一個分包內(nèi)的所有頁面加總只有2M預下載),限額會在工具中打包時校驗。

獨立分包

小程序游戲不支持獨立分包。

微信客戶端 6.7.2,基礎(chǔ)庫 2.3.0 及以上版本開始支持。開發(fā)者工具請使用 1.02.1808300 及以上版本,可點此下載

1.從獨立分包中頁面進入小程序時,不需要下載主包。
2.從普通的分包頁面進入小程序時,首先下載主包;

優(yōu)勢:提升分包頁面的啟動速度。

配置方法

app.json的subpackages字段中對應的分包配置項中定義independent字段聲明對應分包為獨立分包。
{
  "pages": [
    "pages/index",
    "pages/logs"
  ],
  "subpackages": [
    {
      "root": "moduleA",
      "pages": [
        "pages/rabbit",
        "pages/squirrel"
      ]
    }, {
      "root": "moduleA",
      "pages": [
        "pages/pear",
        "pages/pineapple"
      ],
      "independent": true
    }
  ]
}

普通分包的所有限制都對獨立分包有效。獨立分包隸屬于普通分包

注意

獨立分包中不能依賴主包和其他分包中的內(nèi)容,如:js文件、template、wxss、自定義組件、插件等,
避免在獨立分包頁面中使用 app.wxss 中的樣式;

App 只能在主包內(nèi)定義
獨立分包中暫時不支持使用插件。

1.獨立分包運行時,App 并不一定被注冊,
即 getApp() 可能死兩種情況,a: 可以獲得 App 對象,b. undefined

為了在獨立分包中滿足這一需求,基礎(chǔ)庫 2.2.4 版本開始 getApp支持 allowDefault參數(shù),在 App 未定義時返回一個默認實現(xiàn)。當主包加載,App 被注冊時,默認實現(xiàn)中定義的屬性會被覆蓋合并到真正的 App 中。


獨立分包中

const app = getApp({allowDefault: true}) // {}
app.data = 456
app.global = {}

app.js 中

App({
  data: 123,
  other: 'hello'
});
console.log(getApp()) // {global: {}, data: 456, other: 'hello'}

當從獨立分包啟動小程序時,主包中 App 的 onLaunch 和首次 onShow 會在從獨立分包頁面首次進入主包或其他普通分包頁面時調(diào)用。

注意
1.分享路徑必須去除前面的斜線,否則會出現(xiàn)報錯 某某頁面不應該出現(xiàn)在分包頁面中
2.無法在首頁或tabbar頁打開分包中的頁面,必須先鏈接到非首頁或tabbar頁面,再進行跳轉(zhuǎn)到分包中的頁面。
3.每個頁面的js文件必須初始化page({})。
4.tabBar 頁面必須在 app(主包)內(nèi)
5.一些公共用到的自定義組件,需要放在主包內(nèi)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容