如何在TypeScript构建流程中加入PDF文件供Firebase Functions使用
问题根因
TypeScript 编译器(tsc)默认仅处理 .ts、.tsx、.js 等可编译代码文件,不会主动复制静态资源(如PDF、图片、字体等非代码文件)到 outDir 指定的输出目录,因此你放在 src/assets 下的PDF文件不会被自动打包到 lib 目录。
解决方案
方案1:修改构建脚本,自动复制静态资源到输出目录
这是最常用的方案,只需要调整package.json的构建命令,在TS编译完成后自动把assets目录复制到lib下:
- 安装跨平台复制工具
cpx(避免不同操作系统复制命令不兼容):
npm install cpx --save-dev
- 打开
package.json,修改scripts中的build命令:
{ "scripts": { // 把原来的"build": "tsc"改成下面这行 "build": "tsc && cpx \"src/assets/**/*\" lib/assets" } }
如果不需要兼容Windows系统,也可以直接用系统原生复制命令:
- macOS/Linux:
"build": "tsc && cp -r src/assets lib/assets" - Windows:
"build": "tsc && xcopy src\\assets lib\\assets /E /I /Y"
修改完成后重新执行npm run build,就能看到lib目录下已经生成了assets文件夹和里面的PDF文件。
方案2:调整静态资源存放位置
你也可以直接把assets目录放在项目根目录(和src同级),不需要修改构建脚本,只需要注意两点:
- 检查
firebase.json的ignore配置,不要把assets目录加入忽略列表,确保部署时会被上传 - 代码中引用PDF的路径改成对应相对路径即可。
路径优化建议
为了避免运行时工作目录变化导致文件找不到,推荐用绝对路径加载附件:
import * as path from 'path'; // 发送邮件的配置部分改成 await nodemailer.createTransport(transport).sendMail({ from: from, to: studentDto.email, subject: subject, html: Mail.createInvoice(studentDto, itemDto), attachments: [{ filename: 'file.pdf', path: path.resolve(__dirname, 'assets/file.pdf') }], });
__dirname代表当前执行的JS文件所在的目录,用它拼接路径能保证无论在什么环境下都能正确找到文件。
内容的提问来源于stack exchange,提问作者Ero Stefano
相关产品推荐
相关产品推荐

