如何使用 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.pswp.cn/news/274856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FP error code老是忘記的看這里:只給出最常用的幾個。

把常見的幾個記牢&#xff0c;不要在比賽時糾結。 錯誤2&#xff1a;輸入文件未找到。 錯誤106&#xff1a;數據讀入的格式錯誤&#xff0c;往往是讀入語句出錯。 錯誤200&#xff1a;被零除。 錯誤201&#xff1a;范圍檢查錯誤&#xff0c;數組越界。 錯誤202&#xff1a;棧溢…

快速求冪算法

1 #include <stdio.h>2 #include <math.h>3 //遞歸算法4 int recursion(int a,int b)5 {6 int tem 1;7 if(b0)return 1;8 else if(b1)return a;9 tem recursion(a,b>>1); 10 tem tem*tem; 11 if(b&1) tem tem * a; 12 r…

工業儀器儀表 界面設計_如何設計時尚的儀表板界面

工業儀器儀表 界面設計重點 (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…

linux ifconfig命令參數及用法詳解--linux查看配置網卡命令

ifconfig 是一個用來查看、配置、啟用或禁用網絡接口的工具&#xff0c;這個工具極為常用的。可以用這個工具來臨時性的配置網卡的IP地址、掩碼、廣播地址、網關等。也可以把 它寫入一個文件中&#xff08;比如/etc/rc.d/rc.local)&#xff0c;這樣系統引導后&#xff0c;會讀取…

給3月要跳槽的前端提個醒!不了解微前端就別去面試了,不然……

在后端架構發展史上&#xff0c;如果要找一個低耦合高內聚架構模式的典范&#xff0c;微服務當仁不讓。在互聯網業務急速擴張的背景下&#xff0c;微服務架構解決了后端服務中的“重”&#xff0c;讓每個服務都能夠獨立部署、獨立擴展&#xff0c;每個服務都具有穩固的模塊邊界…

調試 SharePoint 解決方案

調試 SharePoint 解決方案 可以使用 Visual Studio 調試器來調試 SharePoint 解決方案。 啟動調試后&#xff0c;Visual Studio 會將項目文件部署到 SharePoint Server&#xff0c;然后在Web 瀏覽器中打開 SharePoint 網站的一個實例。 以下各節說明如何在 Visual Studio 中調試…

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”…

給UIWebView增加搜索欄

在xib文件中拖入UIWebView。使用代碼為UIWebView的滾動控件增加搜索欄&#xff1a;UISearchBar* searchBar[[[UISearchBar alloc]initWithFrame:CGRectMake(0, -44, 320, 44)]autorelease];[self.browser.scrollView addSubview:searchBar];self.topBarsearchBar;[[self.browse…

用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…

CMMI簡介

CMMI&#xff08;Capability Maturity Model Integration&#xff09;即能力成熟度模型集成 什么是CMMI CMMI是CMM模型的最新版本。早期的CMMI&#xff08;CMMI-SE/SW/IPPD&#xff09;1.02版本是應用于軟件業項目的管理方法&#xff0c;SEI在部分國家和地區開始推廣和試用。隨…

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;…

POJ 2696 計算表達式的值

時間限制: 1000ms內存限制:65536kB描述有些語言中表達式的運算符使用字符串表示&#xff0c;例如用mul代表*&#xff0c;用div代表/&#xff0c;用add代表&#xff0c;用sub代表-&#xff0c;用mod代表%。輸入第一行為表達式的個數n。其余n行每行一個表達式&#xff0c;表達式由…

為支持兩個語言版本,我基于谷歌翻譯API寫了一款自動翻譯的 webpack 插件

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列本文來…