Apache ECharts 源码构建:自定义项目打包
在数据可视化项目开发中,我们经常需要根据实际需求精简图表库体积,只保留项目必需的图表类型和功能模块。Apache ECharts 作为功能强大的可视化库,默认打包包含了全部图表类型和组件,这会导致生产环境中加载冗余代码。本文将详细介绍如何通过源码构建实现 ECharts 自定义打包,只包含项目所需的核心功能,从而优化加载性能。
构建前准备
环境要求
ECharts 源码构建依赖 Node.js 和 npm 环境,确保你的开发环境满足以下要求:
- Node.js 14.0.0 或更高版本
- npm 6.0.0 或更高版本
获取源码
首先需要从官方仓库克隆 ECharts 源码:
git clone https://gitcode.com/gh_mirrors/echarts16/echarts.git
cd echarts
安装依赖
进入项目目录后,执行以下命令安装构建所需的依赖包:
npm install
依赖配置信息可参考项目根目录下的 package.json 文件,其中定义了构建过程中使用的 rollup、terser 等工具版本信息。
构建配置解析
ECharts 的构建系统基于 Rollup 实现,通过配置文件定义不同的打包方案。构建入口文件为 build/build.js,该文件处理命令行参数并调用相应的配置生成函数。
主要构建参数
通过分析 build/build.js 源码,我们可以了解到主要的构建参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| --type | 指定构建类型,可选值:all、common、simple 或自定义组合 | --type common |
| --min | 是否生成压缩版本 | --min |
| --format | 输出格式,可选:umd、amd、iife、cjs、esm | --format esm |
构建类型说明
ECharts 提供了三种预设的构建类型,定义在 build/config.js 中:
- all:包含所有图表类型和组件(默认)
- common:包含常用图表和组件,体积中等
- simple:只包含基础图表和组件,体积最小
通过组合这些类型,我们可以实现更精细的打包控制。例如,--type common,simple 将同时构建 common 和 simple 两种类型的包。
自定义构建实践
基础构建命令
以下是几个常用的基础构建命令及其效果:
构建完整版本(非压缩)
node build/build.js --type all
该命令将在 dist 目录下生成完整的未压缩版本 echarts.js。
构建精简压缩版本
node build/build.js --type simple --min
该命令将生成最小化的精简版本 echarts.simple.min.js,仅包含基础图表功能。
构建 ES Module 格式
node build/build.js --type common --format esm --min
该命令将生成 ES Module 格式的压缩版本 echarts.esm.min.js,适用于现代前端工程化项目。
自定义模块选择
ECharts 的模块化设计允许我们通过修改入口文件实现更精细的模块选择。默认入口文件为 index.js,我们可以复制该文件并修改,只导入项目所需的模块。
例如,创建一个自定义入口文件 my-echarts.js:
// 引入核心模块
import * as echarts from './src/echarts';
// 只引入柱状图和折线图
import './src/chart/bar';
import './src/chart/line';
// 只引入必要的组件
import './src/component/tooltip';
import './src/component/legend';
export default echarts;
然后修改 build/config.js,添加一个新的配置项指向自定义入口文件:
createCustom: function(opt) {
return createConfig({
input: 'my-echarts.js',
output: {
name: 'echarts',
file: `dist/echarts.custom${opt.min ? '.min' : ''}.js`,
format: opt.format
},
min: opt.min
});
}
最后使用新的配置进行构建:
node build/build.js --type custom --min
构建结果分析
构建完成后,生成的文件位于 dist 目录下。我们可以通过比较不同构建类型的文件大小,了解自定义打包带来的优化效果:
| 构建类型 | 文件 | 大小(约) | 包含内容 |
|---|---|---|---|
| all | echarts.js | 2.5MB | 所有图表和组件 |
| all(压缩) | echarts.min.js | 750KB | 所有图表和组件(压缩后) |
| common | echarts.common.js | 1.8MB | 常用图表和组件 |
| common(压缩) | echarts.common.min.js | 550KB | 常用图表和组件(压缩后) |
| simple | echarts.simple.js | 1.2MB | 基础图表和组件 |
| simple(压缩) | echarts.simple.min.js | 380KB | 基础图表和组件(压缩后) |
| 自定义 | echarts.custom.min.js | 200-500KB | 根据选择的模块而定 |
高级优化技巧
主题定制
ECharts 支持自定义主题,我们可以将常用主题打包到构建结果中,避免运行时加载。主题文件位于 theme/ 目录下,例如 theme/macarons.js 是一个美观的主题配置。
要将主题内置到构建中,可以在自定义入口文件中导入主题:
import './theme/macarons';
然后在代码中直接使用:
echarts.init(dom, 'macarons');
语言包处理
ECharts 提供了多语言支持,语言文件位于 i18n/ 目录。如果项目只需要中文,可只保留中文语言包,减少不必要的国际化代码。
按需加载替代方案
对于大型项目,除了自定义构建外,还可以使用 ECharts 提供的按需加载方案。通过官方提供的 echarts/lib/ 目录下的模块,配合 webpack 等构建工具实现按需引入:
// 只引入核心模块
import * as echarts from 'echarts/lib/echarts';
// 引入柱状图
import 'echarts/lib/chart/bar';
// 引入提示框组件
import 'echarts/lib/component/tooltip';
// 初始化图表
const myChart = echarts.init(document.getElementById('main'));
myChart.setOption({/* ... */});
这种方式不需要修改 ECharts 源码,更适合大多数前端工程化项目。
构建流程自动化
为了简化自定义构建过程,可以在 package.json 的 scripts 部分添加自定义构建命令:
"scripts": {
"build:custom": "node build/build.js --type custom --min",
"build:esm": "node build/build.js --type common --format esm --min",
"build:smallest": "node build/build.js --type simple --min"
}
然后通过 npm 命令直接调用:
npm run build:custom
常见问题解决
构建失败:依赖版本冲突
如果遇到依赖版本冲突,可以尝试删除 node_modules 目录和 package-lock.json 文件,然后重新安装依赖:
rm -rf node_modules package-lock.json
npm install
构建后的文件无法正常工作
这通常是由于缺少必要的模块导致的。可以通过以下步骤排查:
- 检查控制台错误信息,确定缺少的模块
- 在自定义入口文件中添加对应的模块导入
- 重新构建并测试
如何验证构建结果
ECharts 源码中提供了丰富的测试用例,位于 test/ 目录下。你可以通过以下命令启动测试服务器:
npm run dev
然后访问 http://localhost:8080/test,选择相应的测试用例验证构建结果是否正常工作。
总结与展望
通过自定义源码构建,我们可以大幅减小 ECharts 库的体积,提升项目加载性能。本文介绍的方法适用于对加载性能有较高要求的生产环境,特别是移动端和低带宽场景。
随着前端工程化的发展,ECharts 也在不断优化其模块化设计。未来,我们可以期待更便捷的自定义构建工具和更精细的模块划分,进一步降低使用门槛,同时提供更大的灵活性。
希望本文能帮助你更好地理解 ECharts 的构建系统,实现最适合自己项目的定制化打包方案。如果你在实践过程中遇到任何问题,欢迎查阅官方文档或提交 issue 反馈。
提示:定期关注 ECharts 官方仓库的更新,新版本可能会提供更优的构建方案和更小的默认包体积。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



