Search code examples
javascriptnode.jsuglifyjs2

Can uglify-js remove the console.log statements?


I'm using uglify-js to minify the source code. I want to remove the console.log statements of the original source code. Is it possible? Or is there any other compressor tool supports this?

I use the code as below in Node.js.

var uglify = require('uglify-js');
var originalSourceCode = 'var name = function(){var str = "test"; return str}; console.log("log data");';
var minifiedCode = uglify.minify(originalSourceCode, {
                fromString : true,
                mangle: {},
                warnings: true
            });
console.log(minifiedCode);

The output is:

$node m.js
{ code: 'var name=function(){var a="test";return a};console.log("log data");',
  map: 'null' }

In the minified code the console.log isn't removed.


Solution

  • In the lastest uglify-js ( v2.4.3), a new compress option ‘pure_funcs’ is added. If I add the console.log functions to this array, it will be removed in the minified js file. The test code below shows how this option works. This is exactly what I want.

    // file: m.js
    var uglify = require('uglify-js');
    var originalSourceCode = 'var name = function(){var str = "test"; return str}; console.log("log data" + name());';
    var minifiedCode = uglify.minify(originalSourceCode, {
                    fromString : true,
                    mangle: {},
                    warnings: true,
                    compress:{
                        pure_funcs: [ 'console.log' ]
                    }
                });
    console.log(minifiedCode);
    
    $node m.js
    WARN: Dropping side-effect-free statement [?:1,53]
    { code: 'var name=function(){var n="test";return n};',
      map: 'null' }
    

    Quotes from https://github.com/mishoo/UglifyJS2

    pure_funcs -- default null. You can pass an array of names and UglifyJS will assume that those functions do not produce side effects. DANGER: will not check if the name is redefined in scope. An example case here, for instance var q = Math.floor(a/b). If variable q is not used elsewhere, UglifyJS will drop it, but will still keep the Math.floor(a/b), not knowing what it does. You can pass pure_funcs: [ 'Math.floor' ] to let it know that this function won't produce any side effect, in which case the whole statement would get discarded. The current implementation adds some overhead (compression will be slower).