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

Node.js 18环境下require加载ES模块报错问题求助

解决Node.js部署时ERR_REQUIRE_ESM错误(LiteSpeed lsnode.js场景)

问题核心

你的server.js用了ES模块语法(import),但LiteSpeed的lsnode.js是CommonJS模块,它用require()加载你的ES模块,Node.js 18明确禁止这种跨模块的同步加载方式——这就是报错的根本原因,哪怕你加了"type": "module"或改文件后缀,也没法让require()兼容ES模块。


解决方案

方案1:把server.js改成CommonJS语法(最省心)

直接适配lsnode.js的加载逻辑,把ES模块语法换成CommonJS:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send("dd");
});

// 必须指定端口,否则服务无法正常启动
app.listen(3000, () => {
    console.log('Server running on port 3000');
});

改完后删掉package.json里的"type": "module",重新部署即可。

方案2:修改lsnode.js的加载逻辑(需服务器权限)

如果一定要用ES模块,就得改lsnode.js里的代码,把同步的require()换成异步动态import()(CommonJS模块支持这种方式):

  1. 找到文件/usr/local/lsws/fcgi-bin/lsnode.js的第48行:
var app = require(startupFile);
  1. 替换成以下异步加载代码:
(async function() {
    const appModule = await import(startupFile);
    // ES模块的默认导出要取.default
    var app = appModule.default;

    // 原来所有用到app的逻辑,都要移到这个异步函数内部,确保app加载完成后执行
})();
  1. 保存修改后,重启LiteSpeed服务生效。

方案3:检查LiteSpeed配置是否支持ES模块

部分新版本LiteSpeed提供了ES模块支持的配置项:

  • 登录LiteSpeed WebAdmin控制台
  • 找到对应站点的Node.js设置
  • 查看是否有「Module Type」选项,选择「ES Module」
  • 保存配置后重启站点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:42:33