插件导致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 相关文章推荐
JavaScript实现x秒后自动跳转到一个页面
Jan 03 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
为开发者准备的10款最好的jQuery日历插件
Feb 04 Javascript
js的2种继承方式详解
Mar 04 Javascript
input输入框鼠标焦点提示信息
Mar 17 Javascript
js css3实现图片拖拽效果
Mar 04 Javascript
js canvas实现红包照片效果
Aug 21 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
如何使用vuex实现兄弟组件通信
Nov 02 Javascript
JavaScript常见事件对象与操作实例总结
Jan 05 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
May 31 Javascript
React冒泡和阻止冒泡的应用详解
Aug 18 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
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
Python FTP操作类代码分享
2014/05/13 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
python怎么删除缓存文件
2020/07/19 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
早读迟到检讨书
2014/01/24 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
2015年司法所工作总结
2015/04/27 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS