对于中型和大型模板,您绝对应该按照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,但它需要下划线。
解决此问题的最佳方法是在部署扩展程序之前预先编译模板。都 handlebarsjs 和 生态 提供预编译作为功能。我其实写了一个 博客文章 进一步深入。