Next.js生产环境中EJS邮件模板及导入文件的最佳存放位置咨询
Next.js 中 EJS 邮件模板及资源文件的最佳存放方案
不推荐放入 src/public 目录
public 目录用于存放对外可访问的静态资源(如图片、静态HTML),邮件模板属于后端渲染的私有资源,放在这里存在泄露风险,且不符合资源分类逻辑,因此不建议。
推荐方案1:将模板作为字符串导入(最可靠)
把EJS模板放在 src/lib/emails 这类项目源码目录下,利用Next.js的资源导入能力,通过 ?raw 后缀将模板读取为字符串,避免依赖文件系统路径。
修改后的示例代码:
import type { NextApiRequest, NextApiResponse } from 'next'; const ejs = require('ejs'); // 导入EJS模板为原始字符串 import verificationTemplate from './userVerification.ejs?raw'; type Data = { name: string; }; export default function handler( req: NextApiRequest, res: NextApiResponse<Data> ) { // 直接渲染字符串模板 const templateContent = ejs.render(verificationTemplate, { verifyURL: 'testurl' }); console.log(templateContent); res.status(200).end('test'); }
- 优势:无需处理文件路径问题,Next.js构建时会自动将模板打包进产物,生产环境稳定可用;同时能和项目源码一起参与TypeScript检查。
- 对于zip等后端使用的资源文件,也可采用相同方式导入,或放在根目录的
assets目录统一管理。
推荐方案2:项目根目录下创建独立资源目录
如果必须通过文件系统读取模板,可在Next.js项目根目录(与 src 同级)创建 emails 或 templates/emails 目录,专门存放模板及相关资源。
修改代码中的路径:
const basePath = path.join(process.cwd(), 'emails');
- 优势:生产环境下该目录会完整保留在服务器上,路径计算稳定;不会被Next.js的编译过程干扰。
- 注意:若使用TypeScript,需在
tsconfig.json的include数组中添加"emails/**/*",确保类型检查覆盖这些文件。
内容的提问来源于stack exchange,提问作者Mertafor
相关产品推荐
相关产品推荐

