Получение Closure / Plovr для удаления функций из if, если всегда ложно

Заявление if, которое, очевидно, всегда ложно, например. if (false) Закрытие удаляет утверждение.

Мой код выглядит так:

if (settings.lang === "en"){
    lib.doSomething();
}

settings.lang постоянная

/** 
 * @type {string}
 * @const 
 */ 
settings.lang = "fr" ;  

Таким образом, когда он равен "FR", компилятор может удалить if и определение lib.doSomething во время компиляции. Но это не так. Есть ли способ заставить это сделать это?

Прежде чем спросить, почему я не просто удаляю этот код: для других клиентов, settings.lang установлен в en,

3 ответа

Решение

1) Убедитесь, что "настройки" правильно определены:

/** @const */
var settings = {};

2) Убедитесь, что "настройки" lang правильно определены:

/** @const */ 
settings.lang = "fr" ;

3) Убедитесь, что на значение ссылаются после того, как оно определено:

if (settings.lang == "en") ...

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

Это упрощается, если вы используете @define:

/** @const */
var settings = {};

/** @define {string} */
settings.lang = "fr";

Вы должны получить предупреждение, если определение определения каким-то образом недопустимо.

Goog.LANG определяется с помощью goog.define? В последний раз я проверял, что Plovr не совместим с goog.define (в нем нет новейшего компилятора), убедитесь, что вы запускаете совместимую версию библиотеки Closure.

Похоже, вы используете какой-то режим компиляции (скорее всего, 'SIMPLE' режим компиляции, так как это по умолчанию в plovr), кроме 'ADVANCED' режим компиляции. Расширенный режим компиляции - тот, который делает удаление мертвого кода.

Другие вопросы по тегам