Closure Compiler - 混淆公共方法 - 不一致的行为?

时间:2015-01-28 15:27:37

标签: javascript obfuscation google-closure-compiler

我刚刚开始使用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);
})();

请注意,在第一个闭包中,方法putget未进行模糊处理,而在第二个闭包中,方法someMethod 进行了模糊处理。

为什么会这样?我怎样才能使我的所有类中的所有公共方法(如putget)都被混淆?

请注意 -

  • 我愿意使用Closure Compiler以外的其他工具来实现这一目标。
  • 我想在TypeScript中使用它,即模糊编译的TypeScript代码,这就是我有很多公共方法的原因。
  • 某些特定方法是不应混淆的API方法。所以我需要一种方法告诉混淆器要跳过哪些方法。

2 个答案:

答案 0 :(得分:3)

更新

截至20150315版本的Closure-compiler,默认情况下会启用基于类型的优化。


这实际上已在项目FAQ中介绍。

您想要的选项是use_types_for_optimization。即使在不相关的对象上定义了相同名称的属性,这也将启用属性重命名。

只能使用此标志重命名的全面属性列表很大:在extern文件中的任何对象上定义的任何属性名称。

答案 1 :(得分:0)

我想出来了 - getput被认为是保留字,而闭包编译器故意忽略它们。 我之前遇到过这些保留字的列表,但我现在无法找到它...如果有人发布了完整列表的链接,我将不胜感激。