CloudLinux OS Node.js Selector运行ES6模块启动失败求助
解决Namecheap Node.js Selector加载ESM模块(Nuxt3)的启动错误
问题核心
Namecheap服务器的Node.js Selector通过lsnode.js(CommonJS模块)加载启动文件,而你的Nuxt3项目(以及示例中的app.mjs)是ES模块(ESM),直接用require加载ESM会触发ERR_REQUIRE_ESM错误。
解决方案
方法1:创建CommonJS中间启动脚本
写一个CJS格式的启动文件,通过动态import()加载ESM入口文件,绕过require的限制:
// start.js (CommonJS格式) async function bootApp() { // 替换为你的Nuxt3实际入口路径,通常是 .output/server/index.mjs await import('./app.mjs'); } bootApp().catch(error => { console.error('应用启动失败:', error); process.exit(1); });
在Namecheap的Node.js Selector中,将启动文件设置为这个start.js即可。
方法2:确认项目package.json配置
确保项目根目录的package.json中包含ESM标识:
{ "type": "module" }
Nuxt3项目默认已配置,但如果缺失可以添加,辅助Node.js正确识别模块类型。
方法3:选择兼容的Node.js版本
在Namecheap的Node.js Selector中选择Node.js 16.x及以上版本,确保对ESM的完整支持。
你的示例启动文件
import http from 'http'; var server = http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var message = 'It works!\n', version = 'NodeJS ' + process.versions.node + '\n', response = [message, version].join('\n'); res.end(response); }); server.listen();
报错信息
internal/modules/cjs/loader.js:948 throw new ERR_REQUIRE_ESM(filename); ^ Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/wiebdmbt/jawedding/app.mjs at new NodeError (internal/errors.js:322:7) at Module.load (internal/modules/cjs/loader.js:948:11) at Function.Module._load (internal/modules/cjs/loader.js:790:12) at Module.require (internal/modules/cjs/loader.js:974:19) at require (internal/modules/cjs/helpers.js:93:18) at startApplication (/usr/local/lsws/fcgi-bin/lsnode.js:48:15) at Object.<anonymous> (/usr/local/lsws/fcgi-bin/lsnode.js:16:1) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) { code: 'ERR_REQUIRE_ESM' }
内容的提问来源于stack exchange,提问作者Justin Wiebe
相关产品推荐
相关产品推荐

