必须通过开发者工具“代码依赖分析”或手动检查unpackage/dist/build/mp-weixin目录文件大小来定位主包体积大户,>500KB的.js/.png文件及未正确外部化的静态资源是主要超限来源。

主包超 2MB 不会报错,而是在微信开发者工具上传时直接拦截,且不提示具体哪部分超标——必须自己动手摸清真实体积构成,否则所有优化都是蒙眼打靶。
怎么快速定位主包里哪个文件在撑大体积
别信 HBuilderX 构建日志里的模糊提示,它只告诉你“可能超了”,不列具体文件。真正有效的路径是:
- 执行
npm run build:mp-weixin后,打开unpackage/dist/build/mp-weixin目录 - 右键 → “在资源管理器中打开”,对每个子目录(尤其是
pages/、components/、static/)按大小排序 - 重点盯 >500KB 的
.js或.png文件;node_modules不进分包,但static/下的图片、components/里被多处引用的组件 JS 全算 - 用
npx size-limit配合size-limit.config.js测主包入口(如app.js、pages/index/index.js),确认是否因动态 import 被误打包或 scoped 样式重复注入
静态资源外部化为什么改了路径体积还不变
常见误区是把图片从 static/ 拖到 CDN 就完事——只要代码里还用 require()、import 或相对路径 v-bind:style 引用,Webpack 就照常打包进去,CDN 白配。
- 图片必须写死绝对 HTTPS URL:
<image :src="'https://cdn.example.com/logo.png'>,禁用require('@/static/logo.png') - CSS 中字体要用
@font-face { src: url('https://cdn.example.com/font.woff2'); },不能放static/fonts/再@import - 背景图同理:
background-image: url('https://cdn.example.com/bg.jpg');,带变量拼接(如url(${cdn}/a.png))也会触发全量打包 - 外部化后必须加 fallback:图片加载失败显示占位符,
uni.downloadFile下载的资源不算包体积,但首屏延迟高,不能替代外部化
preloadRule 配错反而让主包更大
微信的 preloadRule 不区分主包分包,配置不当会把本该在 subN/ 里的页面 JS/WXML/WXSS 强行拉进主包缓存。
- 避免给
"*"或"pages/**"配 preload,这等于告诉微信“所有页面都提前下”,主包瞬间膨胀 - 只对高频访问且路径明确的分包页面配,例如:
"subA/pages/detail/detail": { "network": "all", "packages": ["subA"] } - 检查
app.json里的subPackages数组是否漏写了某个页面路径——漏写 = 归入主包 - 主包里放的组件如果被分包页面 import,UniApp 默认会提至主包;想避免,就用
import()动态引入,或把组件挪进对应分包目录
最易被忽略的点:国际化语言包如果全塞进主包(比如 zh-CN.js + en-US.js + ja-JP.js),动辄 800KB 起步;正确做法是主包只留默认语言,其余按分包页面懒加载,靠 mergeLocaleMessage 增量合并——这个动作不在构建阶段发生,不占包体积,但很多人卡在 loader 配置或路径 resolve 上,一试就报 Cannot find module。


















