webpack与vue-cli合并配置,打包生产环境代码时如何删除所有的console.log、代码注释和debugger

文章讲述了在基于vue-cli5和webpack5的项目中,如何通过配置TerserWebpackPlugin来自动移除console.log语句和打包过程中的注释。作者首先尝试了uglifyjs-webpack-plugin,但发现它可能不适用于webpack5,于是转向了TerserWebpackPlugin。在配置vue.config.js文件并使用chainWebpack方法后,成功实现了在打包过程中删除console.log和注释,提高了代码优化和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文基于vue-cli 5.0.0,webpack 5.0,TerserWebpackPlugin

最近公司项目开发上线后,发现控制台有很多当时测试时打印的信息。但是如果手动删除然后打包的话工作量太大,而且不利于以后的维护和debugger。所有必须通过webpack打包时自动帮我们删除console和注释。

第一步上网找到webpack关于优化console.log语句的插件---------uglifyjs-webpack-plugin,但是查看npm库后发现这个库很久没更新过怀疑可能不适配webpack5

 最后在webpack官网找到这个插件TerserWebpackPlugin

 接下来就是下载配置,

$ npm install terser-webpack-plugin --save-dev

//vue.config.js
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
    //...
configureWebpack: {
   optimization: {
      minimize: true,
      minimizer: [new TerserPlugin({
        terserOptions: {
            compress: {
                drop_debugger: true, 
                drop_console: true,
                pure_funcs: ['console.log']//删除打印语句
            },
            format: {
              comments: false //删除所有注释
            }
            
        },
        parallel: true,  //多核打包,提升打包速度
        extractComments: false //是否将注释全部集中到一个文件中
     })],
   },
}
};

然后就大功告成(不是) 

然后就失败了打印注释都还在。。。。随机打印打包配置看看(具体可以看看vuecli文档webpack 相关 | Vue CLI

vue inspect --mode prodction > ./inspect.js

 

 

 发现我们在configurewebpack中配置的optimization并没有和webpack默认配置文件中的optimization合并,而是合并到了options中。在翻看文档后发现如果要自定义配置的话需要使用vuecli中的chainWebpack方法

//vue.config.js
const { defineConfig } = require('@vue/cli-service');
const TerserPlugin = require("terser-webpack-plugin");
module.exports = defineConfig({
  lintOnSave: false,
  transpileDependencies: true,
  productionSourceMap: false,
  chainWebpack: config => { 
    config.optimization.minimizer('terser').tap(args => {
      args.forEach(item => {
        if(item.hasOwnProperty('terserOptions')) {
          Object.assign(item['terserOptions'].compress,{
            drop_debugger: true,
            drop_console: true,
            pure_funcs: ['console.log']
          })
        }
        item['terserOptions']['format'] = {
          comments: false
        }
      })
      return args
    })
  },
})

 具体webpack-chain的语法可以参考:

GitHub - Yatoo2018/webpack-chain at zh-cmn-HansA chaining API to generate and simplify the modification of Webpack configurations. - GitHub - Yatoo2018/webpack-chain at zh-cmn-Hanshttps://github.com/Yatoo2018/webpack-chain/tree/zh-cmn-Hans

最后我们再次打印下打包配置文件 

optimization: {
   //....
   mnimizer: [
      /* config.optimization.minimizer('terser') */
      new TerserPlugin(
        {
          terserOptions: {
            compress: {
              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,
              drop_debugger: true,
              drop_console: true,
              pure_funcs: [
                'console.log'
              ]
            },
            mangle: {
              safari10: true
            },
            format: {
              comments: false
            }
          },
          parallel: true,
          extractComments: false
        }
      ),
     minimize: true
     //...
}

此时我们TerserPlugin插件的默认配置就已经和我们自定义修改的配置进行合并了

最后重新打包发现控制台已经没有注释,完美收工。

### Vue项目生产环境移除`console.log`的方法 在Vue项目的生产环境中,可以通过多种方式实现打包自动移除所有的 `console.log` 语句。以下是几种常见的解决方案: #### 方法一:通过 `UglifyJsPlugin` 插件 可以在 Webpack配置中引入 `UglifyJsPlugin` 插件来处理生产环境下的代码优化。具体操作如下: ```javascript const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); // 引入插件 [^1] module.exports = { configureWebpack: { optimization: { minimizer: [ new UglifyJsPlugin({ uglifyOptions: { compress: { drop_console: true, // 自动移除所有 console 调用 }, }, }), ], }, }, }; ``` 此方法适用于较旧版本的 Webpack Vue CLI--- #### 方法二:通过 `chainWebpack` 配置 如果使用的是 Vue CLI 提供的 `vue.config.js` 文件,则可以利用其内置的 `chainWebpack` 功能进行更灵活的配置。例如: ```javascript if (process.env.NODE_ENV === 'production') { // 判断当前是否为生产环境 [^2] config.optimization.minimizer('terser').tap((args) => { Object.assign(args[0].terserOptions.compress, { pure_funcs: ['console.log'], // 将 console.log 定义为纯函数并移除调用 }); return args; }); } ``` 上述代码会在生产环境下启用 Terser 工具,并将其压缩选项中的 `pure_funcs` 设置为 `['console.log']` 来删除所有日志输出。 --- #### 方法三:通过 `TerserPlugin` 实现 对于现代 Vue 项目(尤其是基于 Vue 3),推荐使用官方支持的 `terser-webpack-plugin` 插件完成这一需求。首先需安装该依赖项: ```bash npm install terser-webpack-plugin --save-dev [^4] ``` 随后修改 `vue.config.js` 中的相关配置: ```javascript const TerserPlugin = require('terser-webpack-plugin'); module.exports = { configureWebpack: { optimization: { minimize: true, minimizer: [ new TerserPlugin({ terserOptions: { compress: { drop_console: true, // 删除所有 console 日志 }, }, }), ], }, }, }; ``` 这种方法不仅能够有效清除控制台打印语句,还兼容最新的构建工具链特性。 --- #### 使用 `DefinePlugin` 替代方案 虽然 `DefinePlugin` 主要用于定义全局常量替换功能,但它也可以间接影响某些条件逻辑执行路径从而屏蔽部分调试信息。不过需要注意这种方式并不直接作用于已存在的 `console.log()` 表达式本身。 ```javascript new webpack.DefinePlugin({ 'process.env': JSON.stringify(process.env), }); ``` 通常建议优先采用前三种更为精准的技术手段而非单纯依靠宏定义解决此类问题。 --- ### 总结 以上介绍了四种不同的技术途径帮助开发者实现在 Vue 应用程序生成最终产物阶段剔除非必要的开发辅助型输出内容——即各种形式的日志记录命令(`console.*`)。每种策略各有优劣,请依据实际场景选取最合适的实践模式加以应用即可达成目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值