Vercel无服务器环境下Puppeteer找不到Chrome的问题咨询
在Vercel部署Next.js应用时运行Puppeteer的问题
错误信息
Error: Could not find Chrome (ver. 121.0.6167.85). This can occur if either 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or 2. your cache path is incorrectly configured (which is: /home/sbx_user1051/.cache/puppeteer).
已尝试的操作
- 在
package.json中添加"postinstall": "npx puppeteer browsers install chrome" - 在
vercel.json中设置"buildCommand": "npx puppeteer browsers install chrome && next build" - 在
next.config.js中将Puppeteer加入serverComponentsExternalPackages:
experimental: { serverComponentsExternalPackages: ["puppeteer"], },
- 在代码中指定Chrome可执行文件路径:
const browser = await puppeteer.launch({ headless: true, executablePath: "/usr/bin/chromium-browser", args: ["--no-sandbox", "--disable-setuid-sandbox"], });
环境信息
- Next.js 15.1.2
- Puppeteer 21.5.2
- @axe-core/puppeteer 4.7.3
- Vercel无服务器部署
问题解答
1. 如何确保Vercel无服务器环境中存在Chrome?
- 改用
puppeteer-core替代puppeteer:puppeteer会自动下载浏览器,但Vercel无服务器环境的缓存限制会导致下载的浏览器无法持久化。puppeteer-core仅提供API层,不自带浏览器,可配合Vercel预装的Chromium使用。 - 指定Vercel预装Chromium路径:Vercel环境默认预装了Chromium,路径为
/usr/bin/chromium-browser。需配合puppeteer-core使用,并调整启动参数适配无服务器环境:import puppeteer from 'puppeteer-core'; const browser = await puppeteer.launch({ headless: 'new', executablePath: '/usr/bin/chromium-browser', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--no-first-run', '--single-process' ] }); - 调整Puppeteer缓存路径:Vercel无服务器环境中
/tmp目录可写且临时持久,可通过环境变量指定缓存路径:
或在代码中提前设置:PUPPETEER_CACHE_DIR=/tmp/puppeteer npx puppeteer browsers install chromeprocess.env.PUPPETEER_CACHE_DIR = '/tmp/puppeteer';
2. 在无服务器函数中运行浏览器自动化是否有更优方案?
- 使用托管浏览器自动化服务:将浏览器运行在专门的托管服务,Vercel函数仅通过API调用执行自动化任务,规避无服务器环境的内存、执行时间限制,同时减少函数启动开销。
- 切换到Vercel Edge Functions:Edge环境的资源限制相对宽松,适合轻量自动化任务。配合
puppeteer-core使用,能获得更快的冷启动速度。 - 优化浏览器启动参数:启用
headless: 'new'模式(比旧版无头模式更高效),添加--disable-dev-shm-usage避免共享内存不足,--single-process减少资源占用,进一步适配无服务器环境。 - 复用远程浏览器实例:如果自动化任务频繁,可连接到长期运行的远程浏览器实例,避免每次函数调用都启动新浏览器,大幅降低延迟。
内容的提问来源于stack exchange,提问作者frederikw
相关产品推荐
相关产品推荐

