Echarts在Taro微信小程序开发中的踩坑记录


Posted in Javascript onNovember 09, 2020

背景

近期笔者在使用Taro进行微信小程序开发,当引入Echarts图表库时,微信检测单包超限2M的一系列优化措施的踩坑记录,期望能指导读者少走一些弯路。

为什么选择Echarts?

微信小程序目录市面上使用最多的两款图表库,如下:

  • echarts-for-weixin——echarts微信小程序版本
  • wx-charts——基于微信小程序的图表库

对比两款图表库优缺点刚好相反。

  • echarts-for-weixin:功能强大,但体积非常大
  • wx-charts:功能相对简单,但体积小

由于笔者对echarts使用较熟悉,且需求图表需要支持的部分功能wx-charts不支持,所以最终选择使用echarts-for-weixin,踩坑之旅就此开始。

单包超过2M,如何处理?

笔者引入echarts-for-weixin,快乐的做完需求,准备上传代码发布微信小程序体验版,坑就此开始...

Echarts在Taro微信小程序开发中的踩坑记录

当单包超过2M上限,则上传代码出现异常,出现上面弹窗提示。

微信小程序官方要求,单包不超过2M,整包不超过16M

遇到单包超过2M,优化方案有如下两种:

  • 微信分包加载subpackages
  • 单包体积优化(缩减代码、压缩、静态资源CDN等等)

由于笔者本次开发需求属于新功能,所以把新功能模块采用独立的分包路由加载,但分包后,还是出现单包超过2M的限制。

Echarts在Taro微信小程序开发中的踩坑记录

经过分析发现业务模块引用的echarts组件,会被Taro打包到common.js模块,导致所有的分包模块都会重复计算echarts的size,导致旧分包模块超过2M的限制。

为什么echarts-for-weixin会被打包到common.js模块?

原因是echarts被echarts-for-weixin组件和外部业务组件所依赖,导致Taro认为echarts.js被多个模块所依赖,所以打包到common.js。

为了解决此问题,采用splitChunks打包配置,将echarts单独模块打包,然后在对应的依赖页面(addChunkPages)注入依赖,配置如下:

// echartChunkName echarts打包后的输出路径
 mini: {
  webpackChain(chain) {
   chain.merge({
    optimization: {
     splitChunks: {
      cacheGroups: {
       [echartChunkName]: {
        name: echartChunkName,
        priority: 50,
        test(module) {
         return /subpackages[\\/]homeworkPage[\\/]studyData[\\/]ChartLine[\\/]ec-canvas[\\/]echarts.js/.test(
          module.resource
         );
        },
       },
      },
     },
    },
   });
  },
  addChunkPages(pages, pagesNames) {
   pages.set("subpackages/homeworkPage/studyData/ChartLine/index", [echartChunkName]);
   pages.set("subpackages/homeworkPage/studyData/ChartLine/ec-canvas/ec-canvas", [echartChunkName]);
  }
 }

Taro通过mini.webpackChain自定义webpack配置,请参考官网文档

webpack分包配置splitChunks,请参考官网文档

通过mini.addChunkPages设置分包依赖,请参考官网文档

经过以上处理,common.js体积恢复正常,以为就此结束。

结果新的坑又出现了......如下图:

Echarts在Taro微信小程序开发中的踩坑记录

echarts-for-weixin组件找不到echarts模块依赖...

经过一系列的分析,发现Taro对原生微信组件splitChunks分包打包的依赖注入有问题官方还没有修复此问题...

需要在Taro编译成功后,手动修改编译后的ec-canvas.js,注入echarts依赖,如下图:

Echarts在Taro微信小程序开发中的踩坑记录

经过上面的处理,终于正常运行,单包超过2M的问题也全部解决。

以为到此就结束了?

笔者总不能在每次编译后,手动修改编译后的文件吧,如果哪天发版本忘记手动修改,将导致线上问题,风险高。

因此需要写一个Taro打包hack插件,自动注入编译后的echarts依赖代码。

书写Taro编译插件很简单,请参考官方文档即可,插件代码如下:

const fs = require('fs');
const path = require('path');
module.exports.default = module.exports = (ctx, options) => {
 ctx.onBuildFinish(() => {
  console.log('echarts构建hack注入')
  const target = path.join(ctx.paths.outputPath, 'subpackages/homeworkPage/studyData/ChartLine/ec-canvas//ec-canvas.js');
  const data = fs.readFileSync(target, 'utf8');
  fs.writeFileSync(target, `require("../../echartCommon");${data}`)
 })
}

注:Taro版本2.2以上才支持自定义插件

最后

Echarts在Taro微信小程序开发踩坑记录到此接近尾声,希望能给正准备在Taro微信小程序使用echarts图表库的读者一些帮助。

到此这篇关于Echarts在Taro微信小程序开发中的踩坑记录的文章就介绍到这了,更多相关Taro微信小程序 Echarts内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
动态设置form表单的action属性的值的简单方法
May 25 Javascript
jQuery实现可展开折叠的导航效果示例
Sep 12 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 Javascript
详解webpack 如何集成第三方js库
Jun 29 Javascript
JS实现评价的星星功能
Aug 20 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
JS实现获取当前所在周的周六、周日示例分析
May 11 Javascript
javascript刷新父页面方法汇总详解
Oct 10 Javascript
Vue的状态管理vuex使用方法详解
Feb 05 Javascript
如何基于javascript实现贪吃蛇游戏
Feb 09 Javascript
Vue路由权限控制解析
Nov 09 #Javascript
在vue项目中promise解决回调地狱和并发请求的问题
Nov 09 #Javascript
vue 中的动态传参和query传参操作
Nov 09 #Javascript
你不知道的SpringBoot与Vue部署解决方案
Nov 09 #Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 #Javascript
原生JavaScript实现五子棋游戏
Nov 09 #Javascript
Nuxt的动态路由和参数校验操作
Nov 09 #Javascript
You might like
默默简单的写了一个模板引擎
2007/01/02 PHP
一些常用的php简单命令代码集锦
2007/09/24 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
2018/11/21 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
python算法表示概念扫盲教程
2017/04/13 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Python实现12306火车票抢票系统
2019/07/04 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
python3 简单实现组合设计模式
2020/07/02 Python
远东集团网络工程师面试题
2014/10/20 面试题
省三好学生申请材料
2014/01/22 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
年终总结会主持词
2014/03/25 职场文书
学雷锋标语
2014/06/25 职场文书
自我管理的活动方案
2014/08/25 职场文书
高中社区服务活动报告
2015/02/05 职场文书
关于环保的广播稿
2015/12/17 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python