闭包编译器删除类名称空间

Closure compiler removing class namespaces

本文关键字:空间 编译器 删除 闭包      更新时间:2023-09-26

我有一堆JavaScript原型彼此继承。每个类都在自己的文件中定义,如下所示。一个示例文件如下所示:

goog.provide("app.classes.ClassA");
(function() {
    app.classes.ClassA = function() {
        // constructor
    }
    app.classes.ClassA.prototype.example = function() {
        // example method
    }
})();

第二个文件可能像这样:

goog.provide("app.classes.ClassB");
goog.require("app.classes.ClassA");
(function() {
    app.classes.ClassB = function() {
        // constructor
    }
    goog.inherits(app.classes.ClassB, app.classes.ClassA);
    app.classes.ClassB.prototype.example = function() {
        // example method
    }
})();

运行编译器后,第一个文件中指定的代码如下所示:

goog.provide("app.classes.ClassA");
(function() {
    a.classes.ClassA = function() {
        // constructor
    }
    a.classes.ClassA.prototype.example = function() {
        // example method
    }
})();
ClassA中的

'app'已被单个'a'和goog取代。继承无法找到app.classes.ClassA,因为它未定义。

如何防止闭包编译器像这样重命名命名空间?

谢谢!

有两种方法,首先你可以用@expose:

注释你的外部方法/变量/类
(function() {
    /**
    * @expose
    */
    a.classes.ClassA = function() {
        // constructor
    }
    a.classes.ClassA.prototype.example = function() {
        // example method
    }
})();

或者,您可以在运行闭包编译器时禁用优化:

java -jar ccompiler.jar --compilation_level WHITESPACE_ONLY ..