webpack5-手撸RemoveConsolePlugin插件

embedded/2024/9/23 11:42:38/

写在前面

其实呢,这个东西也就那样,主要是我们得清楚webpack构建过程中的生命周期钩子,

就拿这个插件来说,我们想要把输出的js文件里面的内容中的console语句去掉,那么我们就需要找到webpack处理完文件时的钩子,然后通过正则表达式替换为空字符串即可

webpack hooks文档


我们就是要在这里找出来我们想要处理的时机,到底是哪个钩子做的事情。

webpackapply_11">插件的代码本质就是一个类,我们按照webpack的规定去实现内部的apply方法即可

它是node中执行的东西,所以按照CommonJS规范的模块化语法

// 就是实现一个apply方法
class CustomxxxxPLugin {apply(compiler) {....}
}module.exports = CustomxxxxPLugin;

铺垫的应该很直白,没什么难的东西,直接上代码

.custom-plugin/removeConsolePlugin.js

/** 去除代码中的console语句--plugin*/
const pluginName = 'consoleRemovePlugin';class RemoveConsolePlugin {/** * 参数types 为数组,传入*为所有类型* ['log', 'info', 'warn', 'error'] === ['*']* 也可以按需传入*/constructor(options) {if (options.types) {if (!Array.isArray(options.types)) {throw new Error('【consoleRemovePlugin】error: types must be an array');} else {if (options.types.includes('*')) {options.types = ['log', 'info', 'warn', 'error'];}options.types.forEach(type => {if (!['log', 'info', 'warn', 'error'].includes(type)) {throw new Error('【consoleRemovePlugin】error: types must be log, info, warn, error');}})}} else {this.options.types = ['log', 'info', 'warn', 'error'];}this.options = options;}apply(compiler) {let handler = (assets, compilation) => {/** 处理正则表达式:用来匹配console.*()和console.*() */let removedStr = this.options.types.reduce((a, b) => (a + '|' + b));let reDict = {1: [RegExp(`\\.console\\.(${removedStr})\\(\\)`, 'g'), ''],2: [RegExp(`\\.console\\.(${removedStr})\\(`, 'g'), ';('],3: [RegExp(`console\\.(${removedStr})\\(\\)`, 'g'), ''],4: [RegExp(`console\\.(${removedStr})\\(`, 'g'), '(']}Object.entries(assets).forEach(([filename, source]) => {let outputContent = source.source();if (/\.(js|ts|jsx|tsx)/.test(filename)) {Object.entries(reDict).forEach(([_, value]) => {outputContent = outputContent.replace(value[0], value[1]);})compilation.assets[filename] = {source: () => outputContent,size: () => Buffer.byteLength(outputContent, 'utf8')};}})}// https://webpack.docschina.org/api/compiler-hooks/#compilation/***  compilation钩子*  compilation 创建之后执行*/compiler.hooks.compilation.tap(pluginName, compilation => {// https://webpack.docschina.org/api/compilation-hooks/#processassets// webpack5的钩子,不使用webpack4// afterProcessAssets钩子的使用而不是processAssets,// 是因为webpack包中的sourceMapDevToolPlugin.js使用processAssets钩子,// 我们的插件会更改source对象,导致sourceMapDevToolPlugin.js插件无法正确使用asset.source// 具体体现在node_modules/webpack/lib/SourceMapDevToolPlugin.js中getTaskForFile方法compilation.hooks.afterProcessAssets.tap({name: pluginName,}, assets => handler(assets, compilation))})}
}module.exports = RemoveConsolePlugin;

webpack.config.js中的使用

...
const RemoveConsolePlugin = require('./custom-plugin/consoleRemove');
module.exports = function (webpackEnv) {...return {...plugins: [...,!isEnvDevelopment && new RemoveConsolePlugin({types: ['log'] // ["*"]}),]}
}

写在最后

如果有帮到大家,就帮博主点个免费的赞,博主会特别开心能帮到大家嘞!


http://www.ppmy.cn/embedded/110669.html

相关文章

分库分表:应对大数据量挑战的数据库扩展策略

随着互联网技术的发展,数据量的爆炸性增长给数据库系统带来了前所未有的挑战。为了有效管理大规模数据并保持高性能,分库分表成为了一种常见的数据库扩展策略。本文将探讨分库分表的概念、动机、实施策略以及潜在的挑战和解决方案。 什么是分库分表&…

【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI

在FastAPI中,默认情况下,当应用启动时,Swagger UI 会通过在线加载 Swagger UI 的静态资源。这意味着如果应用运行在没有互联网连接的环境中,默认的 Swagger 文档页面将无法加载。 为了在离线环境中使用 Swagger UI,你…

太牛了!AI大佬的课程!吴恩达、李飞飞、李宏毅、Hinton、LeCun...

本文精心梳理了AI顶级大佬教授的人工智能课程,涵盖了深度学习、机器学习等多个领域的前沿内容。 这些课程将引领您深入了解决策树、朴素贝叶斯、逻辑回归、神经网络和深度学习等核心知识点,同时还将探索贝叶斯学习、支持向量机和核方法、聚类、无监督学…

【原创教程】自动化工程案例01:8工位插针装配机02

上一篇文章我们分析了8工位的每一个工位情况,这篇我们跟大家聊聊触摸屏部分。 触摸屏拥有:8个主页面,IO点和手动操作有2个分页面 主页面:主画面 涉及到保密问题,我们把标题栏给删掉,大家知道有标题栏就可…

骨传导耳机哪个品牌好用?精选骨传导耳机品牌排行榜前十名推荐

随着健康生活方式与运动热潮的兴起,骨传导耳机这一非常具有创新意义的蓝牙耳机逐渐走进大众视野,凭借其独特的传音方式既保证了音乐的享受,又可以兼顾运动时的安全与周围环境感知。但随着市场需求逐渐增加,市面上开始出现各式各样…

Docker中部署nacos 开启鉴权springboot连接配置

nacos开启鉴权后发现各种连不上。 按道理说所有的东西都是采用同一个docker网络连接的,连接的时候可以采用容器名连接。 下面是刚开始springboot中的链接配置。增加了用户名和密码 这里nacos我们用到了注册中心和配置中心。启动项目的时候配置中心没有问题&#x…

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠…

让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js

引言:从 HTML 到 Vue.js 的奇妙旅程 当我们谈论前端开发时,我们通常会面对这样一个现实:HTML 代码和 Vue.js 代码看起来就像来自不同世界的两种语言。你可能想要让 wangEditor 这个轻量级的富文本编辑器在你的 Vue.js 项目中大展身手&#x…