Closure编译器删除类名称空间

时间:2014-08-15 17:28:43

标签: javascript google-closure

我有一堆相互继承的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中,已被单个' a'并且goog.inherits找不到app.classes.ClassA,因为它未定义。

如何防止Closure Compiler重命名这样的命名空间?

谢谢!

1 个答案:

答案 0 :(得分:0)

有两种方法,首先你可以用@expose注释外部方法/变量/类:

(function() {
    /**
    * @expose
    */
    a.classes.ClassA = function() {
        // constructor
    }

    a.classes.ClassA.prototype.example = function() {
        // example method
    }
})();

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

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