KOA的简易模板引擎实现方式 (2)

function render(){
//获取标签
getTags();
//开始组合每个标签中的内容,然后将文本变成可执行的js
allTags=allTags.map((e,i)=>{
let str = let tmpl=''\r\n;
str += 'tmpl+=\r\n'; str += e //先替换赋值标签 str = str.replace(/<%=([\s\S]*?)%>/ig,function () { return '${'+arguments[1]+'}' }) //再替换函数方法,记得别忘了首位的""这个闭合标签
str = str.replace(/<%([\s\S]*?)%>/ig,function () {
return '\r\n'+arguments[1] +"\r\ntmpl+="
})
str += '`\r\n return tmpl';

//提取object的key值,用于function的参数 let keys=Object.keys(data); let fnStr = new Function(...keys,str); return fnStr(...keys.map((k)=>data[k])); }) allTags.forEach((element,index )=> { tpl=tpl.replace(`<!--operator ${index}-->`,element) });

}

## STEP + 如果想用异步的方式读取文件,我推荐: 将`readFile`变成一个`Promise`,然后放入中间件中`await`一下,这样就可以实现异步了~ 如果不了解async/await,[科普传送门](https://juejin.im/post/5b851e136fb9a019f47d1d4b)。

const util=require("util")
const fs=require("fs")
const path=require("path")
let readFile=util.promisify(fs.readFile)
function view(p,data){
let tpl="";
let allTags=[];
function getTags(){
//略
}
function render(){
//略
}
return async (ctx,next)=>{
tpl = await readFile(path.join(__dirname,p),"utf-8")
//别忘了运行render(),替换模板标签
render();
ctx.body=tpl;
await next();
}
}
```

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywygy.html