Node.js 如何在弹性豆茎上使用Django提供React应用程序?

Node.js 如何在弹性豆茎上使用Django提供React应用程序?,node.js,django,reactjs,amazon-elastic-beanstalk,Node.js,Django,Reactjs,Amazon Elastic Beanstalk,我以前在Heroku上有我的应用程序,它的工作方式是我有2个构建包。一个用于NodeJS,一个用于Python。Heroku运行了npm运行build,然后Django从build文件夹中提供了文件 每次在GitHub存储库上有新的推送时,我都使用AWS上的代码管道来部署我的应用程序的新版本 由于我不知道如何在EB中的python环境中运行npm run build,所以我有了一个解决方法。我运行了npm run build并将其推送到我的存储库中(从.gitignore中删除了build文件夹

我以前在Heroku上有我的应用程序,它的工作方式是我有2个构建包。一个用于NodeJS,一个用于Python。Heroku运行了
npm运行build
,然后Django从
build
文件夹中提供了文件

每次在GitHub存储库上有新的推送时,我都使用AWS上的代码管道来部署我的应用程序的新版本

由于我不知道如何在EB中的python环境中运行
npm run build
,所以我有了一个解决方法。我运行了
npm run build
并将其推送到我的存储库中(从.gitignore中删除了
build
文件夹),然后Django将文件发送到了EB上


然而,这并不是最好的解决方案,我想知道是否有人知道如何运行
npm run build
,就像Heroku使用他们的NodeJS buildpack在EB上运行python应用程序一样。

我不太了解python,但我想你可以适应你的情况

Node.js平台的Elastic Beanstalk默认使用
app.js
,然后使用
server.js
,然后使用
npm start
(按该顺序)启动应用程序

您可以使用配置文件更改此行为。下面是使用Node.js完成的步骤:

  • 使用以下内容创建以下文件
    .ebextensions/.config
    option_settings:
      aws:elasticbeanstalk:container:nodejs:
        NodeCommand: "npm run eb:prod"
    
    # Force npm to run node-gyp also as root
    unsafe-perm=true
    
  • 编辑您的
    package.json
    以创建
    eb:prod
    命令。例如:
    "scripts": {
      "start": "razzle start",
      "build": "razzle build",
      "test": "razzle test --env=jsdom",
      "start:prod": "NODE_ENV=production node build/server.js",
      "eb:prod": "npm run build && npm run start:prod"
    }
    
  • 在生成过程中,您可能会遇到权限被拒绝的错误。要解决此问题,您可以创建具有以下内容的
    .npmrc
    文件:
    option_settings:
      aws:elasticbeanstalk:container:nodejs:
        NodeCommand: "npm run eb:prod"
    
    # Force npm to run node-gyp also as root
    unsafe-perm=true
    

  • 如果你需要更多的细节,我写了一篇关于它的博客:

    所以我想出了一个适合我的解决方案

    因为我想在服务器上创建我的应用程序的构建版本,就像Heroku使用NodeJS buildpack那样,所以我必须创建一个命令来安装node,如下所示:

    container_commands:
      01_install_node:
        command: "curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash - && sudo yum install nodejs"
        ignoreErrors: false
    
    然后,为了在Python环境EB上创建react应用程序的构建版本,我添加了以下命令:

    container_commands:
      02_react:
        command: "npm install && npm run build"
        ignoreErrors: false
    
    当然,在创建构建版本后,您应该收集静态文件,下面是我的工作配置文件的结尾:

    option_settings:
      aws:elasticbeanstalk:container:python:
        WSGIPath: <project_name>/wsgi.py
    
      aws:elasticbeanstalk:application:environment:
        DJANGO_SETTINGS_MODULE: <project_name>.settings
    
      aws:elasticbeanstalk:container:python:staticfiles:
        /static/: staticfiles/
    
    container_commands:
      01_install_node:
        command: "curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash - && sudo yum install nodejs"
        ignoreErrors: false
    
      02_react:
        command: "npm install && npm run build"
        ignoreErrors: false
    
      03_collectstatic:
        command: "django-admin.py collectstatic --noinput"
    
    选项设置:
    aws:elasticbeanstalk:container:python:
    WSGIPath:/wsgi.py
    aws:elasticbeanstalk:应用:环境:
    DJANGO\u设置\u模块:。设置
    aws:elasticbeanstalk:container:python:staticfiles:
    /static/:staticfiles/
    容器命令:
    01\u安装\u节点:
    命令:“curl-sL”https://rpm.nodesource.com/setup_12.x |sudo bash-&&sudo yum安装nodejs“
    忽略错误:错误
    02_反应:
    命令:“npm安装和npm运行生成”
    忽略错误:错误
    03_静态:
    命令:“django-admin.py collectstatic--noinput”
    

    希望这能帮助任何遇到同样问题的人,谢谢你的回答。我使用Python不仅为react应用程序提供服务,还用于API和身份验证。为了使用Python和Django框架,我必须使用EB for Python。所以我想知道是否有可能在我的pythoniceb中构建我的react应用程序的生产版本。必须使用
    .ebextensions
    自定义命令才能启动应用程序。要了解如何编辑配置文件,请执行以下操作: