插件导致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 相关文章推荐
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
jQuery制作简洁的多级联动Select下拉框
Dec 23 Javascript
JavaScript DOM操作表格及样式
Apr 13 Javascript
node.js发送邮件email的方法详解
Jan 06 Javascript
基于Node的React图片上传组件实现实例代码
May 10 Javascript
浅谈angular4 ng-content 中隐藏的内容
Aug 18 Javascript
jquery中done和then的区别(详解)
Dec 19 jQuery
Parcel.js + Vue 2.x 极速零配置打包体验教程
Dec 24 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
原生js实现瀑布流效果
Mar 09 Javascript
详解vue-flickity的fullScreen功能实现
Apr 07 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
PHP中cookies使用指南
2007/03/16 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
php中stdClass的用法分析
2015/02/27 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
python中round函数如何使用
2020/06/19 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
html5时钟实现代码
2010/10/22 HTML / CSS
Gap英国官网:Gap UK
2018/07/18 全球购物
会计自我鉴定
2013/11/02 职场文书
责任心演讲稿
2014/05/14 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
MySQL数据库简介与基本操作
2022/05/30 MySQL