---
title: uni-echarts
iframe: true
iframeFormatter: subEcharts/echarts/index
---
# Echarts
在移动端跨平台开发中,数据可视化是一个常见需求。而 ECharts 作为百度开源的强大图表库,在 Web 端有着广泛的应用,我们在技术栈选择的时候往往倾向于选择这种应用广泛,解决方案完善的库。
但在 uni-app 中直接使用 ECharts 会遇到各种兼容性问题,特别是在小程序端。幸运的是,有很多库可以帮助我们在 `uni-app` 中使用 `Echarts`,例如 `uni-echarts`、`lime-echart` 等插件,为我们提供了相应的解决方案。
本章节中,我们将会在 wot-starter 中,探索 uni-app 接入 `Echarts` 的方案,并针对小程序,对其超级庞大的体积进行优化。
## 为什么选择 uni-echarts?
[uni-echarts](https://github.com/xiaohe0601/uni-echarts) 是一个适用于 uni-app 的 Apache ECharts 组件(仅支持Vue 3),具有以下优势:
- 🚀 **快速上手**:与 [Vue ECharts](https://github.com/ecomfe/vue-echarts) 近乎一致的使用体验
- 📱 **多端兼容**:支持 H5、小程序、APP 等多个平台
- 📦 **支持 easycom**:无需手动导入,开箱即用
- ☕ **TypeScript 支持**:完整的类型定义
- 🍳 **免费商用**:基于 MIT 许可协议
基于以上,选择使用 `uni-echarts` 作为我们的图表库,当然也可以选择 [lime-echart](https://ext.dcloud.net.cn/plugin?id=4899) 。
## 安装和配置
### 1. 安装依赖
首先安装必要的依赖包:
```bash
pnpm add echarts uni-echarts
# 或者
npm install echarts uni-echarts
```
在我们的项目中,`package.json` 已经包含了这些依赖:
```json
{
"dependencies": {
"echarts": "^6.0.0",
"uni-echarts": "^1.1.2"
}
}
```
### 2. Vite 配置
在 `vite.config.ts` 中添加必要的配置:
```typescript
import { defineConfig } from 'vite'
import Uni from '@dcloudio/vite-plugin-uni'
import UniHelperComponents from '@uni-helper/vite-plugin-uni-components'
import { UniEchartsResolver } from 'uni-echarts/resolver'
export default defineConfig({
optimizeDeps: {
exclude:['@wot-ui/ui', 'uni-echarts'] : [],
},
plugins: [
// 组件自动导入
UniHelperComponents({
resolvers: [UniEchartsResolver()],
dts: 'src/components.d.ts',
}),
Uni(),
],
})
```
这样配置后,`uni-echarts` 组件就可以在项目中自动导入使用了,更多信息参见 [Uni ECharts 快速开始](https://uni-echarts.xiaohe.ink/guide/getting-started)。
## 基础使用示例
### 创建一个柱状图组件
让我们以项目中的 `BarChart.vue` 为例,看看如何创建一个基础的柱状图:
```vue
```
### 关键要点说明
1. **provideEcharts(echarts)**:这是使用 uni-echarts 的关键步骤,必须在每个组件中调用
2. **按需导入**:只导入需要的图表类型和组件,减小打包体积
3. **echarts.use()**:注册导入的组件
4. **uni-echarts 组件**:使用 `` 标签渲染图表
## 更多图表类型
更多图表类型见 [Echarts](https://echarts.apache.org/examples/zh/index.html) 和 [Uni ECharts](https://uni-echarts.xiaohe.ink/examples/basic),当然你也可以使用 AI 工具帮助你编写想要的图表配置,它非常善于处理这个事情。
## 高级功能:分包优化与异步加载
引入 `Echarts` 后,体积暴增 800KB ,怎么办?
有办法,我们曾在 [Vue3 uni-app 主包 2 MB 危机?1 个插件 10 分钟瘦身](https://mp.weixin.qq.com/s/nnmu91kclQHnE-1TAn11Tg) 一文中介绍过 `@uni-ku/bundle-optimizer`,它是解决微信小程序超包的利器,我们现在使用它的分包优化和分包异步化能力,来优化引入 `Echarts` 后暴增的小程序体积。
这是我们的项目结构,在 `subEcharts` 分包中实现 `Echarts` 相关组件,在 `subAsyncEcharts` 分包中演示分包异步化效果:
```text
src/
├── pages/ # 主包页面
├── subEcharts/ # ECharts 组件分包
│ └── echarts/
│ └── components/
├── subAsyncEcharts/ # 异步 ECharts 演示分包
│ └── asyncEcharts/
└── subPages/ # 其他功能分包
```
### 安装和配置
#### 1. 安装依赖
```bash
pnpm add -D @uni-ku/bundle-optimizer
# 或者
npm install -D @uni-ku/bundle-optimizer
```
在我们的项目中,`package.json` 已经包含了这个依赖:
```json
{
"devDependencies": {
"@uni-ku/bundle-optimizer": "1.3.15-beta.2"
}
}
```
#### 2. Vite 配置
在 `vite.config.ts` 中配置插件:
```typescript
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: true, // 开启日志输出
}),
],
})
```
#### 3. 小程序分包配置
在 `manifest.json` 中开启分包优化:
```json
{
"mp-weixin": {
"optimization": {
"subPackages": true
}
}
}
```
如果你使用了 `@uni-helper/vite-plugin-uni-manifest` 插件,那么需要在 `manifest.config.ts` 中开启分包优化:
```ts
export default defineManifestConfig({
'mp-weixin': {
optimization: {
subPackages: true,
},
},
})
```
配置完成后,重新构建,我们会发现主包少了 200+KB ,还剩 500KB 在主包中,可以期待 `@uni-ku/bundle-optimizer` 未来可以传送组件到分包中,到时会把大部分构建产物都打包进入分包中。
> 这里配合 lime-echart 的话,应该可以将 echarts.min.js 完全放入分包,各位可以自行探索。
### 跨分包异步组件引用
在我们的项目中,`subAsyncEcharts` 分包可以异步引用 `subEcharts` 分包中的组件:
```vue
```
更多信息参见 [@uni-ku/bundle-optimizer](https://github.com/uni-ku/bundle-optimizer)。
## 注意事项和最佳实践
### 1. 使用 npm 方式安装必须调用 provideEcharts
在每个使用 ECharts 的组件中,都必须调用 `provideEcharts(echarts)`:
```javascript
import * as echarts from 'echarts/core'
import { provideEcharts } from 'uni-echarts/shared'
// 🚨 这一行是必须的
provideEcharts(echarts)
```
### 2. 按需导入组件
为了减小打包体积,建议按需导入需要的图表类型和组件:
```javascript
// 只导入需要的图表类型
import { BarChart, LineChart, PieChart } from 'echarts/charts'
// 只导入需要的组件
import { GridComponent, TooltipComponent, LegendComponent } from 'echarts/components'
// 导入渲染器
import { CanvasRenderer } from 'echarts/renderers'
```
### 3. 设置图表尺寸
使用 `custom-class` 属性设置图表容器的尺寸:
```vue
```
### 4. 响应式数据更新
当需要动态更新图表数据时,直接修改 `option` 对象即可:
```javascript
const option = ref({
// 初始配置
})
// 更新数据
function updateData() {
option.value.series[0].data = [/* 新数据 */]
}
```
### 5. 主题定制
可以通过 `provideEchartsTheme` 来设置自定义主题:
```javascript
import { provideEcharts, provideEchartsTheme } from 'uni-echarts/shared'
import * as echarts from 'echarts/core'
provideEcharts(echarts)
// 设置自定义主题
provideEchartsTheme({
color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de'],
backgroundColor: 'transparent',
// 更多主题配置...
})
```
## 卸载步骤
如果你不再需要在项目中使用 ECharts,可以按照以下步骤完全卸载相关依赖和配置:
### 1. 卸载依赖包
首先卸载 ECharts 相关的依赖包:
```bash
pnpm remove echarts uni-echarts
```
### 2. 清理 Vite 配置
在 `vite.config.ts` 中移除 ECharts 相关的配置:
```typescript
import { defineConfig } from 'vite'
import Uni from '@dcloudio/vite-plugin-uni'
import UniHelperManifest from '@uni-helper/vite-plugin-uni-manifest'
import UniHelperPages from '@uni-helper/vite-plugin-uni-pages'
import UniHelperLayouts from '@uni-helper/vite-plugin-uni-layouts'
import UniHelperComponents from '@uni-helper/vite-plugin-uni-components'
import AutoImport from 'unplugin-auto-import/vite'
import { WotResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'
import { UniEchartsResolver } from 'uni-echarts/resolver' // [!code --]
import UniKuRoot from '@uni-ku/root'
export default async () => {
const UnoCSS = (await import('unocss/vite')).default
return defineConfig({
optimizeDeps: {
exclude: ['@wot-ui/ui', 'uni-echarts'] : [], // [!code --]
exclude: ['@wot-ui/ui',] : [], // [!code ++]
},
plugins: [
UniHelperManifest(),
UniHelperPages({
dts: 'src/uni-pages.d.ts',
subPackages: [
'src/subPages',
],
exclude: ['**/components/**/*.*'],
}),
UniHelperLayouts(),
UniHelperComponents({
resolvers: [WotResolver(), UniEchartsResolver()], // [!code --]
resolvers: [WotResolver()], // [!code ++]
dts: 'src/components.d.ts',
dirs: ['src/components', 'src/business'],
directoryAsNamespace: true,
}),
UniKuRoot(),
Uni(),
// https://github.com/uni-ku/bundle-optimizer
Optimization({
logger: true,
}),
AutoImport({
imports: ['vue', '@vueuse/core', 'pinia', 'uni-app', {
from: '@wot-ui/router',
imports: ['createRouter', 'useRouter', 'useRoute'],
}, {
from: '@wot-ui/ui',
imports: ['useToast', 'useMessage', 'useNotify', 'CommonUtil'],
}, {
from: 'alova/client',
imports: ['usePagination', 'useRequest'],
}],
dts: 'src/auto-imports.d.ts',
dirs: ['src/composables', 'src/store', 'src/utils', 'src/api'],
vueTemplate: true,
}),
UnoCSS(),
],
})
}
```
### 3. 删除相关文件和目录
删除项目中与 ECharts 相关的文件和目录:
```bash
# 删除 ECharts 组件分包目录
rm -rf src/subEcharts/
# 删除异步 ECharts 演示分包目录
rm -rf src/subAsyncEcharts/
```
完成以上步骤后,你的项目就完全移除了 ECharts 相关的依赖和配置,项目体积也会相应减小。
## 总结
我们在 `wot-starter` 中 使用 `uni-echarts` 结合 `@uni-ku/bundle-optimizer` 为 `uni-app` 开发者提供了一个完整的高性能 ECharts 解决方案。通过合理的配置和规范的使用方式,我们可以在各个平台上实现丰富的数据可视化效果,同时保证应用的性能和用户体验。
## 参考资源
- [uni-echarts 官方文档](https://uni-echarts.xiaohe.ink)
- [@uni-ku/bundle-optimizer](https://github.com/uni-ku/bundle-optimizer)
- [ECharts 官方文档](https://echarts.apache.org/zh/index.html)
- [lime-echart](https://ext.dcloud.net.cn/plugin?id=4899)