手动使用预编译的车把模板

Gre*_*sov 5 handlebars.js

如何手动使用预编译的handlebars.js模板?

比方说,我们有

source = "<p>Hello, my name is {{name}}</p>"
data = { name: "Joe" }
Run Code Online (Sandbox Code Playgroud)

目前,我有

template = Handlebars.compile(source)
render: -> template(data)
Run Code Online (Sandbox Code Playgroud)

源来自数据库,为了减少编译时间,我想使用一个编译步骤,先使用来对模板服务器端进行预编译Handlebars.precompile(source),然后再使用类似的方法:

template = precompiled_template
render: -> precompiled_template(data)
Run Code Online (Sandbox Code Playgroud)

precompiled_template是带有函数定义的字符串,因此不起作用。

另外,我还发现了Hanlebars.compile(source)() == Handlebars.precompile(source),但是在浏览了把手的源代码,即编译器和运行时之后,我仍然不确定如何实现这一点。

Gre*_*sov 0

此速度测试http://jsperf.com/handlebars-compile-vs-precompile/3给出了答案。

显然,一种解决方案是eval()生成的字符串,它会起作用。

代码是

var data = { name: "Greg" };
var source = "<p>Howdy, {{ name }}</p>";

eval("var templateFunction = " + Handlebars.precompile(source));
var template = Handlebars.template(templateFunction);

template(data);
=> "<p>Howdy, Greg</p>" 
Run Code Online (Sandbox Code Playgroud)

当然,我们需要谨慎对待 eval,并且可能存在更好的解决方案。

  • 如果您“确实”需要将字符串作为代码执行,那么“(new Function(strCode))()”的性能更高。我链接到的SO帖子中的这个链接(http://moduscreate.com/javascript-performance-tips-tricks/)已经有详细信息。此外,MDN 还提供了关于为什么不应使用“eval()”和替代方案的更多详细信息。https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval#Don.27t_use_eval.21 (3认同)