反应Express pm2部署

Ind*_*the 6 express reactjs pm2

情境

我已经制作了React应用以及API的快速服务器,两者都是独立的。我尚未在Express应用中包含react文件夹。我期待使用PM2之前/之后的脚本来部署它,但是我很难真正实现我的想法。

目标

  1. 我想同时为客户端和服务器运行npm install,因为以后可能需要删除/添加软件包。
  2. 我在想像npm安装后,我想构建react应用程序,然后移动该文件夹以供表达(我不知道是否可以提供不在父目录中的用于表示静态内容的目录路径)。
  3. 然后,我想启动快速服务器,该服务器最终将提供反应构建文件。

现在我的目录结构是

.
??? client
??? ecosystem.config.js
??? server
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我没有找到实现这一目标的任何资源。另外,我不确定pm2部署脚本是否可以实现此功能,或者我需要编写自己的bash脚本来完成某些工作,然后pm2仅启动服务器。

这只是我所做的,这似乎是完全错误的

生态系统.config.js

module.exports = {
  apps : [{
    name: 'API',
    cwd: 'server',
    script: 'server.js',
    args: 'one two',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env_production: {
      NODE_ENV: 'production'
    }
  }],

  deploy : {
    production : {
      user : 'node',
//      host : '212.83.163.1',
//      ref  : 'origin/master',
//      repo : 'git@github.com:repo.git',
//      path : '/var/www/production',
      'post-deploy' : 'cd client && npm run build'
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

Pri*_*ega 2

由于您同时拥有服务器和客户端,因此我假设它是在 monorepo 中开发的。

出于这些目的,我建议使用纱线工作区,因为它本身满足您的第一个要求(客户端和服务器都安装 npm)。

要在1.0之前的yarn版本中启用工作区,请执行以启用它。

yarn config set workspaces-experimental true
Run Code Online (Sandbox Code Playgroud)

然后在服务器和客户端文件夹之外的文件夹(工作空间根目录)中添加package.json以及package.json您需要的任何其他密钥。还可以直接在此处安装常见依赖项,而不是在服务器和客户端内的 package.json 文件中单独安装它们。(不要忘记删除node_modules其中的文件夹,因为将在工作区根目录中创建一个新文件夹,并在纱线安装期间将所有依赖项安装在一起)。

{
  "private": true,
  "workspaces": ["server", "client"]
}
Run Code Online (Sandbox Code Playgroud)

将以下内容添加到您的服务器 index.js 文件中。

app.use(express.static(path.join(__dirname, 'public')));
app.get('*', (req,res) =>{
    res.sendFile(path.join(__dirname+'/public/index.html'));
});
Run Code Online (Sandbox Code Playgroud)

并将 npm 脚本添加到package.json工作区根目录中。

{
 ...
 "scripts": {
       "start": "yarn --cwd client react-scripts build && mv ./client/build ./server/public && node ./server/index.js"
  }
 ...
} 
Run Code Online (Sandbox Code Playgroud)