如何使用 Node 后端创建 React 应用程序:完整指南

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列

React 前端与 Node 后端相配合,对于你想创建的任何应用程序来说都是一个坚如磐石的组合。

本指南旨在帮助你用 React 尽可能容易地创建一个全栈项目。让我们看看如何使用 React 和 Node 从头开始创建一个完整的项目,并将其部署到网络上。

你需要的工具

  • 确保 Node 和 NPM 已经安装在你的电脑上。你可以在这个网站下载这两样东西:nodejs.org(NPM 包含在你安装的 Node 中,不需要另外安装)。

  • 使用你选择的代码编辑器。我正在使用并且个人推荐使用 VSCode。你可以在这个网站下载 VSCode:code.visualstudio.com。

  • 确保你的电脑上安装了 Git。这对于用 Heroku 部署我们的应用程序是必要的。你可以在这个网站上下载:git-scm.com。

  • 一个在 heroku.com 的账号。我们将使用 Heroku 将应用程序完全免费地发布到网上。

第一步:创建你的 Node(Express)后端

首先为你的项目创建一个文件夹,命名为react-node-app(示例名称)。

然后,将该文件夹拖入你的代码编辑器。

为了创建我们的 Node 项目,在你的终端运行以下命令:

npm init -y

这将创建一个 package.json 文件,使我们能够跟踪所有的应用程序脚本,并管理我们的 Node 应用程序需要的任何依赖。

我们的服务器代码将放在一个同名的文件夹中:server。让我们来创建这个文件夹。

在这个文件夹中,我们将放置一个文件,从这个文件中运行服务。index.js

我们将使用 Express 创建一个简单的 Web 服务器,如果环境变量PORT没有给定值,则运行在 3001 端口(Heroku 将在我们部署应用程序时设置这个值)。

// server/index.jsconst express = require("express");const PORT = process.env.PORT || 3001;const app = express();app.listen(PORT, () => {console.log(`Server listening on ${PORT}`);
});

然后在我们的终端安装 Express 作为一个依赖项来使用它。

npm i express

之后,我们将在 package.json 中创建一个脚本,当我们用npm start运行它时,将启动我们的 Web 服务。

// server/package.json...
"scripts": {"start": "node server/index.js"
},
...

最后,我们可以通过在终端运行 npm start 来运行应用程序,我们应该看到它正在 3001 端口上运行。

npm start> node server/index.jsServer listening on 3001

第二步:创建一个 API

我们想把我们的 Node 和 Express 服务器作为一个 API,这样它就可以给 React 应用提供数据,改变这些数据,或者做一些其他只有服务才能做的操作。

在这个例子中,我们将简单地给 React 应用发送一个 JSON 对象中的 "Hello from server!"消息。

下面的代码为路由/api创建了一个 endpoint。

如果我们的 React 应用向该路由发出一个 GET 请求,我们就会用 JSON 数据进行响应(使用res,代表响应)。

// server/index.js
...app.get("/api", (req, res) => {res.json({ message: "Hello from server!" });
});app.listen(PORT, () => {console.log(`Server listening on ${PORT}`);
});

注意:请确保将其放在app.listen函数之前。

由于我们已经对 Node 代码进行了修改,我们需要重新启动服务器。

要做到这一点,在终端按 Command/Ctrl+C 结束你的启动脚本,然后再次运行npm start重新启动它。

为了测试这一点,我们可以简单地在浏览器中访问http://localhost:3001/api,看看我们获得的信息。

b914c95134b61636ed4f6478cc3b5e26.gif

第三步:创建 React 前端

在创建了后端之后,让我们转到前端。

打开另一个终端标签,使用 create-react-app 创建一个新的 React 项目,名称为client

npx create-react-app client

之后,我们将拥有一个安装了所有依赖项的 React 应用。

我们要做的唯一改变是在 package.json 文件中添加一个名为proxy的属性(client文件夹下的 package.json 文件)。

这将允许我们向 Node 服务器发出请求,而不必在每次向它发出网络请求时提供它所运行的原点(http://localhost:3001)。

// client/package.json...
"proxy": "http://localhost:3001",
...

然后我们可以通过运行它的启动脚本来启动 React 应用,这和我们的 Node 服务器一样。首先确保cd进入新创建的client文件夹。

之后,将在localhost:3000上启动(其实启动两个 Node 的进程,一个是 React 开发使用,一个是 Express 开发使用)。

cd client
npm startCompiled successfully!You can now view client in the browser.Local:            http://localhost:3000

f926150e7317a7285e50400b1d6c1094.gif

第四步:从 React 向 Node 发出 HTTP 请求

现在我们有了一个工作的 React 应用,我们想用它来与我们的 API 进行交互。

让我们看看如何从我们之前创建的/apiendpoint 获取数据。

要做到这一点,我们可以前往src文件夹中的App.js组件,使用useEffect进行 HTTP 请求。

我们将使用 Fetch API 向后端发出一个简单的 GET 请求,然后将我们的数据以 JSON 格式返回。

一旦我们得到了返回的数据,我们将得到消息属性(抓取从服务器发送的问候语),然后把它放在一个叫做data的状态变量中。

这将使我们能够在页面中显示该消息,如果我们有的话。我们在 JSX 中使用一个条件,如果数据还没有,就显示文本 Loading...

// client/src/App.jsimport React from "react";
import logo from "./logo.svg";
import "./App.css";function App() {const [data, setData] = React.useState(null);React.useEffect(() => {fetch("/api").then((res) => res.json()).then((data) => setData(data.message));}, []);return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p>{!data ? "Loading..." : data}</p></header></div>);
}export default App;

用 Heroku 将你的应用程序部署到网上

最后,让我们把应用程序部署到网络上。

首先,在我们的client文件夹中,确保删除由 create-react-app 自动初始化的 Git repo(rm -rf .git, .git 是隐藏文件夹,不能直接看到)。

这对部署我们的应用程序至关重要,因为我们要在项目的根文件夹(react-node-app)中建立 Git repo,而不是在client中。

cd client
rm -rf .git

当我们部署时,Node 后端和 React 前端都将在同一个域名(即 mycoolapp.herokuapp.com)提供服务。

我们看到请求是如何被 Node API 处理的,所以我们需要写一些代码,当我们的 React 应用被用户请求时(例如,当我们进入应用的主页时)显示 React 应用。

我们可以在server/index.js中加入以下代码来完成这个工作。

// server/index.js
const path = require('path');
const express = require('express');...// 让 Node 为我们创建的 React 应用提供文件
app.use(express.static(path.resolve(__dirname, '../client/build')));// 处理对/api 的 GET 请求
app.get("/api", (req, res) => {res.json({ message: "Hello from server!" });
});// 所有之前未被处理的 GET 请求将返回我们的 React app
app.get('*', (req, res) => {res.sendFile(path.resolve(__dirname, '../client/build', 'index.html'));
});

这段代码将首先允许 Node 使用express.static函数来访问我们创建的 React 项目的静态文件。

如果有一个 GET 请求进来,而这个请求没有被我们的/api路由处理后,我们的服务器将用 React 应用来响应。

这段代码允许我们的 React 和 Node 应用一起部署在同一个域名。

然后我们可以告诉 Node App 如何做,在我们的服务器 package.json 文件中添加一个build脚本,为生产创建我们的 React 应用。

// server/package.json...
"scripts": {"start": "node server/index.js","build": "cd client && npm install && npm run build"},
...

我还建议提供一个名为engines的字段,在这里你要指定你用来创建项目的 Node 版本。这将被用于部署。

你可以通过运行node -v来获得你的 Node 版本,你可以把结果放在engines中(例如14.15.4)。

// server/package.json"engines": {"node": "your-node-version"
}

在这之后,我们准备使用 Heroku 进行部署,所以请确保你在 Heroku.com 有一个账户。

当你登录并查看你的仪表板(dashboard),你将选择新建(New)>创建新的应用程序(Create New App),并提供一个唯一的应用程序名称。

sudo npm i -g heroku

当安装完毕,你将通过 CLI 使用heroku login命令登录到 Heroku。

heroku loginPress any key to login to Heroku

登录后,只需在 "Deploy "选项卡中为我们创建的应用程序遵循部署说明。

以下四个命令将为我们的项目初始化一个新的 Git repo,将我们的文件添加到其中,提交它们,并为 Heroku 添加一个 Git 远程。

git init
heroku git:remote -a insert-your-app-name-here
git add .
git commit -am "Deploy app to Heroku"

然后,最后一步是通过推送我们刚刚添加的 Heroku Git 远程地址(heroku git:remote -a insert-your-app-name-here),来发布我们的应用程序。

git push heroku master

恭喜!我们的全栈式 React 和 Node 应用已经上线。🎉

当你想对你的应用程序进行修改时(并进行部署),你只需要用 Git 来添加你的文件(git add),提交它们(git commit),然后推送到我们的 Heroku 远程(git push)。

git add .
git commit -m "my commit message"
git push heroku master

想用 React 创建像 YouTube 这样的真实世界的应用程序吗?以上就是方法。

在每个月的月底,我将发布一个独家课程,准确地告诉你如何复现从头到尾用 React 创建一个完整的应用程序。

想在下一个课程出现时得到通知吗?在这里加入等候名单。


原文链接:https://www.freecodecamp.org/news/how-to-create-a-react-app-with-a-node-backend-the-complete-guide/

作者:Reed Barger

译者:luojiyin

46d739a2b0c99f00981a7024702800cd.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,最近组织了源码共读活动,帮助3000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

6c8a363240abe01498925431ff71e04d.png

识别方二维码加我微信、拉你进源码共读

今日话题

略。分享、收藏、点赞、在看我的文章就是对我最大的支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业仪器仪表 界面设计_如何设计时尚的仪表板界面

工业仪器仪表 界面设计重点 (Top highlight)Welcome to the second step by step UI guide. Since you really liked my first article on “How to achieve Friendly, Lightweight UI”, I decided to make another one in a similar manner. Please note, that this is not a…

给3月要跳槽的前端提个醒!不了解微前端就别去面试了,不然……

在后端架构发展史上&#xff0c;如果要找一个低耦合高内聚架构模式的典范&#xff0c;微服务当仁不让。在互联网业务急速扩张的背景下&#xff0c;微服务架构解决了后端服务中的“重”&#xff0c;让每个服务都能够独立部署、独立扩展&#xff0c;每个服务都具有稳固的模块边界…

ui和ux的区别_UI和UX之间的区别

ui和ux的区别You’ve probably heard a lot of self-proclaimed “UX/UI” designers out there, the word “UI” thrown around endlessly at Apple keynotes, or tech startups saying “we need to fix the UX here and the UX there.”Ÿouve可能听说过很多自称“UX / UI”…

用JS轻松实现一个录音、录像、录屏工具库

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列前言最…

文本字段和表单设计-UI组件系列

重点 (Top highlight)Forms have existed for a significant amount of time, greatly simplifying the task of drafting complaints and various other legal pleadings. With the advance of information and its processing, means to gather the data are also evolving. …

WCF 第四章 绑定 netMsmqBinding

MSMQ 为使用队列创建分布式应用程序提供支持。WCF支持将MSMQ队列作为netMsmqBinding绑定的底层传输协议的通信。 netMsmqBinding绑定允许客户端直接把消息提交到一个队列中同时服务端从队列中读取消息。客户端和服务端之间没有直接通信过程&#xff1b;因此&#xff0c;通信本 …

React 18 RC 版本发布啦,生产环境用起来!

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列今天给…

阿拉伯语排版设计_针对说阿拉伯语的用户的测试和设计

阿拉伯语排版设计Let me start off with some data to put things into perspective “Why?”让我从一些数据入手&#xff0c;以透视“为什么&#xff1f;”的观点。 Arabic is the 5th most spoken language worldwide, with 420 million speakers, and is an official lang…

SVN:“SVN”不是内部命令,解决方法

1、安装完TortoiseSVN-1.6.16.21511-x64-svn-1.6.17.msi 2、在运行窗口cmd---svn&#xff0c;提示&#xff1a; “SVN” 不是内部命令 郁闷&#xff0c;小有纠结 解决方法&#xff1a;安装Slik-Subversion-1.6.17-x64.msi 命令行窗口关闭&#xff0c;再次打开命令行窗口&#x…

7个月,4000+人,500+源码笔记,诚邀你参加源码共读~

大家好&#xff0c;我是若川。按照从易到难的顺序&#xff0c;前面几期&#xff08;比如&#xff1a;validate-npm-package-name、axios工具函数&#xff09;很多都只需要花2-3小时就能看完&#xff0c;并写好笔记。但收获确实很大。开阔视野、查漏补缺、升职加薪。已经有400笔…

火焰和烟雾的训练图像数据集_游戏开发者是烟雾和镜子的大师

火焰和烟雾的训练图像数据集Video games are incredible. They transport us to new worlds, allow us to partake in otherwise impossible situations, and empower us in our every day lives. Games can make us feel like a part of something bigger than ourselves, per…

平衡树SPLAY

一个比线段树代码还要又臭又长的数据结构&#xff0c;各式各样的函数&#xff0c;咱也不知道别人怎么记住的&#xff0c;咱也不敢问 SPLAY的性质 1.某个节点的左子树全部小于此节点&#xff0c;右子树全部大于此节点 2.中序遍历splay输出的序列是按从小到大的顺序 &#xff08;…

为支持两个语言版本,我基于谷歌翻译API写了一款自动翻译的 webpack 插件

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列本文来…

全球 化 化_全球化设计

全球 化 化重点 (Top highlight)Designing for a global audience can feel daunting. Do you localize your product? Or, do you internationalize your product? And what does that even entail?为全球观众设计可能会令人生畏。 您是否将产品本地化&#xff1f; 还是您将…

springMVC_数据的处理过程

1、DispatcherServlet&#xff1a;作为前端控制器&#xff0c;负责分发客户的请求到 Controller 其在web.xml中的配置如下&#xff1a; <servlet><servlet-name>dispatcherServlert</servlet-name><servlet-class>org.springframework.web.servlet.Dis…

JavaScript 新增两个原始数据类型

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列JavaS…

axure低保真原型_如何在Google表格中创建低保真原型

axure低保真原型Google Sheets is a spreadsheet, just like Microsoft Excel.Google表格是一个电子表格&#xff0c;就像Microsoft Excel一样。 Most people associate it with calculating numbers. But Google Sheets is actually great for organizing your ideas, making…

Lerna 运行流程剖析

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列Lerna…

手动创建线程池 效果会更好_创建更好的,可访问的焦点效果

手动创建线程池 效果会更好Most browsers has their own default, outline style for the :focus psuedo-class.大多数浏览器对于&#xff1a;focus psuedo-class具有其默认的轮廓样式。 Chrome’s default outline styleChrome浏览器的默认轮廓样式 This outline style is cr…

eazy ui 复选框单选_UI备忘单:单选按钮,复选框和其他选择器

eazy ui 复选框单选重点 (Top highlight)Pick me! Pick me! No, pick me! In today’s cheat sheet we will be looking at selectors and how they differ. Unlike most of my other cheat sheets, this will focus on two components (radio buttons and checkboxes) side by…