Использование компилятора Closure с Underscore.js _.template - PullRequest
3 голосов
/ 08 ноября 2011

Есть ли способ скомпилировать шаблоны 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. изменить Underscore.js _.template, чтобы он не генерировался с помощью
  2. coerce Закрытие в игру nice

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

1 Ответ

2 голосов
/ 08 ноября 2011

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

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

...