Автоудаление отладочных свойств и объектов
Как правило, в нашем коде есть отладочные вызовы.
Например:
console.info("created "+object)
Или даже такие:
my.ajax.debugSend(message)
Google Closure Compiler позволяет удалять такие вызовы из production-кода. Здесь вопрос даже не столько в размере кода и в быстродействии, как в удобстве. Как правило, никому не нужны вызовы console.debug на боевом сервере.
Для этого можно добавить флаги, устанавливающие несколько недокументированных внутренних опций.
- --strip_types
- Типы, которые будут удалены. Например, "--strip_types console" приведет к удалению всех вызовов вида "console.*":
console.log , console.debug и т.п.
- --strip_name_prefixes
- Удаляет все вызовы, которые начинаются с указанной строки. Например, "--strip_name_prefixes debug" приведет к удалению вызовов вида "debug*" для любых объектов.
В частности, удалятся console.debug(..) , my.debugMethod(..) .
- --strip_name_suffixes
- Аналогично
--strip_name_prefixes , но вызовы должны заканчиваться на строку.
- --strip_type_prefixes
- То же самое, что
--strip_types , но проверяет не точное совпадение названия типа, а его начало.
Например:
/** @constructor */
function Animal(name, speed) {
my.ajax.debugSend(name)
console.info("created animal "+name)
this.name = name
this.speed = speed
}
После запуска с флагами:
--strip_types console --strip_name_prefixes debug
Останется:
function Animal(a, b) {
this.name = a;
this.speed = b
}
Чтобы подключить эту опцию, необходимо добавить соответствующие флаги компилятору:
@FlagSpec(help = "Specify stripTypes. You can include multiple.")
private static final Flag<List<String>> FLAG_strip_types
= Flag.stringCollector();
@FlagSpec(help = "Specify stripTypePrefixes. You can include multiple.")
public static final Flag<List<String>> FLAG_strip_type_prefixes = Flag.stringCollector();
@FlagSpec(help = "Specify stripTypeSuffixes. You can include multiple.")
private static final Flag<List<String>> FLAG_strip_name_suffixes
= Flag.stringCollector();
@FlagSpec(help = "Specify stripNamePrefixes. You can include multiple.")
private static final Flag<List<String>> FLAG_strip_name_prefixes
= Flag.stringCollector();
Здесь использован тип флагов stringCollector . Он допускает многократное указание одного и того же флага и собирает значения в список:
--strip_types console --strip_types debug ... .
В опции компилятора добавим значения из флагов.
options.stripTypes = new HashSet<String>(FLAG_strip_types.get());
options.stripTypePrefixes = new HashSet<String>(FLAG_strip_type_prefixes.get());
options.stripNameSuffixes = new HashSet<String>(FLAG_strip_name_suffixes.get());
options.stripNamePrefixes = new HashSet<String>(FLAG_strip_name_prefixes.get());
Эти опции запускают встроенный проход компилятора, который удаляет символы, подпадающие под strip-флаги.
Готовый файл MyCompilerRunner.java с этими опциями вы можете увидеть в конце статьи Использование внутренних опций и собственные флаги.
|
Подскажите чем еще(какие инструменеты), кроме Google Closure Compiler, можно убрать отладочный код?
С Closure Compiler проблема, что он обновился и убраны флаги com.google.common.flags.Flag. Та и не все js разработчики знают java.