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

#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 в нем. Два очевидных маршрута:

  1. изменить Underscore.js _.template не генерировать с помощью
  2. принудить закрытие к хорошей игре

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

Ответ №1:

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

В противном случае ваши параметры зависят от того, надеетесь ли вы использовать расширенный режим компиляторов закрытия. В ПРОСТОМ режиме компилятор не будет переименовывать ваши свойства в шаблоне и будет считать, что любая необъявленная переменная является глобальной. Итак, пока ваш объект шаблона не вызывает затенения каких-либо локальных переменных, он может «просто работать».

Комментарии:

1. Да, я стремлюсь к расширенной компиляции. Мое нежелание перерабатывать _.template заключается в том, что это библиотечный код, который периодически обновляется — проблема обслуживания.

2. В зависимости от ваших потребностей вы можете рассмотреть возможность использования шаблонов закрытия, которые предназначены для работы с расширенной компиляцией.