使用Handlebars.js结合JS模板字符串生成代码时出现编译错误
解决Handlebars与JS模板字符串的语法冲突问题
你遇到的是Handlebars语法({{{无转义输出)与JS模板字符串(${{)的解析冲突,导致语法报错。以下两种方案可以解决问题,且不会违反lint规则:
方案1:临时切换Handlebars分隔符
Handlebars支持临时切换表达式分隔符,避开与JS模板字符串的冲突。修改模板中的对应部分:
{{#each items}} const thing{{this}} = new Thing({ someProperty: {{=<% %>=}}`${<%this%>Name}`{{=<% %>=}} }); {{/each}}
{{=<% %>=}}:将Handlebars的表达式分隔符临时改为<% %>- 切换后,
<%this%>作为Handlebars表达式输出当前循环项(如one),${和}被视为字面量 - 最后用
{{=<% %>=}}将分隔符切回默认的{{ }}
编译后会正确输出:
const thingone = new Thing({ someProperty: `${oneName}` });
方案2:注册自定义Helper拼接变量名
在Plop配置中注册一个自定义Helper,用来生成完整的变量名(如oneName),避免直接在模板中拼接导致的语法冲突。
- 在Plop的配置文件中添加Helper:
plop.setHelper('getVarName', function(item) { return `${item}Name`; });
- 修改模板中的对应部分:
{{#each items}} const thing{{this}} = new Thing({ someProperty: `${{{getVarName this}}}` }); {{/each}}
{{{getVarName this}}}:调用自定义Helper生成变量名,{{{确保无转义输出(这里输出纯字符串,用{{也可)- 编译后同样会生成符合要求的
${oneName}格式
为什么原写法报错?
原模板中的${{{this}}Name}会被Handlebars解析为:
- 把前三个
{{{识别为无转义表达式的开头,期望以}}结束 - 但后面紧跟的
Name}打破了解析规则,导致抛出语法错误
这两种方案都能完美解决冲突,且输出结果符合你的需求,同时不会引入违反lint规则的空格。
内容的提问来源于stack exchange,提问作者stetson
相关产品推荐
相关产品推荐

