插件导致ECharts被全量引入的坑示例解析
作者:jasonboy7 发布时间:2024-04-19 09:42:21
ECharts作为一个图标库已经被大家广泛使用,它提供了各式各样的图表类型,但是在我们日常使用中可能只会用到其中的某几个图表类型,常用的基本就是柱状图,条线图,及中国地图插件用来表示全国各地的数据这些,所以在我们使用echarts的时候首先需要考虑的是按需引入,避免把整个库都打包进去,echarts的整个打包体积还是相当可观的🤪。
以下仅针对 echarts@v4 版本
按需引入的问题
以下是正常的按需引入echarts的一些图标组件,我们从echarts/lib
下面按需引入我们需要的图标,对于lib下的组件没有任何问题:
import echarts from 'echarts/lib/echarts'
import 'echarts/lib/chart/line'
import 'echarts/lib/chart/pie'
import 'echarts/lib/chart/bar'
import 'echarts/lib/chart/map'
import 'echarts/lib/chart/scatter'
import 'echarts/lib/component/tooltip'
// ...
接下来我们再看下当我们需要用中国地图的时候:
import 'echarts/map/js/china.js'
问题分析
我们只需像上面一样直接引入china.js
即可使用中国地图,看起来似乎使用上也没啥问题,那我们就用webpack-bundle-analyzer
来看下打包出来的实际情况:
从图中我们可以看到,有2处地方都出现了echarts,这和我们的预期完全不符,我们希望的是echarts/lib
下通用的直接打到vendor.js
里去,然后在某个页面里面我们用到了china map这个只跟着路由异步加载进来(如上图右侧紫色区域),但是异步加载的js里也出现了完整的echarts库,明显跟vendor.js里重复了,这就😓了,我们明明只引入了china.js,为啥会整个引入,还被重复引入到了2个文件里。
这个时候我们就从china.js
入手,看看这个文件里面到底干了什么事情:
我们进入china.js里面,仔细观察会发现上图中第26行,直接require('echarts')
了整个库,这就相当于我们应用代码再怎么按需引入,只要你用了china插件,整个echarts还是被全量引入了进来,然后上面webpack-bundle-analyzer
图在多处出现的原因我们就可以推出是因为我们引用代码跟china.js里引入的路径不一样从而导致了chunk那个js被重复引入了echarts完整库:
// 应用代码只映入了核心库
import echarts from 'echarts/lib/echarts'
// china.js require了整个echarts
require('echarts')
解决方案
OK,通过上面分析我们已经发现问题所在,那么我们可以有哪些办法来解决这样的问题呢(让echarts官方去改这个问题似乎不是很现实😂),以下例举了几种常用的潜在解决方案,大家可根据自己项目的实际情况使用(有更好办法的大佬们可在评论里指出👏):
webpack的
alias
,对于直接引入echarts
的地方,替换成echarts/lib/echarts
,但是这样可能会对其他地方全量引入用到的图表,但是你又没有手动按需引入相应的图表就可能报错了通过
webpack.NormalModuleReplacementPlugin
插件或者alias
直接替换echarts/map/js/china.js
的引用,换成自己的一个文件,文件可以copychina.js
,然后把require('echarts')
换掉,见下面一点copy
registerMap
方法内容,直接引用自己的这个文件😅:
优化后我们再用webpack-bundle-analyzer
看下打包情况,可以发现只剩下一个vendor里的echarts了,符合我们的预期:
来源:https://juejin.cn/post/7145854101983592462


猜你喜欢
- 前言综合前述的类、函数、matplotlib等,完成一个随机移动的过程(注意要确定移动的次数,比如10万次),每次行走都完全是随机的,没有明
- 需求背景一个统计接口,前端需要返回两个数组,一个是0-23的小时计数,一个是各小时对应的统计数。思路 直接使用group by查询要统计的表
- 完美的渐变透明效果。支持IE,Firefox渐变,自己写的JS框架中用的东西,发出来了。修正完全隐藏时,偶尔不display = "
- 一 在写之前 最好指定python的路径:#!/usr/bin/pythonpython 在linux中需要添加编码方式:以免出现中文乱码#
- python之循环遍历关于循环遍历大家都知道,不外乎for和while,今天我在这写点不一样的循环和遍历。在实践中有时会遇到删除列表中的元素
- 可以自动轮换的页签 tabs with auto play fucntion<html><head><meta
- 本文实例讲述了JavaScript使用indexOf()实现数组去重的方法。分享给大家供大家参考,具体如下:数组去重方法有多中,这里列举出自
- 问题出现在当时后台数据会返回到data中但是没有出现下拉菜单,查询资料 发现 Vue的this理解有误jsp 下拉菜单 <select
- 1. 前言由于近期有任务需要,要写一个能够处理Excel的脚本,实现的功能是,在A表格上其中一列,对字符串进行分组和排序,然后根据排序好的A
- 刚刚接触springboot,对很多东西都不熟悉,例如,它的注解方式,他的配置方式等;听说它很牛逼,所以就尝试着去学习。在基本熟悉sprin
- 1.简介和安装sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测
- 大家好,我是辣条。辣条的一个朋友最近跟我诉苦:女朋友沉迷淘宝抢购无法自拔,大晚上不睡觉都在定时抢购,真是败家。都是好朋友辣条肯定帮忙,不就是
- 网上找了半天 不是dataframe转化成array的就是array转化dataframe,所以这里给汇总一下,相互转换的python代如下
- 1.前言版本:Python3.6.1 + PyQt5写一个程序的时候需要用到画板/手写板,只需要最简单的那种。原以为网上到处都是,结果找了好
- 光学元件类平面反射镜是一种极为简单的模型,因为我们只需要考虑一个平面即可。但是除此之外的其他光学元件,可能会变得有些复杂:我们必须考虑光在入
- 前言本文主要跟大家分享了关于Ubuntu 18.04配置mysql及配置远程连接的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看
- adminadmin 是 Django 自带的后台管理组件,你可以在 admin 中执行增删改查等操作。它以可视化的方式让你来操纵模型表,十
- Mysql调优Explain工具详解以及实战演练 Explain工具介绍Explain分析示例explain 两个变种explain中的列
- 目录提问:回答:真实情况:知识点结论:总结提问:mysql的字段,unsigned int(3), 和unsinged int(6), 能存
- 本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。本例使用python的tkinter做gui