Google Closure Compiler - удаление мертвого кода на основе внешних - PullRequest
4 голосов
/ 09 ноября 2011

Я пытаюсь использовать Google Closure Compiler, чтобы разделить код моего приложения в зависимости от того, где он будет запущен (на сервере против клиента), с помощью одной переменной. В этом примере все, что будет вызываться на сервере, находится за isServerSide var, НО, код компилируется для клиента. Поэтому я установлю для isServerSide значение false и разрешу компилятору удалить все, что не будет запускаться клиентом ...

Внутри app.js:

goog.provide('my.app');
my.app.log = function(message) {
  document.write(message);
}
my.app.initClientSide = function() {
  my.app.log('hello client');
}

my.app.initServerSide = function() {
  my.app.log('hello server');
}

if (isServerSide) {
  my.app.log('initing server');
  my.app.initServerSide()
}else my.app.initClientSide();

Внутри externs.js:

/**
 * @define {boolean} is server side?
 */
var isServerSide=false;

Команда:

java -jar bin/compiler.jar --js closure-library/closure/goog/base.js --js app.js --externs externs.js --manage_closure_dependencies true --process_closure_primitives true --summary_detail_level 3 --warning_level VERBOSE --compilation_level=ADVANCED_OPTIMIZATIONS --closure_entry_point my.app

Ожидаемый результат:

document.write("hello client");

Фактическая выработка:

isServerSide?(document.write("initing server"),document.write("hello server")):document.write("hello client");

Если я вручную наберу isServerSide=false; в app.js, тогда я могу заставить его скомпилировать это:

isServerSide=false;document.write("hello client");

Что заставляет меня думать, что я неправильно настраиваю externs.js (или я просто не понимаю, для чего на самом деле должны использоваться внешние).

Любые предложения о том, как заставить это работать?

1 Ответ

6 голосов
/ 09 ноября 2011

Вы определяете значения @define, устанавливая их непосредственно в вызове компилятора. Экстерьеры служат другой цели, например, правильному состоянию гиперслуга.

Вы достигли ожидаемого результата, поместив определение @define (из вашего extern) в app.js, а затем вызвав компилятор следующим образом:

java -jar compiler.jar \
--define "isServerSide=false" \
--js closure-library/closure/goog/base.js \
--js app.js \
--manage_closure_dependencies true \
--process_closure_primitives true \
--summary_detail_level 3 \
--warning_level VERBOSE \
--compilation_level=ADVANCED_OPTIMIZATIONS \
--closure_entry_point my.app
...