Closure Templates генерирует код, который не использует StringBuilder

Недавно я вытащил проект из GitHub, который включал задачу компиляции в файл build.xml. Задача использует SoyToJsSrcCompiler.jar для компиляции пары соевых файлов в javascript. Проект включал целевой каталог, поэтому я мог видеть, что скомпилированные файлы содержат такой код:

jive.fbldr.soy.attachments = function(opt_data, opt_sb) {
  var output = opt_sb || new soy.StringBuilder();
  output.append('<div class="fbldr-attachments"><div class="fbldr-attach-head"><p>Use the following form to upload file attachments and, optionally, include a variable to reference the uploaded file in the form\'s HTML source.</p><p>Multiple files may be attached, but only one at a time.  Click "Finished" when all files have been attached.</p></div><div class="fbldr-attach-field"><label>Link to HTML Variable (optional) : </label></div><div class="fbldr-attach-field"><select id="fbldr-attach-link"><option value="" selected="selected">Select HTML variable...</option>');
  var optionList34 = opt_data.variables;
  var optionListLen34 = optionList34.length;

Когда я запускаю ту же задачу без каких-либо изменений кода, полученный скомпилированный файл постоянно заменяет opt_sb на opt_ignored и удаляет все ссылки на soy.StringBuilder. Я запустил «java -jar lib/SoyToJsSrcCompiler.jar --outputPathFormat target/soy2/fbldr.soy templates/fbldr.soy» вручную вместо использования build.xml. Я получаю тот же результат.

jive.fbldr.soy.attachments = function(opt_data, opt_ignored) {
  var output = '<div class="fbldr-attachments"><div class="fbldr-attach-head"><p>Use the following form to upload file attachments and, optionally, include a variable to reference the uploaded file in the form\'s HTML source.</p><p>Multiple files may be attached, but only one at a time.  Click "Finished" when all files have been attached.</p></div><div class="fbldr-attach-field"><label>Link to HTML Variable (optional) : </label></div><div class="fbldr-attach-field"><select id="fbldr-attach-link"><option value="" selected="selected">Select HTML variable...</option>';
  var optionList4 = opt_data.variables;
  var optionListLen4 = optionList4.length;

Из всей документации Closure Templates, которую я читал, ожидается, что вывод будет использовать StringBuilder. Я не могу понять, почему мой вызов продолжает генерировать вывод, который игнорирует StringBuilder. Может быть кто-нибудь знает, что может быть причиной этого?


person mh2parker    schedule 20.02.2015    source источник


Ответы (1)


StringBuilder подходил для Internet Explorer 7 и более ранних браузеров. Для современных браузеров простая конкатенация строк более эффективна, и Closure Templates был изменен, чтобы сделать этот режим режимом по умолчанию (в качестве дополнительного бонуса код меньше). Похоже, что документация не была обновлена, чтобы отразить это изменение.

Если по соображениям совместимости вам требуется StringBuilder, вы можете установить этот параметр в командной строке, используя --codeStyle stringbuilder

person John    schedule 21.02.2015
comment
документация определенно отключена - я сам был удивлен, когда обновил свою версию Closure-templates. Компилятор soy сообщит вам об этом, если вы используете более новые типизированные аннотации @param. - person Chad Killingsworth; 21.02.2015
comment
@ChadKillingsworth, не могли бы вы сообщить об ошибке Closure Templates, чтобы обновить документы? - person John; 22.02.2015
comment
Похоже, что документы были обновлены, информация просто похоронена. Однако справка командной строки для SoyToJsSrcCompiler, вероятно, также должна быть обновлена. Я отправлю запрос на это. - person Chad Killingsworth; 24.02.2015
comment
Спасибо за помощь, Джон. Эта опция устранила мою проблему, и я смог собрать и запустить свой код. - person mh2parker; 02.03.2015