我刚刚开始使用Closure Compiler,并且我发现了一些关于公共对象方法混淆的不一致行为。
我使用grunt-closure-compiler
- 这是我的咕噜配置:
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
)都被混淆?
请注意 -
答案 0 :(得分:3)
截至20150315版本的Closure-compiler,默认情况下会启用基于类型的优化。
这实际上已在项目FAQ中介绍。
您想要的选项是use_types_for_optimization
。即使在不相关的对象上定义了相同名称的属性,这也将启用属性重命名。
只能使用此标志重命名的全面属性列表很大:在extern文件中的任何对象上定义的任何属性名称。
答案 1 :(得分:0)
我想出来了 - get
和put
被认为是保留字,而闭包编译器故意忽略它们。
我之前遇到过这些保留字的列表,但我现在无法找到它...如果有人发布了完整列表的链接,我将不胜感激。