如何在JavaScript Handlebars中转义{{}}?文件模板处理求助
解决Handlebars编译时保留指定{{变量}}不被替换的问题
问题场景
输入文件my.txt内容:
name={{applicationName}} env=app/{{env}}/{{applicationName}}
通过Handlebars编译替换applicationName为myFirstApp时,希望保留{{env}}不被解析,预期输出:
name=myFirstApp env=app/{{env}}/myFirstApp
但实际得到错误输出:
name=myFirstApp env=myFirstApp//app
使用的编译代码:
readContent = fs.readFileSync(`${__dirname}/../my.txt`, 'utf8') handlebarsTemplate = Handlebars.compile(readContent) const output = handlebarsTemplate({ applicationName: 'myFirstApp' }) fs.writeFileSync(`newFile.txt`, output, 'utf8')
问题原因
Handlebars会将所有{{xxx}}格式的内容视为模板变量,尝试从传入的上下文对象中查找对应值。由于上下文里未提供env属性,{{env}}会被解析为空字符串,导致原路径结构错乱。
解决方案
方法1:修改原模板文件,使用Handlebars转义语法
Handlebars支持用四个大括号{{{{}}}}来转义,编译后会输出两个大括号的{{}}。将my.txt中的{{env}}替换为{{{{env}}}}:
name={{applicationName}} env=app/{{{{env}}}}/{{applicationName}}
再运行原编译代码,即可得到预期输出。
方法2:编译前动态处理模板内容(无需修改原文件)
如果无法修改原my.txt文件,可以在读取内容后,先将{{env}}替换为{{{{env}}}},再进行编译:
const readContent = fs.readFileSync(`${__dirname}/../my.txt`, 'utf8'); // 全局替换{{env}}为转义后的格式 const processedContent = readContent.replace(/{{env}}/g, '{{{{env}}}}'); const handlebarsTemplate = Handlebars.compile(processedContent); const output = handlebarsTemplate({ applicationName: 'myFirstApp' }); fs.writeFileSync(`newFile.txt`, output, 'utf8');
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

