首页 > 其他分享 >Echarts 5 动态按需引入图表

Echarts 5 动态按需引入图表

时间:2024-08-21 14:15:38浏览次数:3  
标签:any echarts 图表 instance export 引入 import type Echarts

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

例如:组件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"], "#echarts_box",options, (instance) => {
    echarts_instance = instance;
});

 

标签:any,echarts,图表,instance,export,引入,import,type,Echarts
From: https://www.cnblogs.com/Man-Dream-Necessary/p/18371493

相关文章

  • HTML5引入element
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><!--importCSS--><linkrel="stylesheet"href="https://cdn.staticfile.org/element-ui/2.15.9/theme-chalk/index.css"></......
  • Echarts鼠标控制滚动以及自动滚动
    Echarts提供了鼠标控制滚动以及自动滚动的功能。对于鼠标控制滚动,可以使用Echarts的toolbox组件来实现。首先需要在option中配置toolbox组件:option={toolbox:{feature:{dataZoom:{yAxisIndex:'none'//鼠标控制滚动时只......
  • FastJson引入存在DDos攻击安全漏洞案例分析
    FastJson引入存在DDos攻击安全漏洞案例分析背景   某集团公司门户网站接口存在DDos攻击安全漏洞,其他服务端工程中依赖Fastjson进行序列化。Fastjson是阿里巴巴开发的一款高性能的JavaJSON处理库。本身在处理JSON数据时可能存在安全性问题,如JSON注入攻击。DDoS攻击是指攻击者......
  • 在Echarts中的图表中添加水印
    在Echarts中添加水印可以帮助你保护你的图表不被非法复制。水印可以是一个文本字符串、图像或两者的组合,它可以添加到图表的背景、标题或其他可见元素上。以下是如何在Echarts中添加水印的步骤:1创建水印首先,你需要创建一个水印。这可以是文本、图像或其他任何你想要的形状......
  • 基于VSC的MVDC微电网(±10kV)转换器的互连通过等效RL电缆模块实现,此外,在电缆侧引入了
     ......
  • 结合isis、ospf、路由策略的实验;直连引入ospf中,解决路由环路以及次优路径问题
    192.168.1.1:缩写为192第一步:把直连引入ospf中[R5]ipip-prefixdirectindex10permit192.168.1.132[R5]route-policydirect1permitnode10[R5-route-policy]if-matchip-prefixdirect[R5-ospf-1]import-routedirectroute-policydirect1结果:R2或者R3的......
  • Echarts
    echarts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。1.echarts语法title:标题组件title:{text:'标题信息'}tooltip:提示框组件//图表......
  • 如何优化 Vite 项目中的 Lodash 引入:从 Tree Shaking 到自动化测试
    文章目录前言问题背景解决方案概述思路1:使用Lodash-ES替代Lodash思路2:使用Babel插件babel-plugin-lodash思路3:大规模替换后的验证与测试Babel的工作流程回顾最终选择及实践经验自动化测试:使用Puppeteer验证替换后的代码结论前言在现......
  • Python数据分析项目实战01_票房榜单分析和pyecharts大屏可视化
    一:最终大屏效果展示由于生成了html网页只能在本地上显示,这个大屏是动态的,只能显示其中的图片。如果要分享给他人使用,就需要将html源码转为网页。生成的html源码入口:‬​‍​‌‌​⁠​​​‌‍​​​​​‬​​​​​‬​​​​‌​​​‌‍​​​​​⁠‌‬‌​​‌Python数......
  • 040.Vue3入门,在Vue3中引入ElementUI
    1、npminstallelement-plus--save,安装UI 2、main.js代码如下://import'./assets/main.css'//引入下面这两行importElementPlusfrom'element-plus'import'element-plus/dist/index.css'import{createApp}from'vue'importApp......