如何在Vercel上部署基于ES Module的Express应用
解决Vercel部署ES Module版Express应用的ERR_REQUIRE_ESM错误
问题描述
部署基于ES Module(ESM)的Express应用到Vercel时触发ERR_REQUIRE_ESM错误,自身代码未使用require(),但报错显示Vercel的启动脚本尝试用require()加载ESM格式的入口文件。
问题原因
报错中的___now_launcher.js是旧版@now/node构建器的启动脚本,它默认以CommonJS方式加载入口文件,而ESM文件无法被require()直接加载,因此触发错误。
解决方案
1. 替换并更新Vercel构建器
将vercel.json中的旧构建器@now/node替换为最新的@vercel/node,新版构建器对ESM支持更完善。
2. 修改vercel.json配置
调整构建配置,指定兼容ESM的Node.js版本,确保路由配置正确:
{ "version": 2, "builds": [ { "src": "server.mjs", "use": "@vercel/node@3", "config": { "runtime": "nodejs20.x" } } ], "routes": [ { "src": "/(.*)", "dest": "/server.mjs" } ] }
选择Node.js 20.x及以上版本,这类版本对ESM支持更稳定。
3. 调整入口文件的启动逻辑
Vercel会自动分配端口并启动服务,无需手动调用app.listen(),修改server.mjs移除监听代码,仅导出Express实例:
import express from "express"; import postsRouter from "./routes/posts.js"; import connectDB from "./config/db.js"; import cors from "cors"; const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cors()); connectDB(); app.use("/api/posts", postsRouter); app.get("/", (req, res) => { res.send("Backend of the app is now accessible "); }); // 移除app.listen,由Vercel负责启动服务 export default app;
4. 确认依赖兼容性
确保所有依赖包支持ESM,你当前使用的express@4.18.x、mongoose@7.x、cors@2.8.x均已支持ESM,无需额外调整。
验证部署
完成上述修改后重新部署到Vercel,即可解决ERR_REQUIRE_ESM错误。
内容的提问来源于stack exchange,提问作者krishnaacharyaa
相关产品推荐
相关产品推荐

