【问题标题】:Deploying a Full Stack Node app npm / package.json architecture部署全栈节点应用 npm / package.json 架构
【发布时间】:2018-04-17 21:40:40
【问题描述】:

我有a repository,它包含一个后端(Node/Express)和一个前端客户端,例如:

├── build
├── config
├── coverage
│   └── lcov-report
├── dist
│   └── static
├── server (node/express server)
│   ├── coverage
│   ├── docs
|   ├── src
│   ├── etc
│   └── package.json
|
├── src (Vue.js : client code)
│   ├── api
│   ├── assets
│   ├── components
│   ├── router
│   └── store
└── static
└── package.json

我有两个 package.json 文件,一个用于客户端,一个用于服务器。

  1. 我在部署 Heroku 等服务时遇到问题,因为他们不希望在一个存储库中有两个不同的 npm 包(我认为)。如何使用此设置部署到 Heroku(或其他)?
  2. 为应用程序的两个部分创建一个 package.json 文件会更明智吗?

在同一个 package.json 中同时包含前端和后端部分的优点和缺点是什么?

【问题讨论】:

    标签: javascript node.js heroku npm


    【解决方案1】:

    您可以使用heroku-postbuild 并在推送到 Heroku 的单个 git 存储库中为您的客户端和服务器维护单独的 package.json 文件。

    例如,在我的一个项目中,目录结构如下所示:

    |-- package.json (for node/express server)
    |-- Procfile
    |-- www
        |--client
           |-- package.json (for Ionic/Angular client app)
           |-- ...
        |--server
           |--- ...
        |-- server.js (top level node.js/express script for server)
    

    在我的顶级 package.json 中,我有:

    "scripts": {
        "start": "node www/server.js",
        "heroku-postbuild": "cd www/client && npm install && npm run build"
     },
    

    在我的客户端 package.json 我有:

     "scripts": {
        "build": "ionic-app-scripts build",
        ...
     },
    

    最后在我的 Procfile 中:

    web: npm start
    

    使用此解决方案,Heroku 运行我的服务器并在每个 Heroku 构建上构建我的客户端代码。

    我认为客户端和服务器 package.jsons 应该分开保存有几个原因。一方面,您真的不希望将所有服务器端代码捆绑到客户端中。

    【讨论】:

    • 我不喜欢这个解决方案的一点是,我不能真正拥有两个同级客户端/服务器目录,因为 Heroku(或任何其他服务)默认会查找根 package.json 文件。 . 你不能告诉它从哪里开始(我想你可以,但我不知道如何)
    • 我认为您可能需要摆弄 Heroku 的节点 buildpack 才能实现这一目标。在github.com/heroku/heroku-buildpack-nodejs/issues/385 上查看一些讨论。
    • 这个 repo 显示了 Node.js 的设置,它为在单个 Heroku dyno 上运行的 React 前端提供服务:github.com/mars/heroku-cra-node 我能够使用它作为指南启动并运行一个。为了整洁,我将文件夹结构修改为与上面非常相似: / 、 client/ 、 server/ ,每个都有自己的 package.json。我认为对于较小的应用程序,这是要走的路,因为您为 1 个 dyno 而不是 2 个付费,并且随着应用程序的增长,很容易将它们拆分为单独的应用程序。
    【解决方案2】:

    我在部署到 heroku 时遇到了类似的问题。 我使用一个同时调用的包通过服务器端 package.json 中的启动脚本来启动客户端和服务器端。我还使用 node 的内置代理功能通过在客户端 package.json 中添加一行来将任何请求从客户端发送到服务器。

    顺便说一句,我在客户端使用 create-react-app,所以有些东西看起来有点奇怪。

    我的文件夹结构是

    Server folder
       Server package.json
       Client folder
          Client package.json
    

    服务器包.json:

    "scripts": {
      "start": "concurrently \"npm run server\" \"npm run client\"",
      "server": "cross-env NODE_ENV=production node server.js",
      "server-dev": "nodemon --watch ./ --exec babel-node -- server.js",
      "client": "node start-client.js",
      "dev": "concurrently \"npm run server-dev\" \"npm run client\"",
      "lint": "eslint ."
     },
    

    客户端包.json:

    "proxy": "http://localhost:3001",
    

    我假设 Heroku 只是寻找一个启动脚本并运行它。 我认为在你的服务器和客户端之间有一定程度的分离是一个好主意,所以我不建议尝试将它们全部放在一个 package.json 中

    如果您愿意,您可以通过谷歌搜索以下关键字在线找到教程:heroku 并发服务器客户端

    顺便说一句,如果你这样设置就不需要 CORS

    干杯

    【讨论】:

    • 嘿 :) 我赞成你的回答:我以前尝试过这样做,但我遇到了问题(Azure 是 ****)我认为它会起作用。唯一的问题是客户端文件夹需要嵌套在我不太喜欢的服务器中。有没有办法告诉 Heroku 从特定的 package.json 开始,不管它是否在根级别?
    • 嘿,是的,我认为您可以使用 Procfile 代替 heroku 首先查看的。 devcenter.heroku.com/articles/procfile
    【解决方案3】:

    我也遇到过类似的问题。我发现最简单的解决方案是拥有两个独立的 Git 存储库,一个用于后端,一个用于前端。那么每个仓库的根目录下只有一个package.json。

    然后您可以创建第三个存储库并使用 Git 子模块来包含后端和前端存储库。您将使用“组合”存储库进行开发工作,但您将部署单独的存储库。这提供了与部署工具的最大兼容性,同时允许您仍然维护单个存储库以便于开发。

    【讨论】:

    • “部署单个存储库”意味着我需要两个单独的实例?这是我的问题的核心。你有这样的示例项目吗?
    • 我会考虑根本不使用 Vue.js 应用程序的实例。对于大多数项目,我使用 Ember.js(如 Vue.js)和 Sails.js(如 Express)。我会为 Sails.js 应用程序做一个实例(实际上是在带有负载均衡器的自动缩放组中的多个)。然后我会将 Ember.js 部署到像 CloudFront 这样的 CDN。对静态资产使用 CDN 成本更低,并且为客户提供更低的延迟。
    • 只是为了澄清我只是在尝试免费层服务和部署,尽管试图保持它的现实性和过早优化:)
    • AWS CloudFront 是一个很好的选择! aws.amazon.com/cloudfront/pricing
    • 您绝对可以将您的 API 留在 Heroku 或任何其他服务中。浏览器下载客户端代码,然后运行它调用 API。您的目标应该是让两者都尽可能接近客户。设置代理会破坏 CDN 的目的。您必须设置 CORS 标头。
    猜你喜欢
    • 2017-06-17
    • 2017-10-13
    • 1970-01-01
    • 2018-01-22
    • 2020-07-16
    • 1970-01-01
    • 2022-01-11
    • 2011-08-24
    • 2021-11-24
    相关资源
    最近更新 更多