Echarts 5 动态按需引入图表

官网提供的按需引入方法为全量按需引入,在打包分离中,仍旧存在使用不到的图表被打包进去。

例如:组件A使用了折线图、柱状图,组件B只用到了折线图,但是打包组件B的时候,柱状图也就被打包进去。

本文提供一种动态按需引入的思路,使得只用到折线图的组件B,打包的时候只打包折线图,不会将组件A用到的柱状图也打包进去。

目录结构:

 

Index.ts 如下:

 

// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as ECHARTS from "echarts/core";
import type { ComposeOption } from "echarts/core";
import CORE, { CORE_ECOption } from "./Core";
import { LineChart_ECOption } from "./LineChart";
import { BarChart_ECOption } from "./BarChart";
import { RadarChart_ECOption } from "./RadarChart";// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
export type ECOption = ComposeOption<CORE_ECOption | LineChart_ECOption | BarChart_ECOption | RadarChart_ECOption>;class Echarts {public echarts: any;constructor(type: string[], callback: any) {// 注册必须的组件ECHARTS.use([...CORE]);const charts: any = [];type!.map((item: any) => {const res: any = import(/* webpackChunkName: "echarts" */ `./${item}`);charts.push(res);});Promise.all(charts).then((res: any) => {res.map((item: any) => {ECHARTS.use(item.default);});callback(ECHARTS);});}
}export default Echarts;

 

Core.ts 如下:

 

// 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {TitleComponent,TooltipComponent,GridComponent,DatasetComponent,TransformComponent,ToolboxComponent,LegendComponent
} from "echarts/components";// 标签自动布局、全局过渡动画等特性
import { LabelLayout, UniversalTransition } from "echarts/features";// 组件类型的定义后缀都为 ComponentOption
import type {TitleComponentOption,TooltipComponentOption,GridComponentOption,DatasetComponentOption,ToolboxComponentOption,LegendComponentOption
} from "echarts/components";// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from "echarts/renderers";// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
export type CORE_ECOption =| TitleComponentOption| TooltipComponentOption| GridComponentOption| DatasetComponentOption| ToolboxComponentOption| LegendComponentOption;const CORE = [TitleComponent,TooltipComponent,GridComponent,DatasetComponent,TransformComponent,ToolboxComponent,LegendComponent,LabelLayout,UniversalTransition,CanvasRenderer
];export default CORE;

 

BarChart.ts 如下:

 

import { BarChart } from "echarts/charts";// 系列类型的定义后缀都为 SeriesOption
import type { BarSeriesOption } from "echarts/charts";export type BarChart_ECOption = BarSeriesOption;export default BarChart;

 

LineChart.ts 如下:

 

import { LineChart } from "echarts/charts";// 系列类型的定义后缀都为 SeriesOption
import type { LineSeriesOption } from "echarts/charts";// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
export type LineChart_ECOption = LineSeriesOption;export default LineChart;

 

RadarChart.ts 如下:

 

import { RadarChart } from "echarts/charts";// 系列类型的定义后缀都为 SeriesOption
import type { RadarSeriesOption } from "echarts/charts";// 组件类型的定义后缀都为 ComponentOption
import type { RadarComponentOption } from "echarts/components";// 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
export type RadarChart_ECOption = RadarComponentOption | RadarSeriesOption;export default RadarChart;

 

如果项目中还用到其他图表类型,则按照具体需要引入即可。

可以根据具体业务进行调用封装,下面是封装的示例 util.ts:

 

import Echarts from "/echarts/Index";export const renderEcharts = async (type: string[], dom: string, option: any = {}, callback?: any) => {if (!dom) return;new Echarts(type, (echart: any) => {const _dom: any = document.querySelector(dom);const echarts_instance = echart.init(_dom);echarts_instance.setOption(option);window.addEventListener("resize", function () {echarts_instance.resize();echarts_instance.clear();echarts_instance.setOption(option);});_dom?.addEventListener("touchend", () => {setTimeout(() => {echarts_instance.dispatchAction({type: "hideTip"});echarts_instance.dispatchAction({type: "updateAxisPointer"});}, 1000);});callback && callback(echarts_instance);});
};

 

具体调用:

 

let echarts_instance = null;
const options = {// 具体的option }
renderEcharts(["LineChart", "BarChart"], "#short_sale_count",options, (instance) => {echarts_instance = instance;
});

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784831.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

柱状图倒圆角4.9版本

series处理const stackInfo = {};for (let i = 0; i < series[0].data.length; ++i) {for (let j = 0; j < series.length; ++j) {const stackName = series[j].stack;if (!stackName) {continue;}if (!stackInfo[stackName]) {stackInfo[stackName] = {stackStart: [],s…

源码解析之为何要用ConcurrentHashMap

为什么要用ConcurrentHashMap? ConcurrentHashMap是JUC包下的一个线程安全的HashMap类,我们都知道多线程的场景下要用ConcurrentHashMap来代替HashMap使用,有没有想过为什么不能用HashMap,为什么能用ConcurrentHashMap呢?下面我通过走源码的方式,带大家看一看其中的一些细…

SAFe大规模敏捷企业级实战演练培训

​ 课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架,也是成长最快、最被认可、最有价值的规模化敏捷框架,目前全球SAFe认证专业人士已达80万人,福布斯100强的70%都在实施SAFe。本课程是一个2天的 SAFe权威培训课程,在课程中,学员将系统地学…

【Linux】gnome桌面环境切换KDE Plasma

@目录安装KDE Plasma桌面环境添加软件源并更新apt安装kubuntu-desktop(作者没有成功)aptitude安装kubuntu-desktop多次aptitude install(特别重要特别重要)其他kde软件包卸载gnome桌面Ubuntu自带的桌面环境是gnome,本文提供了安装KDE Plasma的教程,并解决了其中可能遇到的…

Origin2024如何制作双Y轴图?

日常科研中,我们经常会用到x-y轴图,但有时候一个x对应两个y值甚至多个y值,那应该怎么做呢?下面给大家分享绘制双Y轴图的操作方法; 操作步骤: 1、先打开Origin2024软件,然后在Book1中输入如下示例数据: 2、选中所有数据:3、点击菜单栏中【绘图】→【多面板/多轴】→【…

一次实战压测流程及问题梳理

1、背景及目的 在动手之前,先要想清楚我们期望从压测中获取的价值是什么。 这次压测的背景,主要是为了应对旺季到来,避免旺季的大量流量和高并发造成服务不可用,提升稳定性。而在稳定性建设中,也会从事前、事中及事后来看,包含的维度包含风险识别、监控告警、应急流程及故…

独家揭秘丨GreatSQL 的MDL锁策略升级对执行的影响

独家揭秘丨GreatSQL 的MDL锁策略升级对执行的影响 一、MDL锁策略介绍 GreatSQL 的MDL锁有个策略方法类MDL_lock_strategy,它根据对象的类型分为了scope类型和object类型,前者主要用于GLOBAL, COMMIT, TABLESPACE, BACKUP_LOCK and SCHEMA ,RESOURCE_GROUPS,FOREIGN_KEY,CHECK…

milvus基础

Milvus 是在 2019 年创建的,其目标是存储、索引和管理深度神经网络和其他机器学习(ML)模型生成的大规模 嵌入向量。作为一种专门设计用于处理对输入向量的查询的数据库,它能够处理万亿级规模的向量索引。与现有的主要处理按照预定义模式遵循结构化数据的关系型数据库不同,…

查询硬盘序列号的参考方案

经常有客户来电,一般是公司it或资产管理部门,来询问硬盘序列号, 打开cmd

深化物料管理:APS软件系统在齐套率优化中的实践

精确的需求预测 APS系统会深度挖掘企业的历史销售数据,这些数据包含销售数量记录、季节性波动、产品生命周期、促销活动影响等多维度信息。通过搭建分析模型,系统能够识别出不同产品在不同时间段内的需求模式,并据此预测未来几个月甚至更长时间的物料需求,为生产计划和采购…

深入理解Linux内核进程的管理与调度

一,前戏 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1.2 进程的分类 li…