插件导致ECharts被全量引入的坑示例解析


Posted in Javascript onSeptember 23, 2022

正文

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来看下打包出来的实际情况:

插件导致ECharts被全量引入的坑示例解析

从图中我们可以看到,有2处地方都出现了echarts,这和我们的预期完全不符,我们希望的是echarts/lib下通用的直接打到vendor.js里去,然后在某个页面里面我们用到了china map这个只跟着路由异步加载进来(如上图右侧紫色区域),但是异步加载的js里也出现了完整的echarts库,明显跟vendor.js里重复了,这就?了,我们明明只引入了china.js,为啥会整个引入,还被重复引入到了2个文件里。

这个时候我们就从china.js入手,看看这个文件里面到底干了什么事情:

插件导致ECharts被全量引入的坑示例解析

我们进入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')换掉,见下面一点
  • copyregisterMap方法内容,直接引用自己的这个文件?:

插件导致ECharts被全量引入的坑示例解析

优化后我们再用webpack-bundle-analyzer看下打包情况,可以发现只剩下一个vendor里的echarts了,符合我们的预期:

插件导致ECharts被全量引入的坑示例解析

以上就是使用echarts插件时发现的一些引入问题,大家在使用第三方库的时候,特别是一些大的库时还是多留意下打包出来的结果是不是跟预期是一样的,很有可能一个小的引入写法默默地导致了整个库都被引入了?。

更多关于插件全量引入ECharts坑的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Extjs学习笔记之六 面版
Jan 08 Javascript
js图片自动切换效果处理代码
May 07 Javascript
jQuery入门介绍之基础知识
Jan 13 Javascript
jQuery中hover方法和toggle方法使用指南
Feb 27 Javascript
js验证框架之RealyEasy验证详解
Jun 08 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
Aug 02 Javascript
MUI实现上拉加载和下拉刷新效果
Jun 30 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
详解webpack之图片引入-增强的file-loader:url-loader
Oct 08 Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 Javascript
js代码实现轮播图
May 04 Javascript
TypeScript实用技巧 Nominal Typing名义类型详解
Sep 23 #Javascript
Moment的feature导致线上bug解决分析
Sep 23 #Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 #Javascript
js 实现验证码输入框示例详解
Sep 23 #Javascript
TypeScript 内置高级类型编程示例
Sep 23 #Javascript
详解Anyscript开发指南绕过typescript类型检查
Sep 23 #Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 #Javascript
You might like
基于mysql的论坛(3)
2006/10/09 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PDO::inTransaction讲解
2019/01/28 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
Python实现优先级队列结构的方法详解
2016/06/02 Python
Python实现随机选择元素功能
2017/09/14 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
物业经理自我鉴定
2014/03/03 职场文书
美国留学经济担保书
2014/05/20 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
结婚老公保证书
2015/02/26 职场文书
新郎结婚保证书
2015/02/26 职场文书
学生病假条怎么写
2015/08/17 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server