- 模板引擎框架:ejs jade undescore handlebar nunjunks {{name}}
- 所有的引擎核心就是数据替换
模拟es6的模板字符串
let name = 'jaasdsa';
let age = 18;
let str = "${name}今年${age}岁了";
let reg = /\${([\s\S]+?)}/g;
let rr = str.replace(reg, function(world, value) {
console.log(world, value);
return eval(value);
});
console.log(rr);
ejs模板引擎原理
let obj = { name: 'jaasdsa' };
with(obj) {
console.log(name);
}
let fn = new Function(`console.log('jaasdsa')`);
fn();
let fs = require('fs');
let templateStr = fs.readFileSync('./template.html', 'utf-8');
function render(str, renderObj) {
let head = 'let str="";\r\nwith(name){\r\nstr = `\r\n';
str = str.replace(/<%=([\s\S]+?)%>/g, function() {
return '${' + arguments[1] + '}'
})
let content = str.replace(/<%([\s\S]+?)%>/g, function() {
return '`\r\n' + arguments[1] + '\r\nstr+=`'
});
let tail = '`\r\n}\r\n return str'
let s = head + content + tail;
return new Function('name', s)(renderObj);
}
let renderStr = render(templateStr, {
name: [1, 2, 3]
});
console.log(renderStr);
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<%name.forEach(item=>{%>
<li>
<%=item%>
</li>
<%})%>
</body>
</html>
function fn(name) {
let str = "";
with(name) {
str = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
`
name.forEach(item => {
str += `
<li>
${item}
</li>
`
})
str += `
</body>
</html>`
}
return str
}
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<li>
1
</li>
<li>
2
</li>
<li>
3
</li>
</body>
</html>