使用 ES 模块运行 pm2

问题描述 投票:0回答:3

如何将 pm2 与基于 ES Module 的包结合使用(类型:“module”) 我研究了类似的问题,没有任何有用的帮助(有人说它在 Windows 上不起作用,但我正在使用 Linux)

我总是收到错误:

Error [ERR_REQUIRE_ESM]: require() of ES Module /opt/app/server/lib/src/index.js not supported.
0|any| Instead change the require of index.js in null to a dynamic import() which is available in all CommonJS modules.

我的 Ecosystem.config.js 看起来像:

const os = require('os');
module.exports = {
    apps: [{
        port        : 3000,
        name        : "any",
        script      : "lib/src/index.js",
        watch       : true,           
        instances   : os.cpus().length,
        exec_mode   : 'fork',         
        env: {
            NODE_ENV: "production",
        }
    }]
}

index.js 是一个使用“import”语法的 ES 模块。我如何告诉 pm2 应该使用这种导入方式

javascript pm2
3个回答
18
投票

ecosystem.config.js
重命名为
ecosystem.config.cjs
对我有用


10
投票

为了实现这一点,您可以创建一个中间 CommonJS 模块,该模块从 ESModule 加载您的应用程序。可以使用 commonJs 模块中提供的

import
功能来实现。

这就是它的样子:

  • ecosystem.config.js
  • lib/src/index.cjs
    CommonJS 入口点(用于 PM2)。
  • lib/src/index.js
    ESModule 入口点(用于 ESM 兼容工具)。
  • lib/src/app.js
    应用程序代码。

ecosystem.config.js

const os = require('os');
module.exports = {
    apps: [{
        port        : 3000,
        name        : "any",
        script      : "lib/src/index.cjs", // 👈 CommonJS
        watch       : true,           
        instances   : os.cpus().length,
        exec_mode   : 'fork',         
        env: {
            NODE_ENV: "production",
        }
    }]
}

lib/src/index.js

import {app} from './app.js'

app()

lib/src/index.cjs

import('./app.js') // 👈 There is import function available in CommonJS
.then(({app}) => {
 app()
})

lib/src/app.js

import {hello} from './greet.js'

export function app() {
  console.log(hello('World'))
}

lib/src/greet.js

export function hello(name) {
  return `Hello, ${name}!`
}

0
投票

另一种解决方案是在 package.json 文件中包含以下行:

"type": "module",

然后启动应用程序:

pm2 start "node -- /path/to/app.js"

如果您不使用

ecosystem.config.js
文件,因此无法将其重命名为
ecosystem.config.cjs
,则此功能特别有用。我在 4lgar 的评论中找到了这个解决方案 https://github.com/Unitech/pm2/issues/4540

© www.soinside.com 2019 - 2024. All rights reserved.