Astro部署Vercel后pdfmake自定义字体找不到问题求助
解决Astro部署Vercel后PDF自定义字体找不到的问题
问题分析与修复方案
1. 优化Vercel适配器的文件包含规则
Vercel打包函数时,includeFiles用glob模式匹配比逐个列文件更可靠,避免路径拼写遗漏:
adapter: vercel({ functionPerRoute: true, includeFiles: ["./public/resources/fonts/**/*.ttf"], }),
2. 修正字体路径的获取逻辑
本地运行时process.cwd()指向项目根目录,但Vercel函数的运行目录是打包后的子目录,改用import.meta.url推导绝对路径更稳定:
import path from "path"; import { fileURLToPath } from "url"; import type { TFontFamilyTypes } from "pdfmake/interfaces"; // 获取当前模块的绝对路径 const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // 根据当前文件位置推导字体目录(自行调整层级,比如当前文件在src/lib则用../../public) const pathToFonts = path.join(__dirname, "../../public/resources/fonts"); const fonts: Record<string, TFontFamilyTypes> = { Roboto: { normal: path.join(pathToFonts, "Roboto-Regular.ttf"), bold: path.join(pathToFonts, "Roboto-Bold.ttf"), italics: path.join(pathToFonts, "Roboto-Italic.ttf"), bolditalics: path.join(pathToFonts, "Roboto-BoldItalic.ttf"), }, }; export { fonts };
3. 直接加载字体文件内容(最稳妥方案)
绕开路径依赖问题,直接把字体文件读成Buffer传给pdfmake:
import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; import type { TFontFamilyTypes } from "pdfmake/interfaces"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const pathToFonts = path.join(__dirname, "../../public/resources/fonts"); const fonts: Record<string, TFontFamilyTypes> = { Roboto: { normal: fs.readFileSync(path.join(pathToFonts, "Roboto-Regular.ttf")), bold: fs.readFileSync(path.join(pathToFonts, "Roboto-Bold.ttf")), italics: fs.readFileSync(path.join(pathToFonts, "Roboto-Italic.ttf")), bolditalics: fs.readFileSync(path.join(pathToFonts, "Roboto-BoldItalic.ttf")), }, }; export { fonts };
4. 排查Vercel运行日志
去Vercel控制台查看对应函数的错误日志,日志里会显示找不到的具体路径,根据实际路径调整代码,能快速定位问题。
内容的提问来源于stack exchange,提问作者Diego Ulloa
相关产品推荐
相关产品推荐

