如何修复Phusion Passenger运行NodeJS项目时出现的ESM相关错误?
核心问题说明
你遇到的报错根源是旧版Phusion Passenger的Node.js加载器固定使用CommonJS的require()语法加载项目入口文件,而Node.js中require()不支持直接加载ESM规范的模块,哪怕配置了"type": "module"或者使用.mjs后缀也无法兼容。
可行解决方案(无需修改原有ESM业务代码)
方案1:新增CJS中转入口(最简便)
新增一个后缀为.cjs的CommonJS格式中转文件,通过动态导入语法加载你的原ESM入口文件:
- 在项目根目录新建
passenger-loader.cjs,内容如下:
// passenger-loader.cjs async function loadESMApp() { // 将./server.mjs替换为你原有的ESM启动文件路径 await import('./server.mjs'); } loadESMApp();
- 修改Passenger配置,指定启动文件为上述中转文件:
在你的Web服务器(Nginx/Apache)的站点配置中添加如下配置:
# Nginx配置示例 passenger_startup_file passenger-loader.cjs;
如果是Apache配置,对应语法为:
PassengerStartupFile passenger-loader.cjs
方案2:打包ESM代码为CJS格式
使用打包工具将所有ESM业务代码打包为单个CommonJS格式的入口文件,无需调整原有代码逻辑,仅新增打包步骤即可:
使用esbuild的打包示例命令:
esbuild server.mjs --bundle --platform=node --outfile=app.cjs
打包完成后直接配置Passenger加载生成的app.cjs即可。
方案3:升级Phusion Passenger到6.0.20及以上版本
该版本开始Passenger的Node加载器已原生支持ESM入口文件,升级完成后无需额外配置即可直接加载你的原ESM启动文件。
内容的提问来源于stack exchange,提问作者Deltrak
相关产品推荐
相关产品推荐

