Search code examples
javascriptnode.jsdust.js

are dust helper dependencies bundled within compiled templates?


I'm wondering how helper dependencies are managed in compiled dust templates, specifically relating to being used on the client -- is the helper method bundled with the compiled dust template? What about dependencies that might not be supported on the client? Or if that dependency has multiple other dependencies?

Here's a trivial example of a dust template I'd like to be able to use on the client:

// foo.dust
{@myHelper}
  <div>{foo}{bar}</div>
{/myHelper}


// my-helper.js
const isomorphicDep = require('isomorphic-dep');
const nodeDep = require('node-dep');

module.exports = function(dust) {
  dust.helpers.myHelper = function(chunk, context, bodies, params) {
    // do some stuff using deps
    let foo = nodeDep.getFoo();
    let bar = isomorphicDep.getBar(params.someInput);

    return chunk.render(bodies.block, context.push({ foo, bar });
  };
};

Thanks


Solution

  • A compiled template just contains instructions for how to render-- it does not include any client code itself.

    For example, a simple template like this:

    {@helper}foo{/helper}
    

    Compiles into these two instruction sets:

    function body_0(chk, ctx) {
      return chk.h("helper", ctx, {
        "block": body_1
      }, {}, "h");
    }
    
    function body_1(chk, ctx) {
      return chk.w("foo");
    }
    

    When the template is rendered, it asks Dust to look for the helper named helper and execute it (in the body_0 function). The code for helper is not included with the template.

    So on the client, you'll need to include a file containing the helper that loads the correct isomorphic dep (like node-fetch vs whatwg-fetch, for example).