当前位置: 首页 > news >正文

taro小程序terser-webpack-plugin插件不生效(vue2版本)

背景

最近在做公司内部的小程序脚手架,为了兼容老项目和旧项目,做了vue2+taro,vue3+taro两个模板,发现terser-webpack-plugin在vue2和vue3中的使用方式并不相同,同样的配置在vue3+webpack5中生效,但是在vue2+webpack4中就不生效

vue3模板的解决办法在taro小程序terser-webpack-plugin插件不生效 已经做了说明,本文主要介绍在vue2+webpack4中的解决办法。

遇到的问题

首先说明下前提,关于微信小程序,我在package.json里面配置了四个命令,如下:

    "build:weapp": "taro build --type weapp",   //生产环境"prod:weapp": "cross-env NODE_ENV=production npm run build:weapp -- --watch",  //生产环境热编译"dev:build:weapp": "cross-env NODE_ENV=development npm run build:weapp", //测试环境非热编译"dev:weapp": "cross-env NODE_ENV=development npm run build:weapp -- --watch",  //测试环境热编译

通过查看taro源码已经知道在生产环境的时候,源码里面会自动使用压缩
在这里插入图片描述

所以只需要在测试环境的时候做配置即可,接着按照官网做了以下配置

// config/dev.js
module.exports = {mini: {webpackChain: (chain, webpack) => {chain.merge({plugin: {install: {plugin: require('terser-webpack-plugin'),args: [{terserOptions: {compress: true, // 默认使用terser压缩keep_classnames: true, // 不改变class名称keep_fnames: true, // 不改变函数名称},},],},},})},},
}

运行

npm run dev:weapp

发现确实起到了压缩效果,demo编译后的体积由836kb变成了334kb
在这里插入图片描述

在这里插入图片描述
以为到这一步就大功告成啦,no,no,no,才刚刚开始~,哈哈哈哈,接下来意想不到的发生啦…

当然如果你不需要配置dev:build:weapp这条命令,当我没说…

运行

npm run dev:build:weapp

在这里插入图片描述
发现并没有打包成功,提示这个文件和已有的文件冲突

然后开始排查错误,看了文档中附的这个链接《编写插件,将 Taro 编译打包耗时缩短至三分之一》。
在这里插入图片描述
删除前面的配置,按照这个文档进行配置(不做详细介绍,文档里面都有),发现报如下错误:
在这里插入图片描述
在minifyMainPackage.js里面打印minimizers,发现已经存在terser插件,如果再创建就会报错

//minifyMainPackage.js
const TerserPlugin = require('terser-webpack-plugin')module.exports = (ctx) => {ctx.modifyWebpackChain(args => {const chain = args.chainconst minimizers = chain.optimization.get('minimizer') || []console.log(minimizers,'==minimizers').....})
}

在这里插入图片描述
此时运行如下,却发现并不会报错

npm run dev:weapp

但是minimizers打印出来的是[]

由此可以看出,dev:build:weapp的时候terser已经存在无需重新添加,但是dev:weapp的时候terser却不存在。

结合源码,然后开始各种排查,发现dev:build:weapp的时候虽然打印process.env.NODE_ENV出来的是development,进入的是dev.js里面的逻辑,但是在taro内部还是按照 production 添加了terser-webpack-plugin插件,再次添加就会报错。

因此在minifyMainPackage.js加了一个判断,判断插件存在就不再创建

附上完整代码

//minifyMainPackage.js
const TerserPlugin = require('terser-webpack-plugin')module.exports = (ctx) => {ctx.modifyWebpackChain(args => {const chain = args.chainconst minimizers = chain.optimization.get('minimizer') || []// 检查是否已存在TerserPlugin实例,避免重复添加const hasTerser = minimizers.some(minimizer => {return minimizer.constructor.name === 'TerserPlugin'})//没有则创建if(!hasTerser){chain.optimization.minimize(true)chain.merge({optimization: {minimize: true,minimizer: [new TerserPlugin({test: /\.(?:[js]sx?|mjs)$/, // 一般匹配JavaScript和JSX文件,根据需要调整parallel: true,minify: TerserPlugin.swcMinify,cache: true,extractComments: true,sourceMap: true,terserOptions: {parse: {ecma: 8,},compress: {ecma: 5,warnings: false,arrows: false,collapse_vars: false,comparisons: false,computed_props: false,hoist_funs: false,hoist_props: false,hoist_vars: false,inline: false,loops: false,negate_iife: false,properties: false,reduce_funcs: false,reduce_vars: false,switches: false,toplevel: false,typeofs: false,booleans: true,if_return: true,sequences: true,unused: true,conditionals: true,dead_code: true,evaluate: true,},output: {ecma: 5,comments: false,ascii_only: true,},},}),],},})}})
}

然后在dev.js进行引入

const path = require('path')
module.exports = {env: {NODE_ENV: '"development"'},defineConstants: {},plugins: [ path.resolve(__dirname, './minifyMainPackage.js')],mini: {},h5: {}}
}

对啦,记得安装插件呀~

npm install -D terser-webpack-plugin@3.0.5

大功告成啦~
完结,撒花

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 同三维T80004解码器视频使用操作说明书:高清HDMI解码器,高清SDI解码器,4K超清HDMI解码器,双路4K超高清解码器
  • 【Android】传给后端的Url地址被转码问题处理
  • C#统一委托Func与Action
  • java之 junit单元测试案例【经典版】
  • 在 CentOS-Stream-9 中使用 network 代替 NetworkManager
  • Apache AGE的MATCH子句
  • 增量预训练和微调的区别
  • Python 读取esxi上所有主机的设备信息
  • Keka for Mac v1.4.3 中文下载 解压/压缩工具
  • 【Arduino IDE】安装及开发环境、ESP32库
  • PF4J+SpringBoot
  • Vscode中Github copilot插件无法使用(出现感叹号)解决方案
  • Vite的WebSocket
  • python的tkinter、socket库开发tcp的客户端和服务端
  • 智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • ES6系统学习----从Apollo Client看解构赋值
  • interface和setter,getter
  • JAVA并发编程--1.基础概念
  • JS专题之继承
  • JS字符串转数字方法总结
  • Linux gpio口使用方法
  • node 版本过低
  • rc-form之最单纯情况
  • scrapy学习之路4(itemloder的使用)
  • select2 取值 遍历 设置默认值
  • Theano - 导数
  • vue中实现单选
  • 编写符合Python风格的对象
  • 大快搜索数据爬虫技术实例安装教学篇
  • 高程读书笔记 第六章 面向对象程序设计
  • 山寨一个 Promise
  • 写代码的正确姿势
  • 新书推荐|Windows黑客编程技术详解
  • 用jQuery怎么做到前后端分离
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (LeetCode 49)Anagrams
  • (八十八)VFL语言初步 - 实现布局
  • (二)丶RabbitMQ的六大核心
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (篇九)MySQL常用内置函数
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (算法)求1到1亿间的质数或素数
  • (转)创业的注意事项
  • (转)人的集合论——移山之道
  • *Django中的Ajax 纯js的书写样式1
  • .Net 6.0--通用帮助类--FileHelper
  • .NET Core 版本不支持的问题