web-dev-qa-db-ja.com

uglify-jsはconsole.logステートメントを削除できますか?

glify-js を使用してソースコードを縮小しています。元のソースコードのconsole.logステートメントを削除したい。出来ますか?または、これをサポートする他の圧縮ツールはありますか?

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);

出力は次のとおりです。

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

縮小されたコードでは、console.logは削除されません。

39
Jeffrey

最新のuglify-js(v2.4.3)では、新しい圧縮オプション「pure_funcs」が追加されています。 console.log関数をこの配列に追加すると、縮小されたjsファイルから削除されます。以下のテストコードは、このオプションの動作を示しています。これはまさに私が欲しいものです。

// 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' }

https://github.com/mishoo/UglifyJS2 からの引用

pure_funcs-デフォルトのヌル。名前の配列を渡すことができ、UglifyJSはそれらの関数が副作用を引き起こさないと想定します。危険:名前がスコープ内で再定義されているかどうかをチェックしません。ここでの例は、たとえばvar q = Math.floor(a/b)です。変数qが他の場所で使用されていない場合、UglifyJSはそれをドロップしますが、それが何をするかを知らずに、Math.floor(a/b)を保持します。 pure_funcs:['Math.floor']を渡すと、この関数が副作用を引き起こさないことを通知できます。この場合、ステートメント全体が破棄されます。現在の実装ではオーバーヘッドが追加されます(圧縮は遅くなります)。

28
Jeffrey

また、最近追加されたdrop_consoleという別のオプションもあります(2013年後半)

drop_console -- default false. Pass true to discard calls to console.* functions

これは、次のようにgrunt init構成に追加されます。

grunt.initConfig({
  uglify: {
    options: {
      compress: {
        drop_console: true // <-
      }
    },
    my_target: {
      files: {
        'dest/output.min.js': ['src/input.js']
      }
    }
  }
});

grunt-contrib-uglify githubドキュメント

77
Joshua

Groundskeeper を使用してこれを行うことができますが、別の手順になります。

4

-cオプションの場合、drop_consoletrueに設定:uglifyjs app.js -m -c drop_console=true -o app.min.js

3
KiwenLau

Gulpを使用している場合は、「gulp-strip-debug」を使用して、コンソール、アラート、およびデバッガーを削除します。 https://www.npmjs.com/package/gulp-strip-debug

1
pratik nagariya