Можно ли с помощью Google Closure Compiler исключить часть исходного кода из скомпилированной версии?

Недавно я создал проект с помощью инструментария Dojo, и мне понравилось, как вы можете пометить раздел кода для включения только в скомпилированный версия, основанная на произвольной условной проверке. Я использовал это, чтобы экспортировать закрытые переменные для модульного тестирования или выдавать ошибки вместо их регистрации. Вот пример формата Dojo, я хотел бы знать, есть ли какие-либо специальные директивы, подобные этой, для Компилятор закрытия Google.

window.module = (function(){

  //private variable
  var bar = {hidden:"secret"};

  //>>excludeStart("DEBUG", true);
    //export internal variables for unit testing 
    window.bar = bar;
  //>>excludeEnd("DEBUG");

  //return privileged methods
  return {
    foo: function(val){
      bar.hidden = val;
    }
  };
})();

Изменить

В Закрытие окончательного руководства упоминается, что вы можете расширить CommandLineRunner, добавив свои собственные проверки и оптимизации, которые могут быть одним из способов сделать это. Plover выглядит многообещающе, так как поддерживает пользовательские проходы.


person SavoryBytes    schedule 05.05.2011    source источник
comment
Знаете ли вы, что можете использовать Closure Compiler в расширенном режиме с Dojo Toolkit? Ознакомьтесь с моим документом: dojo-toolkit .33424.n3.nabble.com/file/n2636749/   -  person Stephen Chung    schedule 06.05.2011


Ответы (2)


Компилятор Closure поддерживает «определения», например:

/** @define {boolean} */
var CHANGABLE_ON_THE_COMMAND_LINE = false;
person John    schedule 05.05.2011

Этот простой тестовый пример сработал. Компилировать с --define DEBUG=false

/**
 * @define {boolean} DEBUG is provided as a convenience so that debugging code
 * that should not be included in a production js_binary can be easily stripped
 * by specifying --define DEBUG=false to the JSCompiler. For example, most
 * toString() methods should be declared inside an "if (DEBUG)" conditional
 * because they are generally used for debugging purposes and it is difficult
 * for the JSCompiler to statically determine whether they are used.
 */
var DEBUG = true;

window['module'] = (function(){

  //private variable
  var bar = {hidden:"secret"};

  if (DEBUG) {
    //export internal variables for unit testing 
    window['bar'] = bar;
  }

  //return privileged methods
  return {
      foo: function(val){
        bar.hidden = val;
      }
  };
})();

console.log(window['bar']);
module.foo("update");
console.log(window['bar']);
person SavoryBytes    schedule 05.05.2011
comment
Я считаю, что этот ответ более правильный, чем принятый ответ, поскольку он использует встроенную (хотя и недокументированную) опцию закрытия, которая больше соответствует правильному способу ведения дел. Ответ также длиннее и включает пример. - person Lee Hambley; 12.08.2011
comment
@Ли Хэмбли, что? Помимо длинного и примера, чем эти ответы отличаются? Они оба дают вам аннотацию /** @define {boolean} */. - person Oleg V. Volkov; 21.08.2015