使用 PM2 运行 Typescript 应用程序

Coo*_*oop 10 javascript typescript pm2

我有一个用 Typescript 编写的应用程序,它与 PM2 一起运行。目前我编译为 JavaScript,然后使用 PM2 启动应用程序。我的ecosystem.config.js文件看起来像这样:

module.exports = {
  apps: [
    {
      name: 'My Application',
      script: './dist/server/index.js',
      env_qa: {
        PORT: 3001,
        NODE_ENV: 'production',
      },
      env_production: {
        PORT: 3000,
        NODE_ENV: 'production',
      },
    },
  ],
};
Run Code Online (Sandbox Code Playgroud)

我使用以下命令运行它:

pm2 stop ecosystem.config.js --env qa

在开发时,我只是运行ts-node server而不是编译和使用 PM2。我最近读到 ts-node 有一个“transpileOnly”或“fast”模式,这意味着它可以用于生产。首先,我想知道这是否可以在生产环境中使用。其次,我如何仍然使用 PM2 来启动我的应用程序但使用 ts-node?

iva*_*kov 16

开发环境

\n

该运行时会导致极高的内存消耗和服务器过载,因此不应在生产中使用。

\n

https://pm2.io/docs/runtime/integration/transpilers/

\n
\n

我们不建议在生产中使用它,因为它会减慢您的应用程序的速度。

\n
\n
"scripts": {\n    "pm2": "NODE_ENV=production pm2 start server.ts --watch"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

生产环境

\n

您可以使用单独的命令将 TypeScript 转换为 JavaScript 并使用npm run pm2(或者npm run pm2:staging如果您有暂存环境)运行它。

\n

仅当您需要使用生产和临时环境时,才应在本地使用命令npm run prod和。npm run staging

\n
"scripts": {\n    "pm2": "NODE_ENV=production pm2 start build/server.js --watch -i max",\n    "pm2:staging": "NODE_ENV=staging pm2 start build/server.js --watch -i max",\n\n    "prod": "NODE_ENV=production node build/server.js",\n    "staging": "NODE_ENV=staging node build/server.js",\n\n    "dev": "HTTPS=true NODE_ENV=development ts-node-dev --inspect --respawn src/server.ts",\n\n    "build": "rimraf build && tsc -p tsconfig.json",\n    \n    "test": "NODE_ENV=test nyc ./node_modules/.bin/mocha --require ts-node/register ./src/test/**/**/**/**/*.test.ts",\n}\n
Run Code Online (Sandbox Code Playgroud)\n

你的tsconfig.json compilerOptions应该看起来像这样:

\n
"compilerOptions": {\n    "target": "es5",\n    "module": "commonjs",\n    "lib": ["es2015", "dom"],\n    "sourceMap": true,                       \n    "outDir": "./build",\n\n    "strict": true,\n    "strictPropertyInitialization": false,\n\n    "noUnusedLocals": true,\n    "noUnusedParameters": true,\n    "noImplicitReturns": true,\n    "noFallthroughCasesInSwitch": true,\n\n    "moduleResolution": "node",\n    "types": ["reflect-metadata"],\n    "esModuleInterop": true,\n    "inlineSources": true,\n\n    "experimentalDecorators": true,\n    "emitDecoratorMetadata": true,\n    "skipLibCheck": true\n}\n
Run Code Online (Sandbox Code Playgroud)\n

PM2 可以生成启动脚本并配置它们,以在预期(和意外)机器重新启动时保持进程列表完整。这对于保持自动化很重要。https://pm2.keymetrics.io/docs/usage/startup/

\n
pm2 unstartup\npm2 startup\npm2 save\n
Run Code Online (Sandbox Code Playgroud)\n

  • 该页面上的第一句话是:“我们强烈不建议在生产中使用它,因为它会减慢您的应用程序” (2认同)

Shi*_*vam 6

package.json 脚本应如下所示:

package.json 文件(包含以下示例脚本)

"scripts": {
    "shivkumarscript": "ts-node -T -P server/tsconfig.json server/index.ts"
  }
Run Code Online (Sandbox Code Playgroud)

生态系统.config.js 文件

module.exports = {
    apps: [
        {
            name: "NodeServer",
            script: "npm",
            automation: false,
            args: "run shivkumarscript",
            env: {
                NODE_ENV: "development"
            },
            env_production: {
                NODE_ENV: "production"
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

假设你的机器上已经安装了 Node.js、npm 和 PM2。下面应该是通过 pm2 启动应用程序的命令,该命令将依次运行 npm 脚本(应用程序的 package.json 文件中提到的命令行):

对于生产环境:

pm2 start ecosystem.config.js --env production --only NodeServer
Run Code Online (Sandbox Code Playgroud)

对于开发环境:

pm2 start ecosystem.config.js --only NodeServer
Run Code Online (Sandbox Code Playgroud)