1. 为什么你的小程序总卡在2M上传红线?
做小程序开发的朋友,估计都遇到过这个让人头疼的瞬间:功能写完了,页面也调好了,信心满满地点击上传,结果控制台无情地弹出一个提示——“主包大小超过2M,上传失败”。那一瞬间,是不是感觉心都凉了半截?
我刚开始做小程序的时候,也在这个坑里栽过好几次跟头。小程序平台对包大小有严格的限制:主包(也叫分包)不能超过2M,整个小程序所有分包加起来的总和不能超过16M。这个限制对于初期的小应用还好,一旦你的产品功能丰富起来,加了很多页面,特别是引入了大量高清图片、图标、背景图之后,2M的额度简直是分分钟被秒杀。
你可能试过压缩图片,把能删的代码都删了,但发现还是治标不治本。这时候,分包加载就成了你必须掌握的“救命稻草”。简单来说,分包就是把你的小程序划分成多个部分,用户打开时只下载最核心的主包,其他部分(比如某个功能模块、某个活动页面)等到用户真正需要的时候再去下载。这就像你去一个大型游乐场,进门只拿一张核心地图,想玩过山车了,再去过山车区域的导览台拿详细指南,而不是一进门就抱着一本厚厚的全书,又重又慢。
而今天我们要重点聊的,是分包里一个特别容易被忽视,但又极其“占地方”的部分——图片资源。很多开发者知道把页面和组件分包,却忘了static目录下的图片默认是全部打进主包的。一个活动页面的几张宣传大图,可能就几百K甚至上M了,这主包能不大吗?所以,图片分包是进阶优化中至关重要的一环。接下来,我就把自己在实际项目中摸索出来的、一套完整的图片分包配置方法分享给你,从目录设计到代码配置,手把手带你绕过我踩过的那些坑。
2. 分包基础:先给页面和组件找个新家
在动手处理图片之前,我们得先把小程序本身的代码结构用分包理顺。这是优化包体积的第一步,也是最基础的一步。
2.1 理解 pages.json 中的分包配置
在 UniApp 里,所有的页面路由和分包信息都在 pages.json 这个文件里配置。主包页面直接写在 pages 节点下,而分包则写在 subPackages 节点里。
这里有个关键点,也是新手常犯的错误:一个页面路径,不能既声明在 pages 里,又声明在某个 subPackages 里。系统会报错。你必须清晰地规划好,哪些页面是用户一进来就要用的(比如首页、我的页面),这些放主包;哪些是特定场景下才用的(比如商品详情、活动专题、设置页面),这些放到对应的分包里。
举个例子,假设我们有一个电商小程序,结构如下:
{
"pages": [
{
"path": "pages/index/index",
"style": { "navigationBarTitleText": "首页" }
},
{
"path": "pages/user/user",
"style": { "navigationBarTitleText": "我的" }
}
],
"subPackages": [
{
"root": "subpkg_product",
"pages": [
{
"path": "detail/detail",
"style": { "navigationBarTitleText": "商品详情" }
},
{
"path": "list/list",
"style": { "navigationBarTitleText": "商品列表" }
}
]
},
{
"root": "subpkg_activity",
"pages": [
{
"path": "coupon/coupon",
"style": { "navigationBarTitleText": "领券中心" }
}
]
}
]
}
上面这段配置意味着:
- 主包 (
pages) 包含了index(首页)和user(我的)两个页面。 - 我们创建了两个分包:
- 第一个分包的根目录是
subpkg_product,它下面有detail和list两个页面。 - 第二个分包的根目录是
subpkg_activity,它下面有coupon页面。
- 第一个分包的根目录是
这样配置后,打包时,subpkg_product 和 subpkg_activity 这两个文件夹里的所有代码(页面、组件、逻辑)都会被打成独立的子包,不会占用主包那宝贵的2M空间。
2.2 组件到底该放哪儿?一个省空间的小技巧
组件分包是另一个优化点。UniApp的自定义组件默认会被打包到主包。假设你在商品详情分包里用到了一个非常复杂的 sku-sel


3万+

被折叠的 条评论
为什么被折叠?



