Javascript 丑陋的js不';更改变量名
尝试为我的js库准备良好的构建环境。根据网上的评论,它似乎是最好的压缩模块之一,在NodeJS下工作。因此,以下是缩小代码的最佳推荐方法: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
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);
}());
}());
}