首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >闭包编译器-混淆的公共方法-不一致的行为?

闭包编译器-混淆的公共方法-不一致的行为?
EN

Stack Overflow用户
提问于 2015-01-28 15:27:37
回答 2查看 1K关注 0票数 2

我刚刚开始使用闭包编译器,我看到了一些关于混淆公共对象方法的不一致行为。

我正在使用grunt-closure-compiler -这是我的grunt配置:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
(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后的输出

代码语言:javascript
运行
复制
'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)中的所有公共方法也被混淆?

请注意-

  • 我愿意使用不同的工具,而不是闭包编译器来实现这一点。
  • 我想将它与TypeScript一起使用,即混淆已编译的TypeScript代码,这就是为什么我有许多公共方法。
  • 一些特定的方法是API方法,不应混淆。所以我需要一种方法来告诉混淆者哪种方法可以跳过。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-28 18:50:46

更新

在闭包编译器的20150315版本中,基于类型的优化在默认情况下是启用的。

这实际上是在项目常见问题中讨论的。

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

只能用此标志重命名的属性的综合列表是巨大的:在外挂文件中的任何对象上定义的任何属性名称。

票数 3
EN

Stack Overflow用户

发布于 2015-01-28 15:37:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28196051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档