Как сказать Closure Compiler сохранить свойства объекта - PullRequest
2 голосов
/ 12 марта 2012

У меня есть объект, объявленный так:

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 ]

4 голосов
/ 12 марта 2012

В режиме 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

4 голосов
/ 10 ноября 2014

Компилятор Closure имеет разметку в стиле JavaDoc ...Вот страница со ссылками на разметки: Аннотирование JavaScript для компилятора Closure Чтобы сохранить имя поля, поместите /** @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 позже, вместо того, чтобы использовать строки.

1 голос
/ 12 марта 2012

Экспорт существует по причине - в качестве директивы для библиотеки Closure, что она используется внешними агентами, поэтому ее не следует переименовывать. Разделы , описанные здесь при экспорте , объясняют, как вы можете заставить Closure сохранить символ без изменений (без переименования). В основном вам просто нужно следовать указаниям здесь. В экспорте нет ничего "грязного". Это именно то, что вам нужно - сообщить Closure, что этот символ используется внешним агентом и не может быть переименован.

Еще один триггер, который может помешать Closure переименовать свойство, если к нему обращается строка, подобная этой:

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

В этом случае Closure видит, что ваш код использует строки для адресации свойства и (поскольку он никогда не путается со строковыми значениями), он понимает, что не может переименовать свойство FIRST_FEATURE безопасно.

...