我刚刚开始使用闭包编译器,我看到了一些关于混淆公共对象方法的不一致行为。
我正在使用grunt-closure-compiler
-这是我的grunt配置:
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
'closure-compiler': {
app: {
closurePath: 'closure-compiler',
js: 'src/app.js',
jsOutputFile: 'js/app.min.js',
maxBuffer: 500,
options: {
compilation_level: 'ADVANCED_OPTIMIZATIONS',
language_in: 'ECMASCRIPT5_STRICT',
formatting: 'PRETTY_PRINT'
}
}
}
});
grunt.loadNpmTasks('grunt-closure-compiler');
};
下面是我想混淆的文件app.js
:
(function() {
/**
* @constructor
*/
function MyClass() {
var map = {};
this.put = function(name, val) {
map[name] = val;
};
this.get = function(name) {
return map[name];
};
}
var mapper = new MyClass();
mapper.put("first", 123);
alert(mapper.get("first"));
})();
(function() {
/**
* @constructor
*/
function Foo() {
var private_member_1 = 'bla';
this.someMethod = function(param1, param2) {
// do some stuff
console.log('abc');
return private_member_1;
};
// etc...
}
var foo = new Foo();
var value = foo.someMethod();
console.log(value + value);
})();
这是运行grunt closure-compiler:app
后的输出
'use strict';(function() {
var a = new function() {
var a = {};
this.put = function(b, c) {
a[b] = c;
};
this.get = function(b) {
return a[b];
};
};
a.put("first", 123);
alert(a.get("first"));
})();
(function() {
var a = (new function() {
this.a = function() {
console.log("abc");
return "bla";
};
}).a();
console.log(a + a);
})();
注意,在第一个闭包中,方法put
和get
没有混淆,而在第二个闭包中,方法someMethod
是混淆。
这一切为什么要发生?我如何使我所有类(如put
和get
)中的所有公共方法也被混淆?
请注意-
发布于 2015-01-28 18:50:46
更新
在闭包编译器的20150315版本中,基于类型的优化在默认情况下是启用的。
这实际上是在项目常见问题中讨论的。
您想要的选项是use_types_for_optimization
。这将启用属性重命名,即使在不相关的对象上定义了相同名称的属性。
只能用此标志重命名的属性的综合列表是巨大的:在外挂文件中的任何对象上定义的任何属性名称。
发布于 2015-01-28 15:37:36
我想出来了-- get
和put
被认为是保留词,闭包编译器故意忽略它们。我之前偶然看到了这些保留词的列表,但我现在找不到了.如果有人发布到完整列表的链接,将不胜感激。
https://stackoverflow.com/questions/28196051
复制相似问题