Skip to content

Instantly share code, notes, and snippets.

@zilkey
Forked from garth/Jakefile.js
Created March 10, 2012 22:30
Show Gist options
  • Save zilkey/2013669 to your computer and use it in GitHub Desktop.
Save zilkey/2013669 to your computer and use it in GitHub Desktop.
Precompile .handlebars templates with node js
var fs = require('fs');
var vm = require('vm');
var emberjs = fs.readFileSync('public/javascripts/vendor/ember-0.9.5.min.js', 'utf8');
var templatesDir = 'templates';
var destinationDir = 'public/javascripts/templates';
function compileHandlebarsTemplate(templatesDir, fileName) {
var file = templatesDir + '/' + fileName;
//dummy jQuery
var jQuery = function() { return jQuery; };
jQuery.ready = function() { return jQuery; };
jQuery.inArray = function() { return jQuery; };
jQuery.jquery = "1.7.1";
//dummy DOM element
var element = {
firstChild: function () { return element; },
innerHTML: function () { return element; }
};
var sandbox = {
// DOM
document: {
createRange: false,
createElement: function() { return element; }
},
// Console
console: console,
// jQuery
jQuery: jQuery,
$: jQuery,
// handlebars template to compile
template: fs.readFileSync(file, 'utf8'),
// compiled handlebars template
templatejs: null
};
// window
sandbox.window = sandbox;
// create a context for the vm using the sandbox data
var context = vm.createContext(sandbox);
// load Ember into the sandbox
vm.runInContext(emberjs, context, 'ember.js');
//compile the handlebars template inside the vm context
vm.runInContext('templatejs = Ember.Handlebars.precompile(template).toString();', context);
var namedTemplateJs = 'Ember.TEMPLATES["' + fileName.replace(/.handlebars/, '') + '"] = Handlebars.template(' + context.templatejs + ');';
//extract the compiled template from the vm context and save to .js file
fs.writeFileSync(file.replace(/\.handlebars$/, '.js').replace(templatesDir, destinationDir), namedTemplateJs, 'utf8');
}
console.log('Compiling .handlebars templates');
var files = fs.readdirSync(templatesDir);
var i;
for (i = 0; i < files.length; i++) {
if (/\.handlebars$/.test(files[i])) {
compileHandlebarsTemplate(templatesDir, files[i]);
process.stdout.write('.');
}
}
console.log('done');
@zilkey
Copy link
Author

zilkey commented Mar 10, 2012

This version differs from the original in that:

  • it does not require jake
  • it adds all templates to the Ember.TEMPLATES object
  • it allows you to output the .js files to a different directory than the templates source

@manoharank
Copy link

How can i precompile partials?

@lukemelia
Copy link

I don't think I've used handlebars partials, so I'm not sure, but I'd suspect this approach could be used to compile partials too.

@tilleps
Copy link

tilleps commented Jun 14, 2013

Getting "TypeError: Cannot read property 'fixHooks' of undefined" with Ember 1.0.0RC5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment