博客 / 詳情

返回

uniapp微信小程序分包以及分包優化

分包限制説明

微信小程序上傳項目時會有分包大小限制,官方文檔介紹:
目前小程序分包大小有以下限制:

  • 整個小程序所有分包大小不超過 30M(服務商代開發的小程序不超過 20M)
  • 單個分包/主包大小不能超過 2M

主包就是Tabbar頁面,所有的Tabbar頁面加起來的文件大小不能超過2M
在小程序啓動時,默認會下載主包並啓動主包內頁面,當用户進入分包內某個頁面時,客户端會把對應分包下載下來,下載完成後再進行展示。

你可以在這裏查看當前項目的分包大小和依賴分析

uniapp分包

pages.json文件中

  • pages 主包
  • subPackages 子包

uniapppages.json文件中,pages存儲的是主包,一般我們的Tabbar頁面都會寫在pages
另外,根目錄除了你配置的子包,都算在主包內,比如:

  • components
  • static
  • uni_modules
  • utils
  • ...

所以我們在引入第三方組件、公共方法、靜態資源時需要注意主包占用空間
下面是一個分包的示例:

{
    "pages": [ //pages數組中第一項表示應用啓動頁,參考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/home/index",
            "style": {
                "navigationBarTitleText": "首頁",
                "navigationStyle": "custom", // 隱藏系統導航欄
                "navigationBarTextStyle": "white" // 狀態欄字體為白色,只能為 white-白色,black-黑色 二選一
            }
        }
    ],
    "subPackages": [
        {
            "root": "subPackages/login", // 子包的根目錄
            "pages": [
                {
                    "path": "pages/login/index",
                    "style": {
                        "navigationBarTitleText": "",
                        "navigationStyle": "custom",
                        "navigationBarBackgroundColor": "#ffffff"
                    }
                }
            ]
        },
        {
            "root": "subPackages/setting", // 子包的根目錄
            "pages": [
                {
                    "path": "pages/system/index",
                    "style": {
                        "navigationBarTitleText": "設置",
                        "navigationBarTextStyle": "black",
                        "navigationBarBackgroundColor": "#F3F3F3"
                    }
                },
                {
                    "path": "pages/user/index",
                    "style": {
                        "navigationBarTitleText": "用户設置",
                        "navigationBarTextStyle": "black",
                        "navigationBarBackgroundColor": "#F3F3F3"
                    }
                }
            ]
        }
    ]
}

結構如下:

Project
├─ subPackages
│  ├─ setting
│  │  └─ pages
│  │     ├─ user
│  │     │  └─ index.vue
│  │     └─ system
│  │        └─ index.vue
│  └─ login
│     └─ pages
│        └─ login
│           └─ index.vue
└─ pages
   └─ home
      └─ index.vue

Project為你的項目文件夾,其中pages為主包,而subPackages為子包
subPackages內有兩個子包,分別是settinglogin
按照官方的説法,子包其實可以跟pages同級,你只需要在subPackages配置的root裏配置好路徑即可,我在這裏將所有子包都寫在subPackages文件夾內,方便統一管理
之後你正常寫頁面即可,主包和子包已經分好了,Tabbar的頁面就寫在pages裏,非Tabbar頁面就寫在subPackages內。

頁面跳轉
跳子包

uni.navigateTo({
  url: '/subPackages/setting/pages/user/index'
});

跳主包

uni.navigateTo({
  url: '/pages/home/index'
});

頁面跳轉沒有什麼區別,正常跳就好了

分包優化

uniapp配置manifest.json啓用分包優化


manifest.json內配置

"mp-weixin": {
 
   "optimization":{"subPackages":true}
 
}

分包預加載配置

目的:當我們進到某個頁面時,有些子包訪問概率很大,可以預先加載子包資源,提升進入後續分包頁面時的啓動速度
preloadRule中,key是頁面路徑,value是進入此頁面的預下載配置,每個配置有以下幾項:

假如,你進入登錄頁後,需要預先加載subPackages/setting子包,配置如下:
pages.json

    "preloadRule": {
        "subPackages/login/pages/login/index": { // 指定頁面
            "network": "all", //指定網絡 all 不限網絡   wifi:僅wifi
            "packages": ["subPackages/setting"] // 進入指定頁面後需要加載的分包 root 或 name
        }
    },


當你進入指定頁面後,比如登錄頁,控制枱打印preloadSubpackages: success則説明分包預加載成功了。

節省uni_modules的體積佔用

有時候我們在插件市場下載的組件只在某個子包內使用,此時可以直接將uni_modules移到子包內,這樣可以減少主包的體積

像這樣,直接移到子包的根目錄,你在對應頁面使用的時候需要按照路徑引入

<template>
  <view>
    <KevyEmpty/>
  </view>
</template>

<script setup>
import KevyEmpty from '@/subPackages/setting/uni_modules/kevy-empty/components/kevy-empty/kevy-empty.vue';
</script>

參考文檔:
分包加載
關於分包優化的説明
preloadRule分包預加載

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.