Обозревание, минимизация, условная компиляция

TL; DR

minifyify (плагин Browserify) использует uglify-js, но, похоже, не может обрабатывать условная компиляция

  • работает сжатие
  • Только для uglifyjs для условной компиляции
  • minifyify предоставляет дополнительную оптимизацию компиляции, но мне не удалось использовать условную компиляцию с ней

Я использую Browserify с помощью трансформатора babelify и плагина minifyify. Вот cmd, разбитый на читаемые части:

browserify src/scripts/app/index.js -o build/prod/public/assets/js/appBundle.min.js -t [ babelify --presets [ es2015 ] ] -p [ minifyify --no-map --uglify [ --compress [ --drop_console --dead_code --conditionals --unused --if_return ] --mangle --screw-ie8 --define [ DEBUG=false ] ] ]

Я получил каждую настройку/параметр для работы. Однако Я не могу заставить условную компиляцию работать. Minifyify использует метод uglifyjs minify. Тот факт, что я пропускаю minifyify, не должен ничего менять.

Построение непосредственно через работы uglifyjs

uglifyjs input.js --compress --dead_code --define DEBUG=false -o output.js

Но затем я теряю дополнительные сжатия/оптимизации, предоставляемые minifyify.

Я также открыт для другого процесса сборки. Мои потребности возобновляются в настройках текущего процесса:

  • Необходимые модули CommonJS
  • пересылка ES6 на ES5
  • расширенная минификация/сжатие

Ответ 1

Оказывается, виновник был, более или менее, uglifyjs. Имя свойства глобального определения в задаче отличается между CMD и API-интерфейсом Programmatic.

  • строка cmd: --define VARNAME=VALUE
  • программный: compress: {global_defs: { varname: value } }

При этом также кажется, что minifyify или браузерный не передает параметры командной строки cmd для глобальных определений - мы все еще изучаем это

программное решение

Используя программный API Browserify и minifyify, задача сборки работает. Ниже приведена та же задача, что и в OP, но она работает:

"use strict";
var browserify = require("browserify"),
    fs = require("fs");

browserify("src/scripts/app/index.js")
    .transform("babelify", {presets: ["es2015"], plugins: ["transform-object-assign"]})
    .plugin("minifyify", {map: false, uglify: {
        compress: {
            drop_console: true,
            dead_code: true,
            conditionals: true,
            unused: true,
            if_return: true,
            global_defs: {
                DEBUG: false
            }
        },
        mangle: true,
        "screw-ie8": true
    }})
    .bundle()
    .pipe(fs.createWriteStream("build/prod/public/assets/js/appBundle.js"));

обновление в uglifyjs docs

Я предложил внести изменения в текущие документы uglifyjs, предоставив пример с использованием программного API, как указано выше, чтобы избежать этой проблемы для других в будущем.