Я ищу способ убрать отладочный код из функций, чтобы добавить тестовые хуки к закрытию. Я прочитал Расширенный компилятор Google Closure: удаление блоков кода во время компиляции и протестировал удаление отладочного кода следующим образом:
/** @define {boolean} */
var DEBUG = true;
if (DEBUG) {
console.log('remove me');
}
Простая оптимизация с --define='DEBUG=false'
сокращает это до var DEBUG=!1;
. То же самое относится и к этому:
/** @const */
var DEBUG = false;
if (DEBUG) {
console.log('remove me');
}
Когда у меня возникают проблемы, я использую это соглашение внутри функции:
/** @const */
var DEBUG = false;
function logMe() {
if (DEBUG) {
console.log('remove me');
}
}
Это сводится к следующему:
var DEBUG=!1;function logMe(){DEBUG&&console.log("remove me")};
Я бы ожидал, что он уменьшится до:
var DEBUG=!1;function logMe(){};
Есть ли причина, по которой это не работает должным образом? Я просто ищу чистый способ избавиться от отладочного кода и не готов окунуться в продвинутую оптимизацию.
Обновить
Согласно ответу @John, я реализовал свой собственный компилятор и обнаружил, что следующая конфигурация удалит if (DEBUG) {}
изнутри и снаружи кода для случая @define
:
CompilerOptions options = new CompilerOptions();
CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options);
//options.setInlineConstantVars(true);
options.setInlineVariables(CompilerOptions.Reach.ALL);
options.setDefineToBooleanLiteral("DEBUG", false);
Это работает достаточно хорошо для одного файла со следующими ограничениями:
- Для этого требуется, чтобы
var DEBUG
был определен в каждом файле, что является плохой практикой. - При объединении нескольких файлов у вас может быть только один
var DEBUG
, иначе компилятор не сможет оптимизировать его. Этого можно было избежать, скомпилировав каждый файл по отдельности и объединив их. - Поскольку значение определяется в начале файла, нет возможности получить значение заранее.
Я играл с идеей удалить все var DEBUG
определения из файлов и вставить их в источник или внешний вид перед выполнением, но я столкнулся с двумя проблемами:
- Кажется, что определение его во внешнем виде ничего не дает.
- Неопределенный
DEBUG
в некомпилированном коде вызывает ошибку ссылки в браузере.
Идеальным вариантом было бы тестирование window.DEBUG
, которое не вызывает эталонной ошибки. К сожалению, хотя внедрение /** @const */ var window = {}; /** @const */ window.DEBUG = false;
работает на верхнем уровне, уменьшая if (window.DEBUG) {}
, оптимизация фактически отменяется, если она помещена в функцию.
Если другой вариант компилятора не работает, единственный вариант, который действительно имеет смысл, - это использовать window.DEBUG
и перед компиляцией ввести /** @const */ var DEBUG = false;
и глобальную замену /\bwindow.DEBUG\b/
на DEBUG
. Есть ли способ лучше?
if
на уровне скрипта. Я пытаюсь понять, почему этот подход не работает на один уровень ниже в функции. - person Brian Nickel♦   schedule 10.07.2012