【问题标题】:react express pm2 deploymentreact express pm2部署
【发布时间】:2019-06-12 19:06:04
【问题描述】:

场景

我已经为 API 制作了 react 应用程序和快速服务器,两者都是独立的。我没有在 express 应用程序中包含 react 文件夹。我期待使用 PM2 使用 pre/post 脚本来部署它,但我很难完全实现我的想法。

目标

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

现在我的目录结构是

.
├── client
├── ecosystem.config.js
└── server

我很困惑,因为我没有遇到任何实现这一目标的资源。此外,我不确定 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'
    }
  }
};

【问题讨论】:

  • 您可以在您的目录结构中添加相对于客户端和服务器放置 package.json 的位置吗?以及发布你的 package.json 的亮点
  • 您可以使用任务运行器(gruntgulp)来实现此目的。并为其创建相应的部署脚本并相应地对它们进行排序。
  • 为什么不编写一个 bashscript 来自动化依赖安装,获取构建文件,然后将构建文件移动到服务器。那样你会有更多的控制权。

标签: reactjs express pm2


【解决方案1】:

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

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

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

yarn config set workspaces-experimental true

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

{
  "private": true,
  "workspaces": ["server", "client"]
}

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

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

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

{
 ...
 "scripts": {
       "start": "yarn --cwd client react-scripts build && mv ./client/build ./server/public && node ./server/index.js"
  }
 ...
} 

【讨论】:

  • 很抱歉我没有开始工作,我还有点忙,因为我还有其他任务,我只是对此发表了评论,只是人们不认为我没有调查这个。会告诉你这是否可行:P
  • @IndrajeetLatthe 当然。不用担心。
  • 只有一个问题,如果我遵循这个我会得到 pm2 的功能吗?如果服务器重新启动会怎样?
  • 嗯 pm2 是一个应用程序管理器,因此您需要在最后一个 package.json 的启动脚本中输入 pm2 start ./server/index.js 而不是 node ./server/index.js。
  • 还有一个问题,我也有 gitlab 企业版,所以我也可以使用 CI 功能吗?并且可以自动化吗?
【解决方案2】:

我对你的问题的想法:

  1. 可以结合客户端和服务端的package.json。

  2. 我对你的问题有些困惑。

  3. 您可以配置为:
module.exports = {
  apps : [{
    name: 'API',
    cwd: 'server',
    script: 'npm run react && npm run express', //you must config npm run react && npm run express before use them  
    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'
    }
  }
}

如果它不能解决你的问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2022-01-06
    • 2018-09-07
    相关资源
    最近更新 更多