# 分包优化
本项目基于 [@uni-ku/bundle-optimizer](https://github.com/uni-ku/bundle-optimizer) 分包优化插件,实现 uni-app Vue3 项目分包优化插件,解决小程序主包体积超限问题。
:::tip 提示
本章节基于 @uni-ku/bundle-optimizer@2.x 版本编写,1.x 版本请参考 [@uni-ku/bundle-optimizer](https://github.com/uni-ku/bundle-optimizer) 文档处理。
:::
## 插件简介
### 为什么需要这个插件?
uni-app Vue3(vite 构建)官方为了"简化配置",移除了 Vue2(webpack 构建)中内置的分包优化逻辑。这导致所有第三方库、公共组件、工具函数全部打进 `common/vendor.js`,主包体积瞬间超限,无法满足微信小程序 2 MB 限制。
**@uni-ku/bundle-optimizer** 把官方砍掉的「自动拆包」能力补了回来,并提供:
- **分包优化**:自动将公共依赖抽离到主包,各分包仅保留自用代码
- **模块异步跨包调用**:使用 `import()` 语法异步引用模块
- **组件异步跨包引用**:通过 `componentPlaceholder` 配置实现
### 功能特性
| 功能 | 说明 |
|---|---|
| 分包优化 | 自动将公共依赖抽离到主包,控制主包体积 |
| 模块异步跨包调用 | 允许使用 `import()` 语法,异步引用 JS/TS 模块 |
| 组件异步跨包引用 | 通过 `componentPlaceholder` 配置,实现组件异步跨包引用 |
### 适用范围
> ⚠️ **暂时不支持 App 平台**
适用于 uni-app CLI 或 HBuilderX 创建的 Vue3 项目
---
## 快速上手
> 本项目已集成 @uni-ku/bundle-optimizer 插件,无需额外安装。
### 1. 安装插件
```bash
pnpm add -D @uni-ku/bundle-optimizer
```
### 2. 配置 vite.config.ts
```ts
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import Optimization from '@uni-ku/bundle-optimizer'
export default defineConfig({
plugins: [
uni(),
Optimization({
logger: false, // 是否输出日志
}),
],
})
```
### 3. 开启微信小程序分包优化
在 `manifest.json` 或 `manifest.config.ts` 中配置:
```json
{
"mp-weixin": {
"optimization": {
"subPackages": true
}
}
}
```
或使用 `@uni-helper/vite-plugin-uni-manifest`:
```ts
// manifest.config.ts
import { defineManifestConfig } from '@uni-helper/vite-plugin-uni-manifest'
export default defineManifestConfig({
'mp-weixin': {
optimization: {
subPackages: true,
},
},
})
```
### 4. (可选)添加 TypeScript 类型支持
在 `tsconfig.json` 中添加:
```json
{
"compilerOptions": {
"types": ["@uni-ku/bundle-optimizer/client"]
}
}
```
或在入口文件顶部添加:
```ts
///
```
---
## 使用示例
### 模块异步跨包调用
使用 ESM 原生异步导入语法 `import()` 来实现模块的异步引入:
```ts
// 异步引入 JS/TS 模块
import('@/pages-sub-pkg/utils/encrypt.ts').then((mod) => {
mod?.aesEncrypt('hello')
})
// 或使用 async/await
const mod = await import('@/pages-sub-pkg/utils/encrypt.ts')
mod?.aesEncrypt('hello')
```
> ⚠️ **注意**:不要使用 `import('./Comp.vue').then(...)` 动态导入 Vue 文件,这会导致组件/页面空白,与分包优化逻辑冲突。
### 组件异步跨包引用
通过 `componentPlaceholder` 配置实现组件异步跨包引用:
#### 方式一:使用 `
```
#### 方式二:使用选项式 API
```vue
```
> 💡 **提示**:`componentPlaceholder` 的值通常填写 `'view'` 即可。
---
## 本项目中的使用
### 配置说明
本项目已完整接入 `@uni-ku/bundle-optimizer` 插件,配置如下:
#### vite.config.ts 配置
```ts
import Optimization from '@uni-ku/bundle-optimizer'
export default defineConfig({
plugins: [
// ... 其他插件
Optimization({
logger: false,
}),
],
})
```
#### manifest.config.ts 配置
```ts
export default defineManifestConfig({
'mp-weixin': {
optimization: {
subPackages: true,
},
},
})
```
#### 分包配置
在 `vite.config.ts` 中配置了三个分包:
```ts
UniHelperPages({
subPackages: [
'src/subPages',
'src/subEcharts',
'src/subAsyncEcharts',
],
})
```
### 实际使用示例
#### 异步组件跨包引用示例
在 `src/subAsyncEcharts/asyncEcharts/index.vue` 中,展示了如何异步引用来自 `src/subEcharts` 分包的图表组件:
```vue
饼图示例
```
这个示例展示了:
1. 从 `subEcharts` 分包异步引用多个图表组件
2. 使用 `componentPlaceholder` 配置所有异步组件
3. 在模板中正常使用这些组件
### 验证效果
构建项目并使用微信开发者工具查看主包大小:
```bash
pnpm build:mp-weixin
```
使用微信开发者工具的「构建分析」功能对比主包大小,可以看到分包优化带来的体积缩减效果。
---
## 常见问题
### Q: 主包体积没有变化?
A: 检查 `manifest.json` 或 `manifest.config.ts` 中是否开启了 `mp-weixin.optimization.subPackages: true`。
### Q: 组件或页面空白?
A: 可能使用了 `import('./Comp.vue').then(...)` 动态导入 Vue 文件,请改用 `componentPlaceholder` 配置式方案。
### Q: 如何配置异步组件?
A: 使用 `componentPlaceholder` 配置,通常填 `'view'` 即可。
### Q: 支持 App 平台吗?
A: 暂不支持 App 平台,未来是否支持未知。
### Q: 为什么要使用原生 `import()`?
A: 降低学习成本,提供更好的 IDE 类型支持,并使代码更符合标准。
---
## 参考资料
- [@uni-ku/bundle-optimizer 官方文档](https://github.com/uni-ku/bundle-optimizer)
- [微信小程序分包异步加载](https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/async.html)