Vercel部署后报错:Setting up fake worker failed无法找到./pdf.worker.js
开发了一款支持上传PDF并与PDF对话的Web应用,采用pdfjs-dist(版本2.16.105)读取PDF内容。本地运行一切正常,但部署至Vercel后,上传PDF点击「处理文件」按钮时触发以下错误:
Setting up fake worker failed: "Cannot find module './pdf.worker.js'
Require stack:
/var/task/node_modules/pdfjs-dist/legacy/build/pdf.js
/var/task/.next/server/pages/api/process.js
/var/task/node_modules/next/dist/server/next-server.js
/var/task/___next_launcher.cjs".
原因分析
Vercel部署环境中,Next.js的API路由对pdfjs-dist默认的worker文件路径解析出现异常,worker文件未被正确识别或打包到部署产物中。
解决方案
1. 显式指定Worker CDN路径(最便捷)
在处理PDF的API代码(pages/api/process.js)中,手动设置Worker的CDN地址,绕开本地路径解析问题:
import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf'; // 替换为对应你使用的pdfjs-dist版本的公开CDN Worker文件地址 pdfjsLib.GlobalWorkerOptions.workerSrc = '对应版本的pdf.worker.min.js的CDN地址';
2. 配置本地Worker文件路径
如果不想依赖CDN,可将pdfjs-dist的worker文件复制到Next.js的public目录,然后指定本地路径:
- 从
node_modules/pdfjs-dist/legacy/build/pdf.worker.js复制文件到项目根目录的public文件夹 - 在API代码中设置路径:
pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdf.worker.js';
3. 修改Webpack配置适配路径解析
在next.config.js中添加Webpack配置,修正worker文件的别名解析:
module.exports = { webpack: (config) => { config.resolve.alias['./pdf.worker.js'] = 'pdfjs-dist/legacy/build/pdf.worker.js'; return config; }, };
4. 升级pdfjs-dist版本(长期方案)
考虑升级到pdfjs-dist 3.x及以上版本,新版本对Node.js和Next.js的打包兼容性更优,升级后调整导入和Worker设置:
import * as pdfjsLib from 'pdfjs-dist'; pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.js', import.meta.url).href;
内容的提问来源于stack exchange,提问作者Manas Kala

