即使在使用对象时,如何强制Google Closure Compiler重命名方法

时间:2013-10-21 16:31:50

标签: javascript google-closure-compiler google-closure-library

当我使用'this'时,谷歌闭包编译器(http://closure-compiler.appspot.com/home)似乎保留了所有方法名称。或使用揭示模块模式时。当它们不在可能被其他外部方法引用的对象中时,它似乎只将方法重命名为字母。我已经尝试包装我的(实用程序)对象和使用它的匿名方法,但这似乎没有帮助。如何创建可能彼此共享的对象(和单独的脚本文件),并且仍然将它缩写为所有方法名称?

我在SO上阅读了几篇帖子,并没有看到任何解决这个问题的帖子,只发布了由于与外部变量冲突而未重命名的内容。

var Utility = (function () {
    this.isDefined = function (v) {
        /// <summary>Checks to see if a variable is defined.</summary>
        return typeof v !== 'undefined';
    }

this.isObj = function (v) {
    /// <summary>Checks to see if a variable is an object.</summary>
    return typeof v === 'object';
}
...

})();

然后我希望能够做到:

(function(u) {
    u.isDefined(); 
})(Utility);

我也试过了:

 var Utility = (function () {
        var utility = {};

        utility.isDefined = function (v) {
            /// <summary>Checks to see if a variable is defined.</summary>
            return typeof v !== 'undefined';
        }

        utility.isObj = function (v) {
            /// <summary>Checks to see if a variable is an object.</summary>
            return typeof v === 'object';
        }

        return utility;
...

1 个答案:

答案 0 :(得分:2)

揭示对象模式不适用于闭包编译器。您使用的额外闭包也不会使窗口别名并记录全局变量。 Closure-compiler也是最终用例本身存在问题。目前,编译器不能很好地处理别名,特别是在将名称空间作为函数参数传递时。

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
var Utility = {};
Utility.isDefined = function (v) {
  /// <summary>Checks to see if a variable is defined.</summary>
  return typeof v !== 'undefined';
};

Utility.isObj = function (v) {
  /// <summary>Checks to see if a variable is an object.</summary>
  return typeof v === 'object';
};

(function() {
   function myPrivateFunction(x) {
   }
   Utility.SomeMethod = function(x) {
     return myPrivateFunction(x);
   };
})();

Utility.isDefined(x);
window['Utility'] = Utility;

可以在http://closure-compiler.appspot.com/

测试此示例的编译和重命名

您可以使用output_wrapper标记并正确导出符号来保护您的局部变量不会流入全局范围。

编译器还特别禁止在非构造函数,非原型函数中使用this关键字。您应该始终使用完整的命名空间。然后,编译器可以展平命名空间方法(这就是限制发生的原因)。

请参阅Which Compilation Level is Right for Me?