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

Node.js+Vercel部署index.mjs遭遇500内部服务器错误求助

解决Vercel部署ES模块(.mjs)与CommonJS依赖冲突的500错误

问题根源

从服务器日志的ERR_REQUIRE_ESM错误可以明确:Vercel的Node启动器试图用CommonJS的require()加载你的ES模块入口文件index.mjs,但两者的模块规范不兼容——你的package.json设置了"type": "commonjs",但.mjs文件默认被Node识别为ES模块,本地环境能兼容这种混合模式,但Vercel的Serverless环境对模块规范的校验更严格。

解决方案

方案1:统一为ES模块规范(推荐)

直接调整配置让整个项目以ES模块运行,同时兼容CommonJS依赖:

  1. 修改package.json
    将"type": "commonjs"改为"type": "module",这样所有.js文件也会被当作ES模块处理,Node.js 16+版本支持直接用import引入CommonJS包:

    {
      "name": "apis",
      "version": "1.0.0",
      "description": "",
      "main": "index.mjs",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "type": "module",
      // 其余依赖和配置保持不变
    }
    
  2. 更新vercel.json配置
    使用新版的Vercel Node构建器,并指定支持ES模块的Node版本:

    {
      "version": 2,
      "builds": [
        {
          "src": "index.mjs",
          "use": "@vercel/node@3",
          "config": {
            "runtime": "nodejs18.x"
          }
        }
      ],
      "routes": [
        {
          "src": "/(.*)",
          "dest": "index.mjs"
        }
      ]
    }
    

方案2:用CommonJS入口封装ES模块

如果不想修改项目的模块类型,可以创建一个CommonJS的入口文件,通过动态import()加载你的ES模块:

  1. 创建CommonJS入口文件index.js
    编写中间层,动态引入index.mjs并导出请求处理逻辑:

    // index.js
    module.exports = async (req, res) => {
      // 动态导入ES模块
      const { app } = await import('./index.mjs');
      // 假设你的index.mjs导出了express的app实例,用它处理请求
      app(req, res);
    };
    

    如果你的index.mjs是Vercel Serverless函数格式(直接导出(req,res)=>{}),则修改为:const handler = (await import('./index.mjs')).default; return handler(req,res);

  2. 更新配置文件

    • 修改package.json的"main"字段为"index.js"
    • 修改vercel.json的构建和路由配置指向index.js:
      {
        "version": 2,
        "builds": [
          {
            "src": "index.js",
            "use": "@now/node"
          }
        ],
        "routes": [
          {
            "src": "/(.*)",
            "dest": "index.js"
          }
        ]
      }
      

验证与注意事项

  • 本地测试:修改配置后先在本地运行,确保ES模块和CommonJS依赖能正常协同工作
  • 依赖检查:部分工具类包(如hardhat相关)在ES模块环境下可能需要调整调用方式,若遇到报错,可对特定包使用动态import()替代静态import

内容的提问来源于stack exchange,提问作者rohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:15:36