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模块支持这种方式):
- 找到文件
/usr/local/lsws/fcgi-bin/lsnode.js的第48行:
var app = require(startupFile);
- 替换成以下异步加载代码:
(async function() { const appModule = await import(startupFile); // ES模块的默认导出要取.default var app = appModule.default; // 原来所有用到app的逻辑,都要移到这个异步函数内部,确保app加载完成后执行 })();
- 保存修改后,重启LiteSpeed服务生效。
方案3:检查LiteSpeed配置是否支持ES模块
部分新版本LiteSpeed提供了ES模块支持的配置项:
- 登录LiteSpeed WebAdmin控制台
- 找到对应站点的Node.js设置
- 查看是否有「Module Type」选项,选择「ES Module」
- 保存配置后重启站点
内容的提问来源于stack exchange,提问作者Marcin Madera
相关产品推荐
相关产品推荐

