uni-app小程序分包配置需写在pages.json根级subPackages数组中,路径相对于项目根目录且不带.vue后缀;常见错误包括白屏、404及未生成subN/目录。

uni-app 小程序分包配置不生效?检查 subNVue 和 subPackages 写法差异
uni-app 的分包不是写在 pages.json 的 subNVue 节点里——那是给原生子窗体用的,和分包无关。真正起作用的是 subPackages(注意是复数)数组,必须放在 pages.json 根级,且路径必须相对于项目根目录(不是 src),不能带 .vue 后缀。
常见错误现象:uni.previewImage 点开后白屏、分包页面跳转 404、构建后 dist/build/mp-weixin 里没生成对应 subN/ 目录。
-
subPackages数组里的每个对象必须含root(字符串,如"subPackages/home")和pages(子页面路径数组,如[{"path": "index"}]) - 分包内页面的
path是相对root的,不是全路径;比如root: "subPackages/user",那pages里写{"path": "profile"},对应文件就是subPackages/user/profile.vue - H5 端不支持分包,
uni.switchTab在分包页跳 tabbar 页面时,若目标页未在主包,会静默失败——务必把所有 tabbar 页面留在主包
代码混淆后小程序报 Cannot read property 'xxx' of undefined?关掉 es6 压缩或加 keep_fnames
uni-app 默认用 UglifyJS 做压缩,但微信小程序基础库对 ES6+ 语法兼容有限,尤其混淆后函数名被压缩成单字母,this.xxx 或 methods.xxx 在运行时找不到原名,就崩了。
使用场景:开启 optimization.miniProgram 后,真机调试闪退、开发者工具报错定位到 VMxxxx 行,但源码查不到对应逻辑。
- 最稳妥方案:在
vue.config.js中关闭 ES6 转义,只保留 ES5 压缩:optimization: { miniProgram: { es6: false } } - 若必须保留 ES6,需在
configureWebpack.optimization.minimizer中手动配置 TerserPlugin,加上keep_fnames: true,防止方法名被压缩 - 注意:
uni-app2.9+ 默认启用es6: true,老项目升级后容易踩这个坑
分包体积还是超 2MB?用 uni.getSubNVueById 替代直接 import 大型 SDK
很多团队把 echarts、pdfjs-dist 这类重型库直接 import 到分包页面里,结果单个分包轻松破 1.5MB——微信限制单个分包 ≤2MB,主包 ≤2MB,总包 ≤20MB。
性能影响:大模块进分包,不仅体积超标,还会拖慢分包加载速度,用户首次进入该页面明显卡顿。
- 优先用
require动态导入:比如const echarts = await require('echarts'),确保只在需要时加载 - 更彻底的做法:把大型图表/解析逻辑抽成独立
subNVue窗体,用uni.getSubNVueById通信,主包或公共分包里统一管理实例,避免重复打包 - 检查
node_modules是否被误打进分包——确认subPackages目录下没有node_modules,且package.json的dependencies没有冗余包
为什么 uni.preloadPage 加载后仍卡顿?预加载时机和页面生命周期不匹配
uni.preloadPage 不是“提前渲染”,只是提前下载并解析 JS 文件,页面实例并未创建。如果在 onLoad 里大量初始化数据或调用 uni.createCanvasContext,依然会卡。
容易被忽略的地方:预加载的页面若含自定义组件(尤其是带 v-for 或复杂 computed 的),组件的 created 钩子仍会在首次 show 时执行,无法靠预加载规避。
- 预加载只对 JS 解析有效,CSS 和图片资源仍按需加载,别指望它减少首屏时间
- 适合预加载的页面:路由参数固定、无强依赖后端数据、组件树较浅(比如纯表单页)
- 慎用场景:页面含
uni.chooseImage、uni.getLocation等需用户授权的操作——预加载时触发会弹两次授权框


















