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

EJS模板引入public目录下HTML文件失败问题求助

EJS模板引入HTML片段失败的解决方法

问题原因

EJS的include函数默认从视图目录(你设置的src/views)查找文件,而你的myFragment.html放在了public/fragments下——public是Express用于托管静态资源(CSS、JS等)的目录,EJS不会自动去这个目录里查找模板片段,所以直接写相对路径会找不到。

解决方案

方案一:调整文件结构(推荐)

把HTML片段移到视图目录下,符合Express项目规范:

  1. 在src/views下创建fragments文件夹,把myFragment.html移进去,目录结构变为:
rootdir
- src
-- views
--- myPage.ejs
--- fragments
---- myFragment.html
  1. 修改myPage.ejs里的include路径:
<body>
  <%- include("./fragments/myFragment.html") -%>
</body>

这样EJS就能直接定位到文件,无需额外配置。

方案二:使用绝对路径(不移动文件)

如果不想调整文件结构,需要用path模块拼接绝对路径,确保EJS能找到public下的片段:

  1. 修改index.js,引入path模块并暴露给模板:
const express = require('express'); 
const path = require('path');
const app = express();

// 设置视图目录的绝对路径,避免相对路径歧义
app.set('views', path.join(__dirname, 'src/views'));
app.set('view engine', 'ejs');               
app.use(express.static('public'));

// 把path模块和片段目录路径暴露给所有EJS模板
app.locals.path = path;
app.locals.fragmentDir = path.join(__dirname, 'public/fragments');
  1. 修改myPage.ejs的include代码(二选一即可):
<body>
  <!-- 方式1:直接拼接绝对路径 -->
  <%- include(path.join(__dirname, '../../public/fragments/myFragment.html')) -%>
  
  <!-- 方式2:用提前定义的fragmentDir(更简洁) -->
  <%- include(path.join(fragmentDir, 'myFragment.html')) -%>
</body>

注意事项

  • EJS的<%- include(...) %>语法是正确的,<%-用于输出不转义的HTML内容,适合引入HTML片段;如果用<%=会把HTML标签转义成字符串,显示异常。
  • 尽量把模板相关文件放在视图目录下,和静态资源分开,避免项目结构混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 05:39:50