Vercel部署Next.js多子域MDX应用时esbuild-linux-64包缺失如何解决
解决方案
问题根因
你的判断完全正确,报错是因为next-mdx-remote的serialize方法依赖esbuild做编译,而esbuild通过optionalDependencies适配不同平台的二进制包,Vercel部署环境为Linux x64架构,npm安装时默认跳过了该平台的可选依赖包esbuild-linux-64,导致运行时找不到对应二进制文件。
可行修复方案
按优先级推荐以下几种方案:
- 方案1:修改Vercel安装命令
进入Vercel项目控制台,找到「设置」-「构建与部署」-「安装命令」,将默认安装命令替换为强制包含可选依赖的命令:
如果你用npm:npm install --include=optional
如果你用yarn:yarn install --ignore-optional false
如果你用pnpm:pnpm install --no-optional=false
修改后重新触发部署即可生效。 - 方案2:主动声明对应平台依赖
在项目package.json的dependencies或optionalDependencies中手动添加esbuild-linux-64依赖,执行以下命令安装后重新提交代码部署:
该方案会强制安装Linux平台的esbuild二进制包,不受安装参数影响。npm install esbuild-linux-64 --save - 方案3:更新锁文件
删除本地项目的package-lock.json/yarn.lock/pnpm-lock.yaml锁文件,重新执行对应包管理工具的安装命令生成新的锁文件,新锁文件会包含所有平台的esbuild可选依赖信息,提交后部署到Vercel即可自动拉取对应平台的依赖包。
额外优化建议
如果后续需要进一步降低服务端运行开销,可以考虑将MDX序列化的逻辑从getServerSideProps移到发布内容的环节:用户点击发布时直接在前端序列化MDX,将序列化后的结果存储到Firestore,访问子域名时直接拉取预序列化的内容传递给MDXRemote渲染即可,完全规避服务端依赖esbuild的问题,还能提升页面访问速度。
内容的提问来源于stack exchange,提问作者zainsci
相关产品推荐
相关产品推荐

