Ian Obermiller

Part time hacker, full time dad.

Precompile Handlebars Template in .NET using Jurassic

The awesome Handlebars.js templating library, a superset of Mustache, has functions built-in for precompiling a template to a javascript function. Unfortunately, the instructions are only for Node.js. Using the Jurassic javascript compiler for .NET, it is simple to precompile your Handlebars template in C# and serve up the template functions in your javascript:

using Jurassic;

public string PrecompileHandlebarsTemplate(string name, string template)
{
    var engine = new ScriptEngine();
    engine.ExecuteFile(@"handlebars-1.0.0.beta.6.js");
    engine.Execute(@"var precompile = Handlebars.precompile;");
    return string.Format("var {0} = Handlebars.template({1});", 
        name, engine.CallGlobalFunction("precompile", template).ToString());
}

The function can be used as follows:

PrecompileHandlebarsTemplate("greet", "<div>{{hello}} world!</div>");

And will output a javascript function as a string, something like this:

var greet = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
  helpers = helpers || Handlebars.helpers;
  var buffer = "", stack1, foundHelper, self=this, functionType="function", helperMissing=helpers.helperMissing, undef=void 0, escapeExpression=this.escapeExpression;


  buffer += "<div>";
  foundHelper = helpers.hello;
  stack1 = foundHelper || depth0.hello;
  if(typeof stack1 === functionType) { stack1 = stack1.call(depth0, { hash: {} }); }
  else if(stack1=== undef) { stack1 = helperMissing.call(depth0, "hello", { hash: {} }); }
  buffer += escapeExpression(stack1) + " world!</div>";
  return buffer;});

Which you can then use easily in the rest of your javascript (after including handlebars.runtime.js):

$('body').append(greet({ hello: 'Bonjour' }));

You can find a working example at JS Bin.

Comments

  1. How would you setup this in an asp.net mvc application lifecycle? Would this be done once and stored in the httpruntime cache (and recompiled if the cache is cleared)? Or would you compile it locally on your dev machine (from a console app for instance) and embed the resulting compiled template in your scripts folder?

    Comment by Nicolas — October 13, 2012 @ 7:42 am

toggle comment form or trackback

Leave a Reply