Получение 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'
режим компиляции. Расширенный режим компиляции - тот, который делает удаление мертвого кода.