分包加载需在manifest.json中显式开启对应平台的subPackages开关,且subPackages的name必须与preloadRule.packages严格一致,否则分包完全不生效;路径须为root下的相对路径,wxcomponents需通过copy配置移入分包。

分包加载能直接把主包体积压下来,冷启动时间缩短30%–50%,但没配对配置项或路径写错,它就完全不工作——不是慢,是根本不会触发下载。
manifest.json 必须显式开启 subPackages 开关
uni-app 的分包机制默认是关闭的,哪怕 pages.json 里写了 subPackages,没在 manifest.json 对应平台节点下打开开关,整个分包逻辑都会静默失效。
- 微信小程序:在
mp-weixin节点下加"optimization": {"subPackages": true} - App 端:在
app-plus节点下同样配置"optimization": {"subPackages": true} - H5 端不用配,也不生效
- 漏掉这行,
subPackages配置形同虚设,控制台也不会报错,只会“假装加载”
pages.json 中 subPackages 的路径必须是 root 下的相对路径
subPackages 里的 pages 列表不能写全路径,比如不能写 "pages/subpkg/home/index",而必须相对于 root 目录来写。
- 正确写法:
"root": "subpkg"+"pages": ["home/index"]→ 实际路径是subpkg/home/index.vue - 错误写法:
"pages": ["subpkg/home/index"]或"pages": ["pages/subpkg/home/index"]→ 编译时可能不报错,但运行时页面白屏或 404 - 注意:所有分包页面的
path字段值(即路由路径)仍按全局路径注册,比如访问/subpkg/home/index,但文件结构必须严格匹配root+ 相对路径
预加载规则要绑定到已存在的主包页面,且 packages 名称必须和 subPackages.name 一致
预加载不是“写上就生效”,它依赖两个硬性匹配:触发页面必须在主包中存在,且 packages 数组里的名称要和 subPackages 里定义的 name 完全一致。
-
subPackages中必须显式声明name字段,例如:{"root": "subpkg", "name": "user", "pages": ["mine/index"]} -
preloadRule中引用时必须用"user",而不是目录名"subpkg"或路径名 - 触发页面(如
"pages/index/index")必须属于pages数组,不能是subPackages里的页面 - 网络条件
network推荐设为"all",避免弱网下预加载被跳过
微信原生组件(wxcomponents)放入分包需额外 copy 配置
微信官方要求 wxcomponents 必须放在主包,但 uni-app 可通过 copy 配置绕过限制——这是减小主包体积的关键操作,尤其当你用了日历、地图等大体积原生组件时。
- 在
subPackages对象内添加"copy": {"wxcomponents": ["wxcomponents/my-calendar"]} - 路径必须是项目根目录下的真实路径,且组件需已存在于工程中
- uni-app 编译时会将该组件复制进对应分包的
__wx__虚拟目录,并重写引用路径 - 漏掉
copy配置,组件仍会被打包进主包,200KB 日历组件可能直接让主包突破 2MB 限制
最容易被忽略的是 manifest.json 的开关和 subPackages.name 与 preloadRule.packages 的字符串一致性——这两个地方出错,没有任何提示,但预加载和分包加载全部失效。调试时建议先检查 uni.getSubNVueById 或真机日志里的分包下载记录,比看控制台更可靠。


















