2013-11-20 1 views
34

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

+1

Я думаю, что есть несколько Grunt-плагинов, которые могут это сделать. – hgoebl

ответ

21

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

2

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

66

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

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

Это добавляется в хрюкать инициализации конфигурации, как это:

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

Как взяты из grunt-contrib-uglify github documents

+1

Это потрясающе, но не могли бы вы улучшить свой ответ, уточнив, где добавить это в Gruntfile.js? – Micros

+2

См. Https://github.com/gruntjs/grunt-contrib-uglify/blob/master/docs/uglify-examples.md добавить его к параметру сжатия – geographika

+1

Теперь изменилось на dropConsole в случае с верблюдом – benpalmer

1

для -c опция, комплект drop_console быть правдой: uglifyjs app.js -m -c drop_console=true -o app.min.js

+0

Как добавить в Grunt.js? –

Смежные вопросы