首页 > 网页制作 >Express框架中配置多种HTML模板引擎共存的方法

Express框架中配置多种HTML模板引擎共存的方法

来源:互联网 2026-07-10 08:16:12

在Express中配置多模板引擎共存应区分职责:`app.set`指定文件名,`app.engine`定义解析逻辑。直接覆盖注册会静默替换,应通过扩展名区分(如`.ejs.html`和`.art.html`)或路由级手动调用引擎函数实现真正共存。

在 Express 中使用 HTML 模板引擎,需要同时配置 app.set('view engine', 'html')app.engine('html', handler),二者缺一不可。如果只设置其中一个,页面将无法正常渲染。当需要多个模板引擎(如 EJS 和 art-template)共存并处理同一个 .html 后缀文件时,简单的配置堆叠会引发静默覆盖问题——后注册的 app.engine 会无提示地替换前一个,排查困难。

Express框架中配置多种HTML模板引擎共存的方法

首先澄清一个常见误解。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

为什么 app.set('view engine', 'html') 不等于“用了 HTML 引擎”

该设置仅告诉 Express:在路由中调用 res.render('index') 时,默认在视图目录下查找 index.html 文件。至于文件如何读取和解析,则需要由 app.engine('html', ...) 中绑定的回调函数决定。如果只配置 app.set 而缺少 app.engine,访问页面时可能会出现“Failed to lookup view”或“callback is not a function”等错误。两者的职责完全不同:

  • app.set('view engine', 'html') —— 约定文件名查找规则
  • app.engine('html', require('ejs').__express) —— 规定文件内容解析逻辑

二者必须匹配:app.engine 的第一个参数(扩展名)必须与 view engine 的值一致,否则解析将失效。

如何让 EJS 和 art-template 同时处理 .html 文件

直接注册两个 app.engine('html', ...) 会导致后者静默覆盖前者,且不产生任何警告。正确的做法是利用文件扩展名进行区分,例如让 EJS 处理 .ejs.html 文件,art-template 处理 .art.html 文件:

  • 安装所需引擎:npm install ejs art-template express-art-template
  • 分别绑定不同的扩展名:
    app.engine('ejs.html', require('ejs').__express);
    app.engine('art.html', require('express-art-template'));
  • 设置默认引擎为其中之一(如 app.set('view engine', 'ejs.html')),或在渲染时显式指定扩展名:res.render('page.ejs.html', data)res.render('page.art.html', data)
  • 确保 views 目录下存在对应的文件,如 views/page.ejs.htmlviews/page.art.html

使用 consolidate 统一接入多个引擎的注意事项

consolidate 可以简化多引擎的接入流程,但在处理 .html 后缀时存在以下陷阱:

  • 内部会将 consolidate.ejs 作为函数调用,但 EJS 的 __express 方法依赖 filename 参数,而 consolidate 在某些版本中可能未透传该参数,导致 includepartial 失效
  • 若同时将 consolidate.ejsconsolidate.handlebars 注册到同一扩展名(如 html),仍会发生覆盖
  • 建议方案:仅使用 consolidate 接入非主流引擎(如 swigdot),主流引擎(EJS、Pug、Handlebars)优先使用原生 app.engine 绑定

真正实现“共存”的关键:路由级手动选择引擎

最可控的方式是绕过 res.render() 的自动查找机制,在路由中手动调用引擎函数:

  • 引入两个引擎:const ejs = require('ejs')const template = require('art-template')
  • 读取模板字符串:const html1 = fs.readFileSync('./views/page1.html', 'utf8')
  • 分别渲染:
    const result1 = ejs.render(html1, data);
    const result2 = template.render('./views/page2.html', data);
  • 使用 res.send(result1)res.type('html').send(...) 输出结果
  • 此方法完全脱离 Express 的视图系统,自由度最高,易于调试,但会失去 layoutpartials 等框架级功能

多引擎共存并非单一配置开关能解决,而是路径、扩展名、调用时机三者的组合决策。最容易被忽略的是 app.engine 的静默覆盖行为——不报错,仅替换。当问题出现时,开发者常误以为是模板语法错误,而实际根本未调用期望的引擎。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。