使用 Webpack 和 Uglify 删除 console.logs

Posted

技术标签:

【中文标题】使用 Webpack 和 Uglify 删除 console.logs【英文标题】:Remove console.logs with Webpack & Uglify 【发布时间】:2017-04-23 17:49:24 【问题描述】:

我正在尝试使用 Webpack 的 Uglify 插件删除 console.logs,但似乎与 Webpack 捆绑在一起的 Uglify 插件没有该选项,文档中未提及。

我正在像这样从 webpack 初始化 uglify:

new webpack.optimize.UglifyJsPlugin()

我的理解是我可以使用独立的 Uglify lib 来获取所有选项,但我不知道是哪一个?

问题是drop_console 不起作用。

【问题讨论】:

【参考方案1】:

使用UglifyJsPlugin,我们可以处理cmets、警告、控制台日志,但在开发模式下删除所有这些并不是一个好主意。首先检查你是否在为prod env or dev env运行webpack,如果是prod env那么你可以删除所有这些,像这样:

var debug = process.env.NODE_ENV !== "production";

plugins: !debug ? [
   new webpack.optimize.UglifyJsPlugin(

     // Eliminate comments
        comments: false,

    // Compression specific options
       compress: 
         // remove warnings
            warnings: false,

         // Drop console statements
            drop_console: true
       ,
    )
]
: []

参考:https://github.com/mishoo/UglifyJS2#compressor-options

2019 年更新 现在需要在 webpack v4 中使用 terser 插件来支持 ES6 https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions

webpack.config.js

module.exports = 
  optimization: 
    minimizer: [
      new TerserPlugin(
        sourceMap: true, // Must be set to true if using source-maps in production
        terserOptions: 
          compress: 
            drop_console: true,
          ,
        ,
      ),
    ],
  ,
;

【讨论】:

我正在使用 drop_console: true 但它不会删除控制台日志。首先我虽然 webpacks uglify 插件没有附带这些选项,因为官方 webpack 码头上没有提到它们。但似乎我使用的是正确的 uglify 插件,只是 drop_console 不起作用。这是我的 webpack 配置:pastebin.com/tvymXfZ0 试试这个:hastebin.com/kunokasenu.js 这是我的产品配置,我也有单独的开发配置。 我使用相同的代码,当我使用 webpack -p 构建它时一切正常。 这在 Webpack 4 中不起作用:webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead. 见:***.com/questions/49101152/…【参考方案2】:

试试drop_console:

plugins: [
    new Webpack.optimize.UglifyJsPlugin(
      compress: 
        drop_console: true,
      
    
]

更新:对于 webpack v4,它有一点改变:

const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

...

optimization: 
  minimizer: [
    new UglifyJSPlugin(
      uglifyOptions: 
        compress: 
          drop_console: true,
        
      
    )
  ]

我个人认为控制台日志(尤其是console.error)在 prod 上非常有用,并且认为保留它们是个好主意。如果您真的想删除特定的控制台功能,例如 console.log,您应该使用 pure_funcs 选项,例如pure_funcs: ['console.log'],这将删除 console.log,因为纯函数不会产生副作用,然后 Uglify 可以丢弃那些 未分配 到任何东西。

optimization: 
  minimizer: [
    new UglifyJSPlugin(
      uglifyOptions: 
        compress: 
          // Drop only console.logs but leave others
          pure_funcs: ['console.log'],
        ,
        mangle: 
          // Note: I'm not certain this is needed.
          reserved: ['console.log']
        
      
    )
  ]

对于 TerserJS(Uglify 已弃用且不支持新的 JS 功能,您不应使用它)

optimization: 
  minimizer: [
    new TerserPlugin(
      terserOptions: 
        compress: 
            drop_console: true
        
      
    )
  ]

如前所述,您也可以使用pure_funcs

【讨论】:

这正是我尝试过的,但它没有做任何事情。我可以看到它使代码变得丑陋,但不会删除控制台日志。 我实际上正试图做相反的事情,不幸的是设置 drop_console: false 并没有帮助我。 这在 Webpack 4 中不起作用:webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead. 见:***.com/questions/49101152/… 我是否同时使用 terser 和 uglify?【参考方案3】:

这是 Webpack v4 的新语法:

optimization: 
  minimizer: [
    new UglifyJSPlugin(
      uglifyOptions: 
        compress: 
          drop_console: true
        ,
        output: 
          comments: false
        
      ,
    ),
  ],
,

【讨论】:

【参考方案4】:

您可以使用terser-webpack-plugin compress 选项pure_funcs 参数选择性地删除控制台函数并保留您想要的控制台函数,例如console.error。

我使用的是“webpack”:“^4.39.3”和“terser-webpack-plugin”:“^2.3.2”。

步骤: 1. npm install terser-webpack-plugin --save-dev 2. 修改你的 webpack.config 设置 TerserPlugin 作为优化选项的最小化。

const TerserPlugin = require('terser-webpack-plugin');

module.exports = (env) => 
    return [
        entry: '...',
        mode: 'production',
        output: ...,
        plugins: [...],
        optimization: 
            'minimize': true,
            minimizer: [new TerserPlugin(
                terserOptions:  
                    compress:  
                        pure_funcs: [
                            'console.log', 
                            'console.info', 
                            'console.debug', 
                            'console.warn'
                        ] 
                     
                 
            )],
        ,
        module: ...
    ];
;

【讨论】:

【参考方案5】:

对于 uglifyjs-webpack-plugin,将选项包装在 uglifyOptions 对象中:

    plugins: [
    new UglifyJSPlugin(
        uglifyOptions: 
            compress: 
                drop_console: true
            
        
    )
]

【讨论】:

【参考方案6】:

我已经为带有调试配置的 webpack v4 添加了一个全面的答案

const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
var debug = process.env.NODE_ENV !== "production";

.....
optimization: 
        minimizer: !debug ? [
            new UglifyJsPlugin(

                    // Compression specific options
                    uglifyOptions: 
                        // Eliminate comments
                        comments: false,

                        compress: 
                            // remove warnings
                                warnings: false,

                            // Drop console statements
                                drop_console: true
                        ,
                    

                )
            ]
            : []
    

我在 package.json 中的脚本是这样的:

"webpackDev": "npm run clean && export NODE_ENV=development && npx webpack",
"webpackProd": "npm run clean && export NODE_ENV=production && npx webpack -p"

【讨论】:

【参考方案7】:

这就是我从我的代码中删除 alert() 和 console.log() 所做的。 global_defs => 用 console.log 替换警报 然后 drop_console 删除所有 console.logs,现在我的浏览器控制台中没有任何显示

     new UglifyJsPlugin(
      uglifyOptions: 
        compress: 
          global_defs: 
            "@alert": "console.log",
          ,
          drop_console: true
        
      
    ),

插件版本:

"webpack":3.12.0,
"webpack-cli": "^3.0.3",
"uglifyjs-webpack-plugin": "^1.2.5",

现在 uglifyjs-webpack-plugin v1.2.6 已经发布,我使用了最新的文档,所以我想最新的插件也不会有任何问题。

【讨论】:

【参考方案8】:

webpack 4.x 移除 console.log 解决方案

    只删除console.log,但保留其他控制台(推荐✅)

pure_funcs: ['console.log']

const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

// webpack.config.js
module.exports = 
    // ...
    optimization: 
        minimizer: [
            new UglifyJSPlugin(
                uglifyOptions: 
                    compress: 
                        pure_funcs: [
                            'console.log',
                            // 'console.error',
                            // 'console.warn',
                            // ...
                        ],
                    ,
                    // Make sure symbols under `pure_funcs`,
                    // are also under `mangle.reserved` to avoid mangling.
                    mangle: 
                        reserved: [
                            'console.log',
                            // 'console.error',
                            // 'console.warn',
                            // ...
                        ],
                    ,
                ,
            ),
        ],
    ,
    // ...


    删除所有控制台,包括(console.log、console.error、console.warn、...等)(不推荐??‍♂️)

drop_console: 真,

const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

// webpack.config.js
module.exports = 
    // ...
    optimization: 
        minimizer: [
            new UglifyJSPlugin(
                uglifyOptions: 
                    compress: 
                        drop_console: true,
                    ,
                ,
            ),
        ],
    ,
    // ...



所有控制台

Chrome Google,版本 88.0.4324.192(官方构建)(x86_64)

参考

https://github.com/mishoo/UglifyJS#compress-options

【讨论】:

【参考方案9】:

使用这个更好并且有效 const UglifyEsPlugin = require('uglify-es-webpack-plugin')

module.exports = 
plugins: [
        new UglifyEsPlugin(
            compress:
                drop_console: true
            
        ),
] 

【讨论】:

以上是关于使用 Webpack 和 Uglify 删除 console.logs的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Webpack 对 Typescript 文件进行 Uglify

[Vue CLI 3] Uglify 相关的应用和设计

uglify-es 解决webpack 不能压缩es6 的问题

uglify丑化

webpack优化篇(四十四):多进程并行压缩代码

UglifyJs意外令牌错误