Simple Handlebars loader plugin for RequireJS
JavaScript Other
Latest commit 25da085 Jan 4, 2016 @kusmierz kusmierz Merge pull request #22 from sasha-bichkov/master
Added option to specify a base directory

README.md

Simple precompiling Handlebars plugin for RequireJS

Simpler version of SlexAxton/require-handlebars-plugin without any extra helpers to configure (i18n). Just a simple Handlebars loader and precompiler for RequireJS.

Quick start

This plugin uses the AMD text loader plugin to handle all templates loads. You will have to grab a copy of the Handlebars library too.

Download all this and put it in a public folder, then add the following RequireJS configuration:

require.config({
  baseUrl: ...,

  paths: {
    handlebars: 'path/to/handlebars',
    text: 'path/to/text'
  },

  shim: {
    handlebars: {
      exports: 'Handlebars'
    }
  },

  packages: [
    {
      name: 'hbs',
      location: 'path/to/hbs/folder',
      main: 'hbs'
    }
  ]
});

After that requirejs-hbs can be used like the original Handlebars plugin:

require(['hbs!app/templates/hello'], function (template) {
  document.body.innerHTML = template({name: "Epeli"});
});

Configure

In your RequireJS config file, you could optionally add a hbs entry to configure this plugin:

require.config({
  paths: { ... },

  hbs: {
    templateExtension: ".html",
    compilerPath: "path/to/handlebars/full"
  },

  shim : { ... },
});

templateExtension

This value is the template files extension. Its default is ".hbs".

compilerPath

This is the path of the full version of Handlebars. The plugin will use this at build time to precompile the templates. Its default is "handlebars", but you will have to override it if you want your client-side handlebars module to be the runtime only.

Build

To avoid the need to load and compile all templates in the client in a production environment, a project should be precompiled. Use the requirejs r.js command to do so. The hbs plugin will use Handlebars to precompile the your templates files you specify as dependency of a module.

Once precompiled, a template does not need the full Handlebars library to be rendered, the Handlebars runtime will be sufficient. So feel free to set the handlebars module path to a runtime only library in your build file (see the example. If you do so, make sure you define the compilerPath configuration value as mentioned above.

Example

First of all, serve the files of the example directory with a HTTP server. If you have python installed, you can run the serve script that will start a server on port 8000.

The example should run without any problem. You can see in the browser developer tools that all the files are loaded uncompressed.

You can use the r.js command to build the project with the provided build configuration app.build.js. See that this file is configured to include the Handlebars runtime instead of the full library.

You can modify the index file to use your freshely built module, juste follow the commentary. Refresh the page, and you will see that only one file is loaded containing everything your app need to be run.

$ cd example
$ ./serve
$ r.js -o app.build.js
$ firefox http://localhost:8000