Marko Compiler // Marko

The Marko compiler produces a Node.js-compatible, CommonJS module as output. This output format has the advantage that compiled template modules can benefit from a context-aware module loader and templates can easily be transported to work in the browser using Lasso.js or Browserify.

The marko module will automatically compile templates loaded by your application on the server, but you can also choose to precompile all templates. This can be helpful as a build or test step to catch errors early.

You can either use the command line interface or the JavaScript API to compile a Marko template file. To use the CLI you must first install the marko module globally using the following command:

npm install marko --global

You can then compile single templates using the following command:

markoc hello.marko

This will produce a file named hello.marko.js next to the original file.

You can also recursively compile all templates in the current directory (the node_modules and .* directories will be ignored by default)

markoc .

You can also specify multiple directories or files

markoc foo/ bar/ template.marko

To delete all of the generated *.marko.js files you can add the --clean argument. For example:

markoc . --clean

Alternatively, you can use the JavaScript API to compile a module as shown in the following sample code:

require('marko/compiler').compileFile(path, function(err, src) {
    // Do something with the compiled output
});

Sample Compiled Template

function create(__helpers) {
  var str = __helpers.s,
      empty = __helpers.e,
      notEmpty = __helpers.ne,
      escapeXml = __helpers.x,
      forEach = __helpers.f,
      escapeXmlAttr = __helpers.xa;

  return function render(data, out) {
    out.w('Hello ' +
      escapeXml(data.name) +
      '! ');

    if (notEmpty(data.colors)) {
      out.w('<ul>');

      forEach(data.colors, function(color) {
        out.w('<li style="color: ' +
          escapeXmlAttr(color) +
          '">' +
          escapeXml(color) +
          '</li>');
      });

      out.w('</ul>');
    }
    else {
      out.w('<div>No colors!</div>');
    }
  };
}
(module.exports = require("marko").c(__filename)).c(create);

The compiled output is designed to be both extremely readable and minifiable. The minified code is shown below:

function create(a){var d=a.ne,c=a.x,e=a.f,f=a.xa;return function(a,b){b.w("Hello "+c(a.name)+"! ");d(a.colors)?(b.w("<ul>"),e(a.colors,function(a){b.w('<li style="color: '+f(a)+'">'+c(a)+"</li>")}),b.w("</ul>")):b.w("<div>No colors!</div>")}}(module.exports=require("marko").c(__filename)).c(create);

File size: 223 bytes gzipped (300 bytes uncompressed)