Closure Compiler - 混淆 public 方法 - 不一致的行为?
Closure Compiler - obfuscate public methods - inconsistent behavior?
我刚开始使用 Closure Compiler,我看到一些关于混淆 public 对象方法的不一致行为。
我正在使用 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
)中的所有 public 方法也被混淆?
请注意-
- 我愿意使用除 Closure Compiler 之外的其他工具来实现此目的。
- 我想在 TypeScript 中使用它,即混淆编译后的 TypeScript 代码,这就是为什么我有很多 public 方法。
- 某些特定方法是 API 不应混淆的方法。所以我需要一种方法来告诉混淆器要跳过哪些方法。
我想通了 - get
和 put
被认为是保留字,闭包编译器故意忽略它们。
我之前 运行 浏览了这些保留字的列表,但现在找不到...如果有人将 link 发布到完整列表,我将不胜感激。
更新
从 20150315 版 Closure-compiler 开始,默认启用基于类型的优化。
这个其实在项目FAQ.
里有讲到
您想要的选项是use_types_for_optimization
。这将启用 属性 重命名,即使在不相关的对象上定义了相同名称的 属性。
只能使用此标志重命名的综合属性列表非常庞大:在外部文件中的任何对象上定义的任何 属性 名称。
我刚开始使用 Closure Compiler,我看到一些关于混淆 public 对象方法的不一致行为。
我正在使用 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
)中的所有 public 方法也被混淆?
请注意-
- 我愿意使用除 Closure Compiler 之外的其他工具来实现此目的。
- 我想在 TypeScript 中使用它,即混淆编译后的 TypeScript 代码,这就是为什么我有很多 public 方法。
- 某些特定方法是 API 不应混淆的方法。所以我需要一种方法来告诉混淆器要跳过哪些方法。
我想通了 - get
和 put
被认为是保留字,闭包编译器故意忽略它们。
我之前 运行 浏览了这些保留字的列表,但现在找不到...如果有人将 link 发布到完整列表,我将不胜感激。
更新
从 20150315 版 Closure-compiler 开始,默认启用基于类型的优化。
这个其实在项目FAQ.
里有讲到您想要的选项是use_types_for_optimization
。这将启用 属性 重命名,即使在不相关的对象上定义了相同名称的 属性。
只能使用此标志重命名的综合属性列表非常庞大:在外部文件中的任何对象上定义的任何 属性 名称。