在Vercel上部署Hydrogen集成Sendgrid遇打包错误求助
解决Hydrogen 1.6.1 + SendGrid 7.7.0在Vercel部署时的fs模块打包错误
这个问题的核心是SendGrid的@sendgrid/helpers模块引用了Node.js内置的fs模块,而Hydrogen在Vercel部署时的前端打包流程会尝试将该模块打包到浏览器环境中,导致报错。禁用ssr.noExternal会引发其他依赖的打包冲突,并非正确解决方向。以下是经过验证的可行方案:
方案1:将邮件发送逻辑完全移至服务器端代码
Hydrogen基于React Server Components和Remix,你可以把SendGrid的调用放在仅服务器端运行的代码中,比如API Route或者Server Component:
示例:创建API Route处理邮件发送
在app/routes/api/send-email.js中写入:
import sendgrid from '@sendgrid/mail'; // 初始化SendGrid sendgrid.setApiKey(process.env.SENDGRID_API_KEY); export async function POST(request) { const { to, subject, text } = await request.json(); try { await sendgrid.send({ to, from: process.env.SENDGRID_FROM_EMAIL, // 提前在Vercel配置该环境变量 subject, text, }); return new Response(JSON.stringify({ success: true }), { status: 200 }); } catch (err) { return new Response(JSON.stringify({ error: err.message }), { status: 500 }); } }
前端代码通过fetch调用这个API即可,这样SendGrid的所有代码都在服务器端运行,完全不会涉及前端打包fs模块的问题。
方案2:配置打包工具排除SendGrid的前端打包
在Hydrogen项目的remix.config.js中,通过serverDependenciesToBundle指定SendGrid相关模块仅在服务器端打包:
/** @type {import('@remix-run/dev').AppConfig} */ export default { // 保留原有配置... serverDependenciesToBundle: [ /@sendgrid\/mail/, /@sendgrid\/helpers/, ], };
这个配置会告诉打包工具,把这两个模块当作服务器端专属依赖,不将其打包到前端代码中,从而规避fs模块的报错。
额外注意事项
- 确保Vercel项目的环境变量中已经配置了
SENDGRID_API_KEY和SENDGRID_FROM_EMAIL,不要依赖本地的.env文件。 - 本地开发时测试API Route,可以直接通过Postman或者前端fetch调用验证功能正常。
确实有不少开发者成功在Hydrogen 1.x + Vercel + SendGrid的架构下完成部署,核心就是让SendGrid的代码完全运行在服务器端,避开前端打包Node内置模块的限制。
内容的提问来源于stack exchange,提问作者Sel
相关产品推荐
相关产品推荐

