UniApp 微信小程序分包加载与体积优化实战:从首屏 4s 到 1s
小程序先给结论:UniApp 打包微信小程序最容易被卡住的两件事——主包超 2MB 传不上、首屏几秒才出来。根因几乎都是「东西全塞主包」。解法就一句:用分包把非首屏页面拆出去,再把图片和组件做减法。本文给可直接抄的 pages.json 分包配置和体积红线。
一、为什么要分包
- 主包体积红线:微信小程序主包上限 2MB(含所有首屏必要资源),整包(主包+分包)上限 20MB。主包超 2MB 直接上传失败。
- 首屏速度:主包越小,首次启动下载越快。主包臃肿是首屏 3~4s 的元凶。
- 按需加载:分包里的页面用到时才下载,不占首屏。
二、分包配置(pages.json 直接抄)
把非首屏的页面挪到 subPackages,每个分包有自己的 root 和 pages:
{
"pages": [
"pages/index/index",
"pages/mine/mine"
],
"subPackages": [
{
"root": "packageA",
"pages": [
"detail/detail",
"list/list"
]
},
{
"root": "packageB",
"pages": [
"order/order",
"pay/pay"
]
}
]
}
要点:pages 只放首屏必备(首页、我的);其余按业务拆到多个分包。分包之间不能互相引用,但都能引用主包公共资源。
三、体积红线与优化清单
| 项目 | 红线 / 建议 | 做法 |
|---|---|---|
| 主包 | ≤ 2MB(硬上限) | 只留首屏页 + 公共组件/样式/小程序 tabBar 图标 |
| 整包 | ≤ 20MB | 靠分包分摊,单分包也别太大 |
| 图片 | 单张 ≤ 100KB 为宜 | 小程序用 CDN 外链,本地只留 tabBar 小图标 |
| 组件库 | 按需引入 | 别整库 import,用到的组件才引 |
四、图片与组件的具体减法
- 图片上 CDN:小程序包里尽量不放业务图片,改用
https://外链(你自己的图床/CDN)。本地只保留 tabBar 图标(必须本地)。 - 组件按需:如果用 uView 等组件库,开启按需引入,别全量打进主包。
- 清理未用资源:打包前删掉没引用的图片、字体、旧页面,这些都会算进体积。
- 打开「运行时压缩」:HBuilderX 发行时勾选压缩,能再小一截。
五、五个常见坑
| 坑 | 原因 | 规避 |
|---|---|---|
| 主包超 2MB 上传失败 | 首屏页引入太多组件/图片 | 把非首屏拆分包,图片走 CDN |
| 分包互相引用报错 | 分包间不可跨引 | 公共部分放主包,分包只引主包 |
| tabBar 图标异常 | 图标用了外链或尺寸不对 | tabBar 图标必须本地、81×81px 起 |
| 首屏仍慢 | 主包虽小但首屏图大 | 首屏图也走 CDN + 懒加载 |
| 分包没生效 | 页面路径写错 root | 核对 subPackages.root 与页面真实目录 |
六、FAQ
Q:分包后能跨分包跳转吗?
能,用 uni.navigateTo 正常跳,路径写全(含分包 root)即可;只是「代码引用」不能跨分包。
Q:主包一定要 ≤2MB 吗? 是硬上限,超了微信开发者工具不让上传。能压到 1.5MB 内更好,首屏更稳。
Q:图片全上 CDN,离线怎么办? 小程序本就在线环境,CDN 图正常;关键图标(tabBar)留本地即可,不影响体验。
小结
UniApp 小程序「传不上 / 首屏慢」九成是主包太胖。记住三件事:首屏页 + 公共件进主包(≤2MB)、其余拆分包、图片走 CDN 只留 tabBar 图标。先把 pages.json 的分包配置改对,再砍图片和组件,首屏从 4s 降到 1s 是常规操作。具体配置以微信小程序官方分包文档和 HBuilderX 当前版本为准。