在同一个Heroku app / dyno上部署后端和前端

时间:2016-04-08 16:32:33

标签: node.js heroku deployment procfile dyno

在我的项目的根目录中,我有一个frontendbackend文件夹。这两个文件夹都包含一个列出其依赖项的package.json。在部署应用程序时,如何告诉Heroku在两个文件夹上运行npm install?看起来Heroku希望默认情况下只有一个package.json文件。我是否必须使用Procfile执行某些操作? Heroku文档似乎并没有说明我的具体问题。

感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

似乎您可以在项目的根目录中放置package.json文件,并使用脚本在两个文件夹中调用npm i

https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process

cd front && npm i && cd ../back && npm i

这样的东西

但我应该说,如果它们在不同的端口上运行,它可能无法工作,因为似乎每个procfile只有一个Web进程可用。 最后一点是确认。

答案 1 :(得分:6)

我刚刚使用在heroku后构建步骤中创建的静态文件成功完成了此目标,如本blogpost中所述。我有一个React前端(虽然可以是任何东西)和Express API后端。每个进程在dev中都有其自己的端口,但是在Heroku上进行部署只使用一个端口。

  1. 将工作前端放置在root的子目录中(例如/frontend)。
  2. 将工作后端放置在根目录的子目录中(例如/api-博客文章假定后端保留在根目录中-两种方法都可以)。
  3. 从前端到后端的代理API请求,方法是将以下行添加到/frontend/package.json(用后端端口替换5000):

    “代理”:“ http://localhost:5000”,

  4. 将以下内容添加到后端的api/app.js(或api/index.js)中(确保最后一部分是在您定义了适当的后端[或api]路径之后):

const path = require('path')

// Serve static files from the React frontend app
app.use(express.static(path.join(__dirname, '../frontend/build')))

// AFTER defining routes: Anything that doesn't match what's above, send back index.html; (the beginning slash ('/') in the string is important!)
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname + '/../frontend/build/index.html'))
})

  1. 使用类似以下内容的方法编辑根目录的/package.json文件(请注意,使用并发包允许使用npm run dev在本地运行整个应用程序的简便方法,但是只有heroku-postbuild是这里需要):

  "scripts": {
    "frontend": "cd frontend && npm start",
    "api": "cd api && nodemon app.js",
    "dev": "concurrently --kill-others-on-fail \"npm run api\" \"npm run frontend\"",
    "heroku-postbuild": "cd frontend && npm install && npm run build"
  },

  1. 确保将所有后端程序包依赖项安装在根目录中,否则会出错。
  2. 确保您的/Procfile具有类似web: node api/app.js的内容

答案 2 :(得分:5)

您可以在Procfile

中为项目定义多个入口点
web: cd front && npm i && npm start
server: cd backend && npm i && npm start

但是,您必须至少升级到Hobby。这是7美元/ dyno /月。