Javascript 丑陋的js不';更改变量名

Javascript 丑陋的js不';更改变量名,javascript,performance,compression,minify,uglifyjs,Javascript,Performance,Compression,Minify,Uglifyjs,尝试为我的js库准备良好的构建环境。根据网上的评论,它似乎是最好的压缩模块之一,在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

尝试为我的js库准备良好的构建环境。根据网上的评论,它似乎是最好的压缩模块之一,在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\u mangle(ast)
应该会损坏变量名,但它不会。我从这个管道中得到的只是javascript代码,没有空格。起初,我认为我的代码没有针对压缩进行优化,但后来我尝试了压缩,得到了相当大的压缩(变量名和所有内容都有问题)

丑八怪专家们,有没有暗示我做错了什么

更新

实际代码太大,无法在此处引用,但即使是这样的代码片段也不会被破坏:

;(function(window, document, undefined) {

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

    // ...

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

}(window, document));
这就是我得到的(我想只有空间被剥夺了):


默认情况下,uglify不会损坏顶级名称,也许这就是您看到的

尝试:
-mt或--mangle toplevel-在toplevel作用域中也可以使用mangle名称(默认情况下,我们不这样做)。

全局作用域中的变量可用于任何其他脚本,因此Uglify不会在没有特殊开关的情况下更改它们,以防您确实需要它们可见。您可以使用
-mt
/
顶级
开关/设置,或者,更好的是,停止污染全局范围,并明确表示您不希望在外部看到这些变量,而是将代码构建到匿名自调用函数中,该函数将用作私有范围。

好,似乎最新版本的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

如果您使用的是Uglify2,那么您可以使用
TopLevel.figure\u out\u scope()

如果您使用的是Uglify1,则会稍微复杂一点。下面是我通过修改以下代码整理的一些代码:


它将分别找到调用
bar(1)
,而不是
bar(2)
bar(3)

ast=uglify.uglify.ast_mangle(ast,{toplevel:true});我所有的代码都封装到匿名自调用函数中。我用一个片段更新了我的问题。还有我如何调试这种情况的提示?toplevel对我不起作用。仍然没有变量的混乱。一切都是匿名函数。全局范围内没有可用的东西。我认为如果你发布一小部分代码以及你发现问题的结果,这会有所帮助。我想也许我遗漏了一些选项。现在更新了小片段。很明显,这与我的环境有关?。。虽然不知道从哪里开始调试它,或者什么可能会影响uglify js的能力,但当它被请求时。好的,通过uglify js的网站,我得到:
(函数(a,b,c){function d(a){function d(a){return typeof a!=“string”?a:b.getElementById(a)}a.mOxie=a.o=d})(窗口,文档)
你确定打开了正确的开关吗?如果我的问题中的uglifyJS调用代码打开了正确的开关,那么-是:|奇怪。。。我在网站上试过,也得到了很好的压缩代码。所以这是我这边的事。。。但不知道是什么。我正在使用我问题中的代码来调用它。“将您的代码构建成匿名自调用函数”这就是我实际上所做的。仅公开一个顶级对象。示例中的每个变量都是外部全局范围的变量。是的,外部范围的变量作为参数传递到自调用匿名函数中。这难道不能使它们(在函数内部)被损坏吗?
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
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);
    }());
  }());
}