8

我们正在使用 Create-React-App 开发一个 ReactJS 应用程序,该应用程序由我们的 Node/Express 服务器提供服务,该服务器也提供 API。我们使用 node/JS buildpack 将整个服务器部署到 Heroku,并尝试按照@mars在本期中的建议从节点文件npm run build中获取脚本中的 CRA 构建步骤。postinstallpackage.json

问题是 Heroku 部署因此错误而失败。请注意,这个错误有时在本地发生在我身上,但是npm install来自 web_app 的一个正在解决这个问题,但在 Heroku 中运行时却没有。我有两个相关的问题:

  1. 如何将同时提供 API 和 Create-React-App 应用程序的 Node/Express 应用程序部署到 Heroku?我可以提交我的构建目录,但这确实不是正确的方法。
  2. 为什么反应脚本正在消失,我必须多次运行npm install.
4

8 回答 8

35

@johnnycon -

这正是问题所在,我在这个github 问题帖子中收到了Mars的答案:

@philjoseph,react-scripts(默认情况下)是 CRA 应用程序的 devDependency,但 Heroku Node buildpack 的环境 NODE_ENV=production 会导致 npm install 跳过 devDeps。

要安装这些 devDeps:

npm install --only=dev && npm install && npm run build

他还指出了这个优秀的回购:https ://github.com/mars/heroku-cra-node

我跟着这个,它就像一个魅力:)

于 2017-03-14T22:13:06.923 回答
16

由于您在开发和生产中都需要“react-scripts”,您可以简单地将“react-scripts”:“1.0.16”从“devDependencies”移动“dependencies”,因此heroku不会忽略它。

于 2017-11-07T12:51:14.670 回答
2

有一个非常简单的解决方案。在运行start脚本之前,Heroku 将运行一个build脚本,如果它在你的package.json.

"scripts": {
  "start": "node server.js",
  "build": "cd client/ && yarn install && yarn build"
}
于 2020-10-15T06:11:32.653 回答
2

对于 2021 年的任何人,请遵循 Alexander Cherednichenko 非常简单的建议

说明:截至 2021 年 10 月,Create-React-App 的 react-script 包存在大量安全漏洞问题。我想有些人可能会遇到他们的“修复”,这表明将反应脚本移动到 devDependencies。如果您要部署到 Heroku,这将不起作用。将 react-scripts 移动到 devDependencies 将导致此错误,因为 Heroku 需要 react-scripts 来构建 React 应用程序。它在本地会很好,并且当你运行npm audit --productionyarn audit --production. 但最终,Heroku 将要求 react-scripts 位于常规依赖项部分。

投票率最高的答案提供了 Mars Hall(Heroku 的首席工程师)的一个很好的示例 repo,用于创建从节点后端提供服务的 react 应用程序。不过,如今,它也在 react-ui/package.json 文件的常规依赖项部分中包含了 react-scripts。此外,由于这些天 Create-React-App 默认为 Yarn,添加npm install --only=dev将不会运行或工作(我可以根据节点 buildpack 日志判断)。此外,它可能会添加您的应用程序在生产中绝对不需要的测试依赖项。

不幸的是,在 Create-React-App 决定进行一些更新之前,最好忽略 npm audit 带来的问题(至少是与 react-scripts 相关的问题)。由于 react-scripts 是一种构建工具,因此提出的任何漏洞都极不可能被利用。

PS这可能更适合作为Alexander Cherednichenko的回答下的评论,但我离能够这样做还差一个名声。

PPS 希望有人真的觉得这很有帮助!

于 2021-10-16T06:33:12.327 回答
1

我正在尝试完全相同的事情,将一个 create-react-app 项目部署到 heroku,并且得到了react-scripts not found something....

Heroku 将脚本读入package.json并且无法执行它们。

克服这个问题的关键是“创建/发布”“脚本”文件夹,默认情况下 create-react-app不会创建它,只是为了保持简单。

因此,通过运行eject命令$npm run ejectscripts它创建的文件夹与文件夹一样长config

之后,您可以再次执行 heroku 脚本,例如$ git push heroku master ,希望它将在 Heroku 上部署所有内容。

有关create-react-app 文档中eject脚本的更多信息

希望这有帮助,祝你好运。

于 2018-05-25T08:27:54.983 回答
1

react-scripts 是在 package.json 中声明为 devDependency 还是常规依赖项?由于您在 Heroku 上构建并且 heroku 正在将 env 变量读取为生产环境(我在这里假设),因此它不会安装 react-scripts。尝试将 react-scripts 作为常规依赖项移动,然后重试。

对于其他云提供商,我可能不会走这条路,但对于 Heroku,这是我发现阻力最小的路。本文更详细地介绍了您的方案。 https://originmaster.com/running-create-react-app-and-express-crae-on-heroku-c39a39fe7851

于 2017-02-01T03:28:19.440 回答
1

您能分享一下您的 Package.json 文件脚本的外观吗?我昨天实际上部署到 Heroku,它似乎对我来说工作得很好。

也许您的依赖项未正确添加到您的 package.json 中。

这是我的脚本的外观(如果您没有任何 scss/less/sass,请忽略前 2 个脚本):

"scripts": {
"build-css": "node-sass src/ -o src/",
"watch-css": "npm run build-css && node-sass src/ -o src/ --watch --recursive",
"start": "npm run start:server",
"watch": "npm-run-all --parallel watch-css start:*",
"start:server": "node server/server.js",
"start:client": "react-scripts start",
"build": "npm run build-css && react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject",
"postinstall": "npm run build"}

在开发中运行以利用我运行的 Hotrealoding

npm run watch

而对于 PROD 我运行

npm run build

然后我部署到 Heroku。尝试在单独的终端窗口中检查 Heroku 的日志,以便检查部署有什么问题。

只需用于heroku logs显示日志的最后 100 行。

或实时跟踪日志:heroku logs -t.

于 2017-03-09T22:12:32.713 回答
0

指定节点环境 告诉heroku我们要使用什么版本的heroku。默认情况下,heroku 使用旧版本,这会使我们的应用程序崩溃。你有 2 个 package.json 文件,一个在客户端,另一个在 express 服务器端。在快速服务器端将其添加到 package.json

"engines": {
    "node": "12.9.1",
    "npm": "6.10.2" },

指定启动脚本

 Instruct heroku what command it should run to start up our server. Add this to the server side package.json 

“开始”:“节点 index.js”,

INSTALL HEROKU CLI

安装 Heroku Cli

Sudo apt-get update
curl https://cli-assets.heroku.com/install-ubuntu.sh | sh  or sudo snap install heroku

在 macOS 中

brew install heroku cli

默认情况下,heroku 使用基于 git 的部署过程或工作流。

Git init
Git add . 
Git commit -m “initial commit”

Heroku login
Heroku create nameOfTheApp

 https://git.heroku.com/nameOfTheApp.git

此链接是我们的部署目标。它是一个 git 存储库,我们可以将本地服务器推送到它。

Git remote add heroku https://git.heroku.com/nameOfTheApp.git

Git push heroku master
于 2019-12-24T05:15:06.937 回答