如何告诉Closure Compiler保留对象的属性

时间:2012-03-11 23:04:47

标签: google-closure-compiler

我有一个像这样声明的对象:

my.namespace.FEATURES = {
    FIRST_FEATURE = "first feature",
    SECOND_FEATURE = "second feature"
};

我使用my.namespace.my.object来跟踪我的代码中可用/实现的功能类型。每个新发布的版本都将具有一组经过修改的功能。使用我的最小化代码的第三方将想知道他们在他们的版本中可以做什么,所以我提供了以下函数,它被导出,以便他们知道他们可以做什么。

my.namespace.hasFeature = function(feature) {
    for(var prop in my.namespace.FEATURES) {
        if(my.namespace.FEATURES[prop] == feature) {
            return true;
        }
    }
    return false;
}

问题是当我运行Closure Compiler时,属性会被重命名。

我的问题是:保留这些属性的最佳方法是什么?我知道我可以出口这个房产,但出于某种原因感觉有点脏。是否有Closure最佳实践来保留对象的属性?

3 个答案:

答案 0 :(得分:4)

在ADVANCED模式下,简单地引用键会告诉编译器不要重命名它们:

my.namespace.FEATURES = {
    'FIRST_FEATURE' : "first feature",
    'SECOND_FEATURE' : "second feature"
};

有关属性重命名的有用信息:

https://developers.google.com/closure/compiler/docs/api-tutorial3

https://github.com/google/closure-compiler/wiki/FAQ#some-of-my-properties-are-getting-renamed-but-some-arent-why

答案 1 :(得分:4)

Closure Compiler具有JavaDoc样式标记...
这是引用标记的页面:Annotating JavaScript for the Closure Compiler
要保留字段名称,请在字段声明前放置/** @expose */

my.namespace.FEATURES = {
    /**@expose*/
    FIRST_FEATURE: "first feature",
    /**@expose*/
    SECOND_FEATURE: "second feature"
};

...如果您需要保留命名空间,那就是相同的概念......

/**@expose*/
my = my || {};
/**@expose*/
my.namespace = my.namespace || {};
/**@expose*/
my.namespace.FEATURES = {
    /**@expose*/
    FIRST_FEATURE: "first feature",
    /**@expose*/
    SECOND_FEATURE: "second feature"
};

除了保留字段名称外,它还允许您稍后在代码中使用点符号引用该字段。使用obj["field"],如果稍后用obj.field调用它,编译器将丢失引用,而不必使用字符串。

答案 2 :(得分:1)

导出是有原因的 - 作为Closure库的指令,外部代理使用它,因此不应重命名。 sections here on exporting解释了如何强制Closure保持符号完整(没有重命名)。你大多只需要遵循这里的指示。出口没什么“脏”的。它正是你需要的 - 告诉Closure这个符号是由外部代理使用的,不能重命名。

可以阻止Closure重命名属性的另一个触发器是它是否被这样的字符串访问:

var f = "FIRST_FEATURE";
my.namespace.FEATURES[f] = "first feature";

在这种情况下,Closure看到你的代码使用字符串来处理属性,并且(因为它从不会混淆字符串值),它意识到它不能安全地重命名FIRST_FEATURE属性。