EJS带括号include语法失效 无法动态引入及传参问题求助
EJS带括号include语法报错解决方案
问题根源
报错是ejs-locals包和EJS 3.x版本的语法冲突导致的:
- ejs-locals早已停止维护,仅适配EJS 2.x的语法规范,它重写了EJS的include解析逻辑,无法识别EJS 3.x新增的函数式带括号include语法,会错误把括号内的所有内容都识别为模板文件名的一部分,所以会出现报错中把参数部分也拼入文件路径查找的异常情况。
推荐解决方案
直接移除ejs-locals依赖即可,EJS 3.x本身已经原生支持动态引入模板、传递局部变量的能力,不需要额外引入该扩展包:
- 卸载ejs-locals:
npm uninstall ejs-locals - 修改Express的模板引擎配置,删除原本注册ejs-locals的代码,改为使用EJS原生渲染:
// 删除该行代码 // app.engine('ejs', require('ejs-locals')) // 保留以下原生配置即可 app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views'))
修改完成后,两种带括号的include写法都可以正常运行:
- 动态引入模板:
<%- include('../components/' + variable) %> - 传递自定义局部变量:
<%- include('../components/card.ejs', {user: variable}) %>
备选兼容方案
如果必须保留ejs-locals依赖,只能降级使用EJS 2.x的无括号include语法,局部变量需要在渲染父模板时挂载到全局locals对象中,子模板直接读取即可,但该方案不支持动态拼接模板路径,无法满足动态引入的需求。
内容的提问来源于stack exchange,提问作者Yossi Shemesh
相关产品推荐
相关产品推荐

