插件导致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 相关文章推荐
清空上传控件input file的值
Jul 03 Javascript
jQuery+ajax简单实现文件上传的方法
Jun 03 Javascript
jQuery实现右下角可缩放大小的层完整实例
Jun 20 Javascript
浅析Bootstrap表格的使用
Jun 23 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
Javascript操作dom对象之select全面解析
Apr 24 Javascript
初学者AngularJS的环境搭建过程
Oct 27 Javascript
JS实现图片转换成base64的各种应用场景实例分析
Jun 22 Javascript
Vue中的v-for指令不起效果的解决方法
Sep 27 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
Jan 27 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实现等比例压缩图片
2018/07/26 PHP
判断用户是否在线的代码
2011/03/05 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
Vuex实现数据增加和删除功能
2019/11/11 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python中random模块生成随机数详解
2016/03/10 Python
python:socket传输大文件示例
2017/01/18 Python
Python 含参构造函数实例详解
2017/05/25 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
django模板语法学习之include示例详解
2017/12/17 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
物业工作计划书
2014/01/10 职场文书
岗位工作说明书
2014/07/29 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
Go中的条件语句Switch示例详解
2021/08/23 Golang
Win11快速关闭所有广告推荐
2022/04/19 数码科技