How can i use pm2 in combination with a package based on ES Module (type:"module") I looked into similar Questions without any useful help (some say it does not work on windows, but i am using linux)
I always receive the error:
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.
My ecosystem.config.js looks like:
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 is a ES module using "import" syntax. How can i tell pm2 that is should use this way of importing
To achieve this you can create an intermediary CommonJS module which loads your application from ESModule. It's possible with import
function available in commonJs modules.
This is how might this look:
ecosystem.config.js
lib/src/index.cjs
CommonJS entry point (for PM2).lib/src/index.js
ESModule entry point (for ESM-compatible tools).lib/src/app.js
Application code.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}!`
}