翼度科技»论坛 编程开发 JavaScript 查看内容

Echarts 5 动态按需引入图表

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
官网提供的按需引入方法为全量按需引入,在打包分离中,仍旧存在使用不到的图表被打包进去。
例如:组件A使用了折线图、柱状图,组件B只用到了折线图,但是打包组件B的时候,柱状图也会被打包进去。
本文提供一种动态按需引入的思路,使得只用到折线图的组件B,打包的时候只打包折线图,不会将组件A用到的柱状图也打包进去。
目录结构:

 
Index.ts 如下:
 
  1. // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  2. import * as ECHARTS from "echarts/core";
  3. import type { ComposeOption } from "echarts/core";
  4. import CORE, { CORE_ECOption } from "./Core";
  5. import { LineChart_ECOption } from "./LineChart";
  6. import { BarChart_ECOption } from "./BarChart";
  7. import { RadarChart_ECOption } from "./RadarChart";
  8. // 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
  9. export type ECOption = ComposeOption<CORE_ECOption | LineChart_ECOption | BarChart_ECOption | RadarChart_ECOption>;
  10. class Echarts {
  11.     public echarts: any;
  12.     constructor(type: string[], callback: any) {
  13.         // 注册必须的组件
  14.         ECHARTS.use([...CORE]);
  15.         const charts: any = [];
  16.         type!.map((item: any) => {
  17.             const res: any = import(/* webpackChunkName: "echarts" */ `./${item}`);
  18.             charts.push(res);
  19.         });
  20.         Promise.all(charts).then((res: any) => {
  21.             res.map((item: any) => {
  22.                 ECHARTS.use(item.default);
  23.             });
  24.             callback(ECHARTS);
  25.         });
  26.     }
  27. }
  28. export default Echarts;
复制代码
 
 
Core.ts 如下:
 
  1. // 引入标题,提示框,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  2. import {
  3.     TitleComponent,
  4.     TooltipComponent,
  5.     GridComponent,
  6.     DatasetComponent,
  7.     TransformComponent,
  8.     ToolboxComponent,
  9.     LegendComponent
  10. } from "echarts/components";
  11. // 标签自动布局、全局过渡动画等特性
  12. import { LabelLayout, UniversalTransition } from "echarts/features";
  13. // 组件类型的定义后缀都为 ComponentOption
  14. import type {
  15.     TitleComponentOption,
  16.     TooltipComponentOption,
  17.     GridComponentOption,
  18.     DatasetComponentOption,
  19.     ToolboxComponentOption,
  20.     LegendComponentOption
  21. } from "echarts/components";
  22. // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  23. import { CanvasRenderer } from "echarts/renderers";
  24. // 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
  25. export type CORE_ECOption =
  26.     | TitleComponentOption
  27.     | TooltipComponentOption
  28.     | GridComponentOption
  29.     | DatasetComponentOption
  30.     | ToolboxComponentOption
  31.     | LegendComponentOption;
  32. const CORE = [
  33.     TitleComponent,
  34.     TooltipComponent,
  35.     GridComponent,
  36.     DatasetComponent,
  37.     TransformComponent,
  38.     ToolboxComponent,
  39.     LegendComponent,
  40.     LabelLayout,
  41.     UniversalTransition,
  42.     CanvasRenderer
  43. ];
  44. export default CORE;
复制代码
 
  1.  
复制代码
BarChart.ts 如下:
 
  1. import { BarChart } from "echarts/charts";
  2. // 系列类型的定义后缀都为 SeriesOption
  3. import type { BarSeriesOption } from "echarts/charts";
  4. export type BarChart_ECOption = BarSeriesOption;
  5. export default BarChart;
复制代码
 
 
LineChart.ts 如下:
 
  1. import { LineChart } from "echarts/charts";
  2. // 系列类型的定义后缀都为 SeriesOption
  3. import type { LineSeriesOption } from "echarts/charts";
  4. // 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
  5. export type LineChart_ECOption = LineSeriesOption;
  6. export default LineChart;
复制代码
 
  1.  
复制代码
RadarChart.ts 如下:
 
  1. import { RadarChart } from "echarts/charts";
  2. // 系列类型的定义后缀都为 SeriesOption
  3. import type { RadarSeriesOption } from "echarts/charts";
  4. // 组件类型的定义后缀都为 ComponentOption
  5. import type { RadarComponentOption } from "echarts/components";
  6. // 通过 ComposeOption 来组合出一个只有必须组件和图表的 Option 类型
  7. export type RadarChart_ECOption = RadarComponentOption | RadarSeriesOption;
  8. export default RadarChart;
复制代码
 
  1.  
复制代码
如果项目中还用到其他图表类型,则按照具体需要引入即可。
可以根据具体业务进行调用封装,下面是封装的示例 util.ts:
 
  1. import Echarts from "/echarts/Index";
  2. export const renderEcharts = async (type: string[], dom: string, option: any = {}, callback?: any) => {
  3.     if (!dom) return;
  4.     new Echarts(type, (echart: any) => {
  5.         const _dom: any = document.querySelector(dom);
  6.         const echarts_instance = echart.init(_dom);
  7.         echarts_instance.setOption(option);
  8.         window.addEventListener("resize", function () {
  9.             echarts_instance.resize();
  10.             echarts_instance.clear();
  11.             echarts_instance.setOption(option);
  12.         });
  13.         _dom?.addEventListener("touchend", () => {
  14.             setTimeout(() => {
  15.                 echarts_instance.dispatchAction({
  16.                     type: "hideTip"
  17.                 });
  18.                 echarts_instance.dispatchAction({
  19.                     type: "updateAxisPointer"
  20.                 });
  21.             }, 1000);
  22.         });
  23.         callback && callback(echarts_instance);
  24.     });
  25. };
复制代码
 
 
具体调用:
 
  1. let echarts_instance = null;
  2. const options = {// 具体的option }
  3. renderEcharts(["LineChart", "BarChart"], "#echarts_box",options, (instance) => {
  4.     echarts_instance = instance;
  5. });
复制代码
 

来源:https://www.cnblogs.com/Man-Dream-Necessary/p/18371493
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具