#google-closure-compiler #underscore.js
#google-closure-compiler #underscore.js
Вопрос:
Есть ли какой-либо способ скомпилировать Underscore.js шаблоны на сервере и заставить компилятор закрытия работать с сгенерированным кодом?
Основная проблема заключается в том, что _.template
:
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};'
'with(obj||{}){__p.push(''
str.replace(/\/g, '\\')
.replace(/'/g, "\'")
.replace(c.interpolate, function(match, code) {
return "'," code.replace(/\'/g, "'") ",'";
})
.replace(c.evaluate || null, function(match, code) {
return "');" code.replace(/\'/g, "'")
.replace(/[rnt]/g, ' ') "__p.push('";
})
.replace(/r/g, '\r')
.replace(/n/g, '\n')
.replace(/t/g, '\t')
"');}return __p.join('');";
var func = new Function('obj', tmpl);
return data ? func(data) : func;
};
генерирует JavaScript с оператором with в нем. Два очевидных маршрута:
- изменить Underscore.js
_.template
не генерировать с помощью - принудить закрытие к хорошей игре
Возможен ли второй вариант?
Ответ №1:
Как правило, движки JS работают лучше без «with», поэтому, если генерация без «with» — это вариант, который, вероятно, является лучшим решением.
В противном случае ваши параметры зависят от того, надеетесь ли вы использовать расширенный режим компиляторов закрытия. В ПРОСТОМ режиме компилятор не будет переименовывать ваши свойства в шаблоне и будет считать, что любая необъявленная переменная является глобальной. Итак, пока ваш объект шаблона не вызывает затенения каких-либо локальных переменных, он может «просто работать».
Комментарии:
1. Да, я стремлюсь к расширенной компиляции. Мое нежелание перерабатывать _.template заключается в том, что это библиотечный код, который периодически обновляется — проблема обслуживания.
2. В зависимости от ваших потребностей вы можете рассмотреть возможность использования шаблонов закрытия, которые предназначены для работы с расширенной компиляцией.