Apache ECharts 5.5.0 引入服务端渲染的新利器:1KB 的客户端轻量运行时
Apache ECharts 5.5.0 版本已于 2024.2.18 正式发布。
https://github.com/apache/echarts/releases/tag/5.5.0
主要变化
-
增强了代码的 ESM 识别,对 Node.js 环境开发更加友好;
-
为服务端渲染方案提供了一个 gzip 后仅 1KB 的轻量运行时,极大地降低了加载时间;
-
为数据下钻支持了过渡动画,开发者可以方便地实现多级数据的动画效果;
-
为饼图和极坐标系图表增加了更多配置项,可以实现更丰富的样式;
-
新增阿拉伯语和荷兰语两种语言的翻译
-
……
以下内容转自:https://mp.weixin.qq.com/s/IpGQS1GspyXzNe-u9F4B-A
增强的 ESM 支持
为了让开发者在测试和 Node.js 环境使用更方便,我们在这个版本中对 ESM 的识别问题进行了优化。
以前,ECharts 只在 npm(npm 包的 lib 目录中)导出 *.esm
文件。虽然这在 bundlers 环境表现良好,但 Node.js 环境和一些基于 Node.js 的测试框架(如 vitest 和 jest)中的表现并不理想。
有了这个新功能,我们做了几个改变以改善这个问题:
-
在
package.json
中添加了"type": "module"
-
在
package.json
中添加了"exports": {...}
-
在子目录中添加了一些只包含
"type": "commonjs"
的package.json
文件
这些改变意味着,像 echarts/core.js
这样的文件现在可以在像纯 Node.js、vitest、jest 和 create-react-app 这样的环境中解析为 ESM。
我们还确保了这个新功能与各种环境兼容,包括运行时(Node.js/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 后 1 KB、客户端运行时 gzip 后 1KB,仅为前者体积的 1.5%。交互方面,后者也可以做到初始动画、鼠标移动到图表元素后的高亮,并且获取到点击事件,能够满足大部分的常见交互需求。
如需使用客户端轻量运行时方案,服务端代码和之前一样,但需要保证 ECharts 版本号在 5.5.0 以上。
// 服务端代码 const echarts = require('echarts'); // 在 SSR 模式下第一个参数不需要再传入 DOM 对象 const chart = echarts.init(null, null, { renderer: 'svg', // 必须使用 SVG 模式 ssr: true, // 开启 SSR width: 400, // 需要指明高和宽,如果是根据客户端容器大小动态的,该值需要从客户端得到 height: 300 }); // 像正常使用一样 setOption chart.setOption({ //... }); // 输出字符串 const svgStr = chart.renderToSVGString(); // 调用 dispose 以释放内存 chart.dispose(); chart = null; // 通过 HTTP Response 返回 svgStr 给前端或者缓存到本地(这里以 Express.js 为例): 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/npm/echarts/ssr/client/dist/index.js"></script> <script> const ssrClient = window['echarts-ssr-client']; let isSeriesShown = { a: true, b: true }; function updateChart(svgStr) { const container = document.getElementById('chart-container'); container.innerHTML = svgStr; // 使用轻量运行时赋予图表交互能力 ssrClient.hydrate(main, { on: { click: (params) => { if (params.ssrType === 'legend') { // 点击图例元素,请求服务器进行二次渲染 isSeriesShown[params.seriesName] = !isSeriesShown[params.seriesName]; fetch('...?series=' + JSON.stringify(isSeriesShown)) .then(res => res.text()) .then(svgStr => { updateChart(svgStr); }); } } } }); } // 通过 AJAX 请求获取服务端渲染的 SVG 字符串 fetch('...') .then(res => res.text()) .then(svgStr => { updateChart(svgStr); }); </script>
客户端轻量运行时必须配合 SVG 形式的服务端渲染结果使用,支持以下交互:
-
图表初始动画(实现原理:服务端渲染的 SVG 带有 CSS 动画)
-
高亮样式(实现原理:服务端渲染的 SVG 带有 CSS 动画)
-
动态改变数据(实现原理:轻量运行时请求服务器进行二次渲染)
-
点击图例切换系列是否显示(实现原理:轻量运行时请求服务器进行二次渲染)
可以发现,这能够满足大部分的交互场景需求。如果需要更复杂的交互,则客户端需要加载 echarts.js
实现完整功能。
完整的介绍请参见官网使用手册的「应用篇 - 跨平台方案 - 服务端渲染」。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Elasticsearch 8.12.2 发布
Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 基于 Java 开发,并在 SSPL + Elastic License 双重授权许可下作为开源软件发布。 Elasticsearch 8.12.2 现已发布,具体更新内容如下: Bug 修复 Application 修复因rule_query中text_expansion未重写而出错的bug#105365 [Connectors API] 修复爬虫配置解析和sync_nowflag 的错误#105024 Authentication 在重新加载 JWT 共享密钥之前验证设置#105070 Downsampling 更好地处理未分配源索引的 Downsampling 问题,并修复检索最后处理的 tsid 的错误#105228 ES|QL ESQL:如果可能,将 CIDR_MATCH 推送到 Lucene#105061(issue#105042) ES|QL:修复错误日期模式的date_pars...
- 下一篇
超 3000 次 commit,MyBatis-Flex v1.8.0 发布
MyBatis-Flex: 一个优雅的 MyBatis 增强框架 特征 1、很轻量 MyBatis-Flex 整个框架只依赖 MyBatis,再无其他任何第三方依赖。 2、只增强 MyBatis-Flex 支持 CRUD、分页查询、多表查询、批量操作,但不丢失 MyBatis 原有的任何功能。 3、高性能 MyBatis-Flex 采用独特的技术架构、相比许多同类框架,MyBatis-Flex 的在增删改查等方面的性能均超越其 5~10 倍或以上。 4、更灵动 MyBatis-Flex 支持多主键、多表查询、逻辑删除、乐观锁、数据脱敏、数据加密、多数据源、分库分表、字段权限、 字段加密、多租户、事务管理、SQL 审计... 等等等等。 这一切,免费且灵动。 不知不觉,MyBatis-Flex 发布快 1 年的时间了。在这 1 年中,MyBatis-Flex 一共发布了 180 个版本,130 位小伙伴参与贡献,一共获得了超过 3000 次 commit,感谢大家的付出,才能让 MyBatis-FLex 茁壮成长。 MyBatis-Flex v1.7.9~1.8.0 更新细节如下: ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Mario游戏-低调大师作品
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启