1

Оператор if, который, очевидно, всегда неверен, например. if (false), закрытие снимает утверждение.Получение Closure/Plovr для удаления функций из if, если это всегда ложно

Мой код выглядит следующим образом:

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

settings.lang является константой.

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

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

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

+1

какой у вас уровень компиляции? вы пробовали передать его как @define? – lennel

+0

И вам, возможно, придется больше узнать о вашем исходном коде. Быстрая проверка на clos-compiler.appspot.com показывает, что оптимизация, которую вы выполняете, работает, как ожидалось. –

+0

Я думал, что определение может быть ответом. Я определяю goog.DEBUG, но goog.LANG выдает предупреждение plovr. Я не могу найти документацию по использованию @define для пользовательских свойств. – ColBeseder

ответ

2

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

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

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

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

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

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

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

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

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

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

Вы должны получить предупреждение, если определение определить не действует в некотором роде.

1

Звучит так, будто вы используете какой-то режим компиляции (скорее всего, режим компиляции 'SIMPLE', так как это the default in plovr), кроме 'ADVANCED' компиляции. Расширенный режим компиляции is the one that does dead code removal.

+0

Я использую 'ADVANCED'. Это просто не идентифицирует его как мертвый код. – ColBeseder

1

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