Подтвердить что ты не робот

Может ли uglify-js удалить инструкции console.log?

Я использую uglify-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 не удаляется.

4b9b3361

Ответ 1

В последнем uglify-js (v2.4.3) добавлена ​​новая опция сжатия 'pure_funcs'. Если я добавлю функции console.log в этот массив, он будет удален в файле minified 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 - значение по умолчанию null. Вы можете передать массив имен, и UglifyJS будет считать, что эти функции не создают побочных эффектов. ОПАСНО: не проверяет, переопределено ли имя в области. Пример здесь, например, var q = Math.floor(a/b). Если переменная q не используемый в других местах, UglifyJS отбросит его, но все равно сохранит Math.floor(a/b), не зная, что он делает. Вы можете передать pure_funcs: [ 'Math.floor'], чтобы сообщить, что эта функция не будет производить никаких побочный эффект, и в этом случае вся заявка будет отброшена. Текущая реализация добавляет некоторые накладные расходы (сжатие будет медленнее).

Ответ 2

Также есть еще один вариант с именем drop_console, который был добавлен недавно (конец 2013 года)

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

Это добавлено в конфигурацию инициализации grunt следующим образом:

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

Как взято из документов grunt-contrib-uuglify github

Ответ 3

Вы можете использовать Groundskeeper, чтобы сделать это, но это будет отдельный шаг.

Ответ 4

для параметра -c установите drop_console как true: uglifyjs app.js -m -c drop_console=true -o app.min.js

Ответ 5

Если вы используете gulp, используйте 'gulp -strip-debug' для удаления консоли, предупреждения и отладчика. https://www.npmjs.com/package/gulp-strip-debug