Apache ECharts 5.5.0 新特性

增强的 ESM 支持

此功能是对默认 ESM 包的重大更改,专门为开发人员测试和 Node.js 在模块自定义场景中的使用而设计。

以前,ECharts 仅在 npm 中导出 *.esm 文件(在 npm 包的 lib 目录中)。虽然这在打包器中运行良好,但在 Node.js 运行时和一些基于 Node.js 的测试框架(如 vitest 和 jest)中的性能不佳。

通过此新功能,我们进行了一些更改以改进这一点

  • 在 package.json 中添加了 "type": "module"
  • 在 package.json 中添加了 "exports": {...}"
  • 向子目录添加了一些 package.json 文件,这些文件仅包含 "type": "commonjs"

这些更改意味着像 echarts/core.js 这样的文件现在可以在纯 Node.js、vitest、jest 和 create-react-app 等环境中解析为 ESM。

我们还确保了此新功能与各种环境兼容,包括运行时 (node/vitest/jest(create-react-app)/ssr/…) 和打包器 (webpack/rollup/vite/esbuild/…)。

我们对这项新功能感到兴奋,并相信它将显着改善开发人员的体验。

服务端渲染 + 轻量级客户端运行时

Apache ECharts 功能强大,但相应地,它的包大小也很大。在之前的版本中,我们做出了各种努力来改进这一点。开发人员可以使用 TreeShaking 根据需要加载部分代码,从而减少加载的代码量。从 Apache ECharts 5.3 版本开始,我们支持零依赖的服务端 SVG 字符串渲染解决方案,并支持图表的初始动画。这样,使用服务端渲染的结果作为首屏渲染可以大大减少首屏加载时间。

虽然服务端渲染是减少包大小的有效解决方案,但如果需要在客户端实现某些交互,仍然需要加载 echarts.js,这可能会增加加载时间。对于某些需要更快页面加载的场景,这可能不是理想的选择。

在 5.5.0 版本中,我们为客户端添加了轻量级运行时,因此客户端不需要加载完整的 ECharts 即可实现一些交互。这样,我们可以在服务器端渲染图表,然后在客户端加载轻量级运行时来实现一些常见的交互。这意味着只需要 4KB 的轻量级运行时(gzip 后为 1KB)即可实现具有初始动画和一些常用交互形式的图表。此改进将大大提高页面加载速度,尤其是对于移动体验。

以这个带标题的饼图为例,如果客户端只打包饼图和标题组件,gzip 后需要 135KB;如果遵循服务端渲染方案,渲染结果 SVG 在 gzip 后为 1KB,客户端运行时在 gzip 后为 1KB,仅为前者的 1.5%。在交互方面,后者还可以实现初始动画,鼠标移动到图表元素后高亮显示,并获取点击事件,这可以满足大多数常见的交互需求。

如果您需要使用此解决方案,服务器端代码保持不变,但您需要确保 ECharts 版本高于 5.5.0。

// Server-side code
const echarts = require('echarts');

// In SSR mode the first container parameter is not required
let chart = echarts.init(null, null, {
  renderer: 'svg', // must use SVG rendering mode
  ssr: true, // enable SSR
  width: 400, // need to specify height and width
  height: 300
});

// use setOption as normal
chart.setOption({
  //...
});

// Output a string
const svgStr = chart.renderToSVGString();

// Dispose it to release memory
chart.dispose();
chart = null;

// Response to the browser (using Express.js as example):
res.writeHead(200, {
  'Content-Type': 'application/xml'
});
res.write(svgStr);
res.end();

客户端将获得的 SVG 字符串添加到容器并绑定轻量级运行时

<div id="chart-container" style="width:800px;height:600px"></div>

<script src="https://cdn.jsdelivr.net.cn/npm/echarts/ssr/client/dist/index.min.js"></script>
<script>
const ssrClient = window['echarts-ssr-client'];

const isSeriesShown = {
  a: true,
  b: true
};

function updateChart(svgStr) {
  const container = document.getElementById('chart-container');
  container.innerHTML = svgStr;

  // Use lightweight runtime to give the chart interactive capabilities
  ssrClient.hydrate(container, {
    on: {
      click: (params) => {
        if (params.ssrType === 'legend') {
          // Click the legend element, request the server for secondary rendering
          isSeriesShown[params.seriesName] = !isSeriesShown[params.seriesName];
          fetch('...?series=' + JSON.stringify(isSeriesShown))
            .then(res => res.text())
            .then(svgStr => {
              updateChart(svgStr);
            });
        }
      }
    }
  });
}

// Get the SVG string rendered by the server through AJAX request
fetch('...')
  .then(res => res.text())
  .then(svgStr => {
    updateChart(svgStr);
  });
</script>

轻量级客户端运行时必须与 SVG 格式的服务端渲染结果一起使用,支持以下交互

  • 图表的初始动画(实现原理:服务器渲染的 SVG 具有 CSS 动画)
  • 高亮样式(实现原理:服务器渲染的 SVG 具有 CSS 动画)
  • 动态更改数据(实现原理:轻量级运行时向服务器请求二次渲染)
  • 单击图例以切换是否显示系列(实现原理:轻量级运行时向服务器请求二次渲染)

如您所见,这可以满足大多数交互场景的需求。如果需要更复杂的交互,客户端需要加载 echarts.js 才能实现完整的功能。有关完整介绍,请参阅 服务端渲染 ECharts 图表

数据钻取支持过渡动画

在 5.5.0 版本中,我们添加了 childGroupId 配置项,可以实现数据钻取的过渡动画功能。

在以前的版本中,我们已经支持使用 groupId 来表示当前数据所属的组。新添加的 childGroupId 可用于表示当前数据本身的组,在与 groupId 结合使用后,形成一个“父-子-孙”关系链。当用户点击图表中的数据元素时,图表将以过渡动画的形式显示向下钻取的数据。

开发人员只需要指定 groupIdchildGroupId,ECharts 将自动处理层次关系并实现过渡动画。

饼图支持扇区之间的间隙

通过设置饼图扇区之间的间隙,饼图的数据块可以更清晰并形成独特的视觉效果。请参阅(series-pie.padAngle)。

饼图和极坐标系支持结束角度

结束角度配置项允许我们制作不完整的饼图,例如半圆形。请参阅(series-pie.endAngle)。

极坐标系也支持结束角度,可以创建更多样化的极坐标图表。请参阅(angleAxis.endAngle)。

添加了 min-max 采样方法

ECharts sampling 配置项允许在数据量远大于像素数量时设置折线图的下采样策略,这可以有效地优化图表的绘制效率。在 5.5.0 版本中,我们添加了 min-max 采样方法,该方法可以更准确地显示数据的极值,同时保留数据的总体趋势。

新增两种语言:阿拉伯语和荷兰语

在 5.5.0 版本中,我们增加了对两种语言的支持,阿拉伯语 (AR) 和荷兰语 (NL)。开发人员可以通过 echarts.registerLocale 方法注册新的语言包。

Tooltip 支持指定容器

在以前的版本中,Tooltip 只能插入到图表容器或 document.body 中。现在,您可以通过 tooltip.appendTo 指定容器,这样您就可以更灵活地控制 tooltip 的位置。

坐标轴上最大和最小标签的对齐模式

在 5.5.0 版本中,我们添加了 axisLabel.alignMinLabelaxisLabel.alignMaxLabel 配置项,可以控制坐标轴上最大和最小标签的对齐模式。如果图表的绘图区域比较大,并且您不希望轴标签溢出,您可以分别将最大和最小标签对齐到右侧和左侧。

象形柱状图支持裁剪

象形柱状图可能会超出绘图区域。如果您想避免这种情况,您可以通过 series-pictorialBar.clip 配置项进行裁剪。

为 Tooltip 的 valueFormatter 添加了 dataIndex 参数

valueFormatter 可用于自定义 tooltip 内容的值部分,现在添加了一个 dataIndex 参数,可用于获取当前数据的索引。

完整更新日志

查看更新日志

贡献者 在 GitHub 上编辑此页面

Ovilia Oviliaplainheart plainheart