2012-07-21 10 views
7

così ho voluto precompilare EJS modelli in un file .jscome si fa a precompilare EJS modelli di depositare

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

ma che serilalizes in

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

qual è il modo migliore per precompilare e scrivere modelli di ejs in un file .js

risposta

0

È possibile creare un file templates.js (manualmente o nel codice) come modulo vuoto. Quindi, dopo aver compilato i modelli, allegare la funzione compilata al modulo vuoto.

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' }); 

Dal modules are cached per impostazione predefinita, si dovrebbe essere in grado di require('./template.js') ovunque ne abbiate bisogno e avrà tutti i modelli precompilati allegati.

+1

Questo non è correlato alla serializzazione di modelli, che era la domanda reale. – Avius

0

Lodash _.template() metodo crea un represention stringa della funzione template EJS durante la compilazione e lo collega come fonte struttura al funzione compilata. Puoi memorizzare quella stringa in un file JS, incorporarla in HTML o leggerla ai tuoi nipoti prima di dormire.

Ad esempio:

> 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); 

Questo approccio viene utilizzato dal modulo di Webpack ejs-loader. Si noti inoltre che il pacchetto npm ejs non fornisce tale proprietà di origine .