Uglify-js не искажает имена переменных

Пытаюсь подготовить хорошую среду сборки для моей библиотеки js. По отзывам в интернетеUglifyJS кажется, один из лучших модулей сжатия, работающих под NodeJS. Итак, вот лучший рекомендуемый способ минимизации кода:

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "... JS code here";
var ast = jsp.parse(orig_code); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here

Как видно здесь,pro.ast_mangle(ast) должен искажать имена переменных, но это не так. Все, что я получаю из этого канала, - это код JavaScript без пробелов. Сначала я думал, что мой код не был оптимизирован для сжатия, но потом я попробовал его сGoogle Closure и получил довольно сжатие (с искаженными именами переменных и все).

UglifyJS эксперты, любой намек на то, что я делаю неправильно?

UPDATE:

Фактический код слишком велик, чтобы ссылаться на него, но даже такой фрагмент не может быть поврежден:

;(function(window, document, undefined) {

    function o(id) {
        if (typeof id !== 'string') {
            return id;  
        }
        return document.getElementById(id);
    }   

    // ...

    /** @namespace */
    window.mOxie = o;

}(window, document));

Это то, что я получаю (думаю, только пробелы удаляются):

(function(window,document,undefined){function o(id){return typeof id!="string"?id:document.getElementById(id)}window.mOxie=window.o=o})(window,document)
 jayarjo11 июн. 2012 г., 09:46
Странно ... Я попробовал это на сайте и тоже получил хорошо сжатый код. Так что это что-то на моей стороне ... но понятия не имею, что. Я использую код в своем вопросе, чтобы вызвать его.
 jayarjo11 июн. 2012 г., 09:39
Если из моего вопроса включены правильные переключатели с помощью кода вызова uglifyJS, тогда - да: |
 jayarjo10 июн. 2012 г., 17:14
Я подумал, может быть, был какой-то вариант, который мне не хватало. Обновлено сейчас с небольшим фрагментом. Очевидно, это что-то с моей средой? .. Хотя не уверен, с чего начать отладку или что может повлиять на способность uglify-js манипулировать, когда это запрашивается.
 Stephen Chung11 июн. 2012 г., 03:49
Ну, через веб-сайт UglifyJS я получил:(function(a,b,c){function d(a){return typeof a!="string"?a:b.getElementById(a)}a.mOxie=a.o=d})(window,document)  Вы уверены, что включили правильные выключатели?
 Stephen Chung09 июн. 2012 г., 14:47
Я думаю, что это поможет, если вы разместите небольшой фрагмент кода и результаты, с которыми у вас возникнут проблемы.

Ответы на вопрос(4)

TopLevel.figure_out_scope(). http://lisperator.net/uglifyjs/scope

Если вы используете Uglify1, это немного сложнее. Вот некоторый код, который я собрал, изменив код изУродовать & APOS; ssqueeze_more.js file:

function eachGlobalFunctionCall(ast, callback) {
  var w = uglify.uglify.ast_walker(),
      walk = w.walk,
      MAP = uglify.uglify.MAP,
      scope;

  function with_scope(s, cont) {
    var save = scope, ret;
    scope = s;
    ret = cont();
    scope = save;
    return ret;
  }

  function _lambda(name, args, body) {
    return [ this[0], name, args, with_scope(body.scope, curry(MAP, body, walk)) ];
  }

  w.with_walkers({
    "function": _lambda,
    "defun": _lambda,
    "toplevel": function(body) {
      return [ this[0], with_scope(this.scope, curry(MAP, body, walk)) ];
    },
    "call": function(expr, args) {
      var fnName = expr[1];

      if (!scope.has(fnName)) {    // <--- here's the important part
        callback(fnName, args, scope);
      }
    }
  }, function() {
    return walk(uglify.uglify.ast_add_scope(ast));
  });
}

Этот выше работает только для глобальных вызовов функций, но он дает вам обратный вызов, который выполняется, когда обходчик находит вызов неизвестного (глобального) метода.

Например, с учетом следующего ввода:

function foo () {
  bar(1);
  (function () {
    function bar() { }
    bar(2);
    (function () {
      bar(3);
    }());
  }());
}

Было бы найти звонокbar(1) ноnot bar(2) или жеbar(3).

может быть, это то, что вы видели?

Пытаться: -mt или --mangle-toplevel & # x2014; также можно изменять имена в области верхнего уровня (по умолчанию мы этого не делаем).

 12 нояб. 2015 г., 21:19
Спасибо, у меня работает
 jayarjo10 июн. 2012 г., 17:17
Весь мой код инкапсулирован в анонимную самопризывающую функцию. Я обновил свой вопрос с помощью фрагмента. И намек на то, как я мог отладить ситуацию?
 02 июл. 2016 г., 16:13
toplevel не работает для меня. до сих пор нет искажения переменных. все в анонимных функциях. ничего не доступно из глобальной области.
 09 июн. 2012 г., 13:42
соответственно ast = uglify.uglify.ast_mangle (ast, {toplevel: true});

сценария, поэтому Uglify не изменит их без специального переключателя, если вам действительно нужно, чтобы они были видны. Вы можете использовать-mt/toplevel переключите / настройку, или, что еще лучше, прекратите загрязнять глобальную область видимости и четко укажите, что вы не намерены отображать эти переменные снаружи, а вставляете свой код в анонимную самопризывающую функцию, которая будет служить частной областью действия.

 10 июн. 2012 г., 20:43
Каждая переменная в вашем примере является переменной из внешней, глобальной области видимости.
 jayarjo10 июн. 2012 г., 17:06
& quot; вставка вашего кода в анонимную функцию, вызывающую себя & quot; это то, что я делаю на самом деле. Только один объект верхнего уровня выставлен.
Решение Вопроса

похоже, что последняя версия Uglify JS требует, чтобы опция mangle была явно передана как true, в противном случае она ничего не изменит. Как это:

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "... JS code here";
var options = {
    mangle: true
};

var ast = jsp.parse(orig_code); // parse code and get the initial AST
ast = pro.ast_mangle(ast, options); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here

Ваш ответ на вопрос