2012-07-21 40 views
7

así que quería precompilar plantillas ejs en un archivo .js¿cómo PRECOMPILE plantillas ejs para presentar

var compiled = ejs.compile(source); 
fs.writeFileSync(target, 'myTemplateFunction = ' + compiled); 

pero que serilalizes en

function (locals){ 
    return fn.call(this, locals, filters, utils.escape); 
} 

¿cuál es la mejor manera de precompilación y escriba ejs templates en un archivo .js

Respuesta

0

Puede crear un archivo templates.js (ya sea manualmente o en el código) como un módulo vacío. Luego, después de compilar las plantillas, adjuntó la función compilada al módulo vacío.

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

fs.writeFileSync('./template.js', 'module.exports = { }', 'utf8'); 

var compiled = ejs.compile(fs.readFileSync('./example.ejs', 'utf8')); 

// Add an example function to the template file that uses the compiled function 
require('./template').example = compiled; 

// Get the example template again (this could be in another file for example) 
var output = require('./template').example; 
var html = output({ id: 10, title: 'Output' }); 

Desde modules are cached por defecto, debe ser capaz de require('./template.js') siempre que se necesite, y tendrá todas las plantillas precompilados adjuntos.

+1

Esto no está relacionado con la serialización de plantillas, que era la pregunta real. – Avius

0

Lodash _.template() método crea un represention cadena de la función de plantilla EJS durante la compilación y lo adjunta como fuente propiedad a la función compilado. Puede almacenar esa cadena en un archivo JS, incrustarlo en HTML o leerlo a sus nietos antes de dormir.

Por ejemplo:

> var _ = require('lodash'); 
> var compiled = _.template('Hi <%= user %>!'); 
> compiled({ user: 'Axel' }) 
"Hi Axel!" 
> compiled.source 
"function(obj) { 
    obj || (obj = {}); 
    var __t, __p = ''; 
    with (obj) { 
    __p += 'Hi' + ((__t = (user)) == null ? '' : __t) + '!'; 
    } 
    return __p 
}" 
> var fs = require('fs') 
> var src = 'module.exports = ' + compiled.source; 
> fs.writeFileSync('mylittlescript.js', src); 

Este enfoque se utiliza por el módulo de webpack ejs-loader. Tenga en cuenta también que el paquete npm ejs no proporciona dicha propiedad fuente.

Cuestiones relacionadas