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

如何在TypeScript构建流程中加入PDF文件供Firebase Functions使用

问题根因

TypeScript 编译器(tsc)默认仅处理 .ts、.tsx、.js 等可编译代码文件,不会主动复制静态资源(如PDF、图片、字体等非代码文件)到 outDir 指定的输出目录,因此你放在 src/assets 下的PDF文件不会被自动打包到 lib 目录。

解决方案

方案1:修改构建脚本,自动复制静态资源到输出目录

这是最常用的方案,只需要调整package.json的构建命令,在TS编译完成后自动把assets目录复制到lib下:

  1. 安装跨平台复制工具cpx(避免不同操作系统复制命令不兼容):
npm install cpx --save-dev
  1. 打开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同级),不需要修改构建脚本,只需要注意两点:

  1. 检查firebase.json的ignore配置,不要把assets目录加入忽略列表,确保部署时会被上传
  2. 代码中引用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:06:04