对于中型和大型模板,您绝对应该使用 Mathew 推荐的预编译。对于极小的模板,我们使用这个:
var template = function(message, data) {
if (typeof data === 'undefined') {
return _.partial(template, message);
} else {
return message.replace(/\{\{([^}]+)}}/g, function(s, match) {
var result = data;
_.each(match.trim().split('.'), function(propertyName) {
result = result[propertyName]
});
return _.escape(result);
});
}
};
var data = {
foo: 'Hello',
bar: { baz: 'world!' }
};
// print on-the-fly
template('{{foo}}, {{bar.baz}}' args); // -> 'Hello, world!'
// prepare template to invoke later
var pt = template('{{foo}}, {{bar.baz}}');
pt(args); // -> 'Hello, world!'
此实现不使用 eval,但需要下划线。