Используя Google Closure Compiler, можете ли вы исключить часть исходного кода из скомпилированной версии? - PullRequest
8 голосов
/ 05 мая 2011

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

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 выглядит многообещающе, так как поддерживает custom-pass .

Ответы [ 2 ]

10 голосов
/ 06 мая 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']);
3 голосов
/ 05 мая 2011

Закрытие Компилятор поддерживает «определяет», как это:

/** @define {boolean} */
var CHANGABLE_ON_THE_COMMAND_LINE = false;
...