2015-08-31 2 views
4

У меня есть простой шаблон Handlebars в email-template.hbs, который я хотел бы предварительно скомпилировать и загрузить в файл app.js без чтения из файловой системы и скомпилировать его каждый раз, когда запущен app.js.Загрузите предварительно скомпилированный шаблон Handlebars в сценарий узла?

Прямо сейчас, у меня есть что-то, что выглядит следующим образом:

var handlebars = require('handlebars'); 
var fs = require('fs'); 

var source = fs.readFileSync('./email-template.hbs', 'utf-8'); 
var template = handlebars.compile(source); 

Я предпочел бы иметь что-то вроде этого:

var handlebars = require('handlebars'); 
var template = require('email-template'); 

Где email-template.js является скомпилированных email-template.hbs шаблон.

+0

http://handlebarsjs.com/precompilation.html – robertklep

ответ

12

Я новичок в узел и Рули, и имели один и тот же вопрос.

Трюк состоит в том, чтобы предварительно скомпоновать ваш шаблон, используя флаг -c (который предварительно скомпонован в формат модуля CommonJS узла и дает ему путь к модулю времени руля, который ему нужен).

Учитывая вы уже следовали направления setting up precompilation (npm install handlebars -g), то для примера генерации email-template.js из ./email-template.hbs, попробуйте запустить это в командной строке:

handlebars ./email-template.hbs -f ./email-template.js -c handlebars/runtime 

... который должен производить email-template.js с

var Handlebars = require("handlebars/runtime"); var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; 

в верхней части. После этого вы можете использовать его в app.js так:

var Handlebars = require('handlebars/runtime'); 
var hbtemplate = require('./email-template.js'); 

// You don't even seem to need the "var hbtemplate =" above, 
// as precompiling puts your template into the Handlebars object. 
var template = Handlebars.templates['email-template']; 
// ...then you can use template(data) to generate the HTML string 
+1

Спасибо за это, у меня отсутствовали рули/время выполнения после опции -c, я не понял, что это необходимо. –

0

Просто сделайте себе вспомогательную функцию:

// requireHbs.js 
var handlebars = require('handlebars'); 
var fs = require('fs'); 
var memoize = require('lodash.memoize'); 
module.exports = memoize(function requireHbs(templateName){ 
    var filename = './' + templateName + '.hbs'; 
    var source = fs.readFileSync(filename, 'utf-8'); 
    return handlebars.compile(source); 
}); 

Затем использовать его как это:

// app.js 
var requireHbs = require('./requireHbs'); 
var template = requireHbs('email-template'); 
+0

Цель состоит в том, чтобы избежать чтения шаблона из файловой системы полностью. – dstaley

Смежные вопросы