Использование компилятора Closure с Underscore.js _.template

Есть ли способ скомпилировать шаблоны Underscore.js на сервере и заставить компилятор Closure работать с созданным кодом?

Основная проблема в том, что _.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(/[\r\n\t]/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 в нем. Два очевидных маршрута:

  1. изменить _.template Underscore.js, чтобы он не генерировался с
  2. заставить Closure вести себя хорошо

Возможен ли второй вариант?


person hughdbrown    schedule 07.11.2011    source источник


Ответы (1)


Как правило, движки JS работают лучше без «с», поэтому, если генерировать его без «с», это вариант, который, вероятно, является лучшим решением.

В противном случае ваши варианты зависят от того, надеетесь ли вы использовать режим Closure Compilers ADVANCED. В режиме SIMPLE компилятор не будет переименовывать ваши свойства в шаблоне и будет считать любую необъявленную переменную глобальной. Так что, пока ваш объект шаблона не вызывает затенение каких-либо локальных переменных, он может «просто работать».

person John    schedule 08.11.2011
comment
Да, я стремлюсь к расширенной компиляции. Мое нежелание переделывать _.template заключается в том, что это периодически обновляемый библиотечный код — проблема обслуживания. - person hughdbrown; 08.11.2011
comment
В зависимости от ваших потребностей вы можете рассмотреть возможность использования шаблонов закрытия, которые предназначены для работы с РАСШИРЕННОЙ компиляцией. - person John; 20.11.2011