How do I precompile partials for handlebars.js?

2019-03-09 12:08发布

I'm using handlebars.js and I want to start precompiling everything, but I can't seem to find a way to precompile the partials. The majority of my templates are actually partials. I tried just treating my them like regular templates, but then calling them as a partial doesn't work.

Is there any way to precompile partials, or, alternatively, call one template from within another template?

5条回答
【Aperson】
2楼-- · 2019-03-09 12:43

Still not sure about precompiling partials, but this is how to call one template from within another template with help from this question: Handlebars helper for template composition

// instead of {{> partialName}} use {{partial "templateName"}}
Handlebars.registerHelper('partial', function(templateName,context){
    return new Handlebars.SafeString(Handlebars.templates[templateName](this));
});

http://jsfiddle.net/EBt8R/

查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-03-09 12:45

As mentioned here on GitHub, there has been a -p flag added to the Handlebars CLI.

So you can use handlebars my_partial.handlebars -p -f output.js

查看更多
淡お忘
4楼-- · 2019-03-09 12:50

I am using HandleBars v3.0.3 and I have partial and not partial templates pre-compiled in one file.

This thread is little bit confusing so I am summarizing the working solution.

  • Don't use -p operator while pre-compiling.
  • Don't register partial template by Handlebars.registerPartial('myPartial', '{{name}}');
  • use Nathan's suggestion of mapping partial object to templates object by Handlebars.partials = Handlebars.templates;
  • Refer partial template by name {{> name}}
查看更多
等我变得足够好
5楼-- · 2019-03-09 13:05

I found an even better method: precompile all your partials as templates, then right before you use them in your code, add this line:

Handlebars.partials = Handlebars.templates;

The improvements are 1) it's shorter and 2) it doesn't loose any custom helpers you might pass in when calling the parent template.

查看更多
你好瞎i
6楼-- · 2019-03-09 13:06

I managed to get it working by pre compiling all my partials as templates and then adapting Nathans solution

// instead of {{> partialName}} use {{partial "templateName"}}
Handlebars.registerHelper('partial', function (templateName) {
    return new Handlebars.SafeString(JST[templateName](this));
});

So for me Handlebars.templates became JST when i compiled things, i noticed it in my compiled templates file.

查看更多
登录 后发表回答