问一下前端模板引擎实现的问题?

//模板
<div>{{ name + sex + 'hello!' }}</div>
//js
data: {name: 'joker', sex: 'male'}

现在要求用一个方法tmpl(str, data),得到结果'jokermalehello!',怎么实现tmpl这个函数,谢谢?

阅读 2.7k
5 个回答
var tpl = `<div>{{ name + sex + 'hello!' }}</div>`;
var data = {name: 'joker', sex: 'male'};

var tmpl = function(tpl, data) {
    return tpl.replace(/\{\{(.*)\}\}/g, function(match, p1) {
        // p1: ` name + sex + 'hello!' `
        return p1.split(/[\s+]+/)
            //split result: ["", "name", "sex", "'hello!", ""]
            .map(item => {
                if (!/['"]/.test(item)) {
                    // when item = "name", "sex"
                    return data[item] || ''
                } else if (item) {
                    // when item = "'hello!"
                    return item.replace(/['"]/g,'')
                }
                return item
        }).join('')
    })
}

console.log(tmpl(tpl, data)); // output: <div>jokermalehello!</div>

laytpl 这个模板引擎刚好可以实现你的需求
不过它默认要求模板参数前面加d

<div>{{ d.name + d.sex + 'hello!' }}</div>

给 laytpl 增加参数解构功能
可以参照这个做法去掉那个d

var str = `<div>{{ name + sex + 'hello!' }}</div>`;
var data = { name: "joker", sex: "male" };
function tmpl(str, data) {
  return str.replace(/\{\{([\S\s]+)\}\}/g, (m, p1) =>
    p1.split("+").map(item => {
        item = item.trim();
        var reg = /^['"]([\s\S]+)['"]$/;
        return !reg.test(item) ? data[item] : item.replace(reg, "$1");
      }) .join('')
  );
}
推荐问题
宣传栏