You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:13:11