You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EJS语法疑问:为何分开的if/else语句编译报错?

EJS中if-else拆分写法报错的原因分析

问题本质

EJS的模板编译规则结合JavaScript的自动分号插入(ASI)机制,导致了这个看似奇怪的语法错误。虽然两种写法在纯JavaScript中都合法,但EJS拆分代码块的方式破坏了if-else语句的语法连续性。

错误写法的编译逻辑

当你把if的闭合}和else拆分成两个独立的<% %>标签时:

<% if(firstp==="Welcome"){%>
    <%-include('./partials/nav2.ejs')%>
<%}%>
<%else%>
<%{ %>
    <%-include('./partials/nav.ejs')%>
<%  } %>

EJS会将每个<% %>内的代码单独提取,标签之间的位置会被插入隐式换行,最终生成的JavaScript代码类似:

if(firstp==="Welcome"){
    // 渲染nav2的逻辑
}
; // JavaScript自动分号插入机制在这里添加分号
else
; // 再次插入分号
{
    // 渲染nav的逻辑
}

ASI会在}后自动插入分号,直接结束if语句。此时后面的else没有对应的if语句,自然触发"Unexpected token 'else'"的语法错误。

正确写法的原理

而将}else{放在同一个<% %>标签内时:

<% if(firstp==="Welcome"){%>
    <%-include('./partials/nav2.ejs')%>
<%}else{ %>
    <%-include('./partials/nav.ejs')%>
<%  } %>

编译后的JavaScript是连续的if-else结构:

if(firstp==="Welcome"){
    // 渲染nav2的逻辑
}else{
    // 渲染nav的逻辑
}

这种写法没有被拆分,ASI不会插入多余的分号,else能正确和前面的if配对,语法完全合法,因此可以正常运行。

总结

EJS要求if的闭合}和对应的else必须处于同一个<% %>代码块中,不能拆分到不同标签里,否则会破坏JavaScript语句的连续性,触发语法错误。

内容的提问来源于stack exchange,提问作者Phillip Feldman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:27:45