Aceasta este o întrebare foarte frecventă în rândul dezvoltatorilor React mai noi și o întrebare pe care am avut-o când începusem cu React și Node.js. În acest scurt exemplu vă voi arăta cum să faceți create-react-app lucrați cu Node.js și Express Back-end.

creați-reacționați-aplicație

Creați un proiect folosind create-react-app.

npx create-react-app example-create-react-app-express

Creeaza o /client director sub example-create-react-app-express director și mutați tot codul React boilerplate creat de create-react-app către acest nou director client.

cd example-create-react-app-expressmkdir client

Serverul Node Express

Creeaza o package.json fișier din directorul rădăcină (example-create-react-app-express) și copiați următorul conținut:

{
  "name": "example-create-react-app-express",
  "version": "1.0.0",
  "scripts": {
    "client": "cd client && yarn start",
    "server": "nodemon server.js",
    "dev": "concurrently --kill-others-on-fail "yarn server" "yarn client""
  },
  "dependencies": {
    "body-parser": "^1.18.3",
    "express": "^4.16.4"
  },
  "devDependencies": {
    "concurrently": "^4.0.1"
  }
}

Observați că îl folosesc concurrently pentru a rula aplicația React și Server în același timp. –kill-others-on-fail semnalizatorul va ucide alte procese dacă unul iese cu un cod de stare diferit de zero.

Instalare nodemon la nivel global și dependențe de server:

npm i nodemon -g
yarn

Creeaza o server.js fișier și copiați următorul conținut:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const port = process.env.PORT || 5000;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.get('/api/hello', (req, res) => {
  res.send({ express: 'Hello From Express' });
});

app.post('/api/world', (req, res) => {
  console.log(req.body);
  res.send(
    `I received your POST request. This is what you sent me: ${req.body.post}`,
  );
});

app.listen(port, () => console.log(`Listening on port ${port}`));

Acesta este un server Express simplu care va rula pe portul 5000 și are două rute API: GET/api/hello, și POST/api/world.

În acest moment puteți rula serverul Express cu următoarea comandă (încă în directorul rădăcină):

node server.js

Acum navigați la http://localhost:5000/api/hello, și veți obține următoarele:

Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node

Vom testa POST rută odată ce construim aplicația React.

Aplicația React

Acum treceți la client director în care trăiește aplicația noastră React.

Adăugați următoarea linie la package.json fișier creat de create-react-app.

"proxy": "http://localhost:5000/"

Cheia utilizării unui server back-end Express cu un proiect creat cu create-react-app este să folosiți un proxy. Acest lucru îi spune serverului de dezvoltare a pachetului Web să proxyze solicitările noastre API către serverul nostru API, dat fiind că serverul nostru Express rulează pe localhost:5000.

Acum modificați ./client/src/App.js pentru a apela back-end-ul nostru Express API, modificările sunt cu caractere aldine.

import React, { Component } from 'react';

import logo from './logo.svg';

import './App.css';

class App extends Component {
  state = {
    response: '',
    post: '',
    responseToPost: '',
  };
  
  componentDidMount() {
    this.callApi()
      .then(res => this.setState({ response: res.express }))
      .catch(err => console.log(err));
  }
  
  callApi = async () => {
    const response = await fetch('/api/hello');
    const body = await response.json();
    if (response.status !== 200) throw Error(body.message);
    
    return body;
  };
  
  handleSubmit = async e => {
    e.preventDefault();
    const response = await fetch('/api/world', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ post: this.state.post }),
    });
    const body = await response.text();
    
    this.setState({ responseToPost: body });
  };
  
render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
        <p>{this.state.response}</p>
        <form onSubmit={this.handleSubmit}>
          <p>
            <strong>Post to Server:</strong>
          </p>
          <input
            type="text"
            value={this.state.post}
            onChange={e => this.setState({ post: e.target.value })}
          />
          <button type="submit">Submit</button>
        </form>
        <p>{this.state.responseToPost}</p>
      </div>
    );
  }
}

export default App;

Noi creăm callApi metoda de a interacționa cu GET Rută Express Express, apoi numim această metodă în componentDidMount și, în cele din urmă, setați starea la răspunsul API, care va fi Bună ziua de la Express.

Observați că nu am folosit o adresă URL complet calificată http://localhost:5000/api/hello pentru a apela API-ul nostru, chiar dacă aplicația noastră React rulează pe un alt port (3000). Acest lucru se datorează proxy linie pe care am adăugat-o la package.json fișier mai devreme.

Avem un formular cu o singură intrare. La trimiterea apelurilor handleSubmit, care la rândul său ne numește POST Ruta Express Express salvează apoi răspunsul la stare și afișează un mesaj către utilizator: Am primit solicitarea dvs. POST. Iată ce mi-ai trimis: [message from input].

Acum deschis ./client/src/App.css și modificați .App-header clasa după cum urmează (modificări cu caractere aldine)

.App-header {
...
  min-height: 50%;
...
  padding-bottom: 10px;
}

Rularea aplicației

Dacă aveți în continuare serverul care rulează, continuați și opriți-l apăsând Ctrl + C în terminalul dvs.

Din directorul rădăcină al proiectului executați următoarele:

yarn dev

Aceasta va lansa aplicația React și va rula serverul în același timp.

Acum navigați la http://localhost:3000 și veți accesa aplicația React afișând mesajul care vine de la GET Traseu expres. Grozav ?!

1612147266 694 Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node
Se afișează ruta GET

Acum, tastați ceva în câmpul de introducere și trimiteți formularul, veți vedea răspunsul din POST Rută expresă afișată chiar sub câmpul de introducere.

Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node
Se apelează ruta POST

În cele din urmă, aruncați o privire la terminalul dvs., veți vedea mesajul pe care l-am trimis de la client, asta pentru că sunăm console.log asupra organismului de solicitare din POST Traseu expres.

1612147267 90 Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node
Nodul

Implementarea producției la Heroku

Deschis server.js și înlocuiți cu următorul conținut:

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');

const app = express();
const port = process.env.PORT || 5000;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// API calls
app.get('/api/hello', (req, res) => {
  res.send({ express: 'Hello From Express' });
});

app.post('/api/world', (req, res) => {
  console.log(req.body);
  res.send(
    `I received your POST request. This is what you sent me: ${req.body.post}`,
  );
});

if (process.env.NODE_ENV === 'production') {
  // Serve any static files
  app.use(express.static(path.join(__dirname, 'client/build')));
    
  // Handle React routing, return all requests to React app
  app.get('*', function(req, res) {
    res.sendFile(path.join(__dirname, 'client/build', 'index.html'));
  });
}

app.listen(port, () => console.log(`Listening on port ${port}`));

Deschis ./package.json și adăugați următoarele la scripts intrare

"start": "node server.js",
"heroku-postbuild": "cd client && npm install && npm install --only=dev --no-shrinkwrap && npm run build"

Heroku va rula start script în mod implicit și acest lucru va servi aplicația noastră. Apoi vrem să îi instruim lui Heroku să construiască aplicația noastră pentru clienți, o facem cu heroku-postbuild scenariu.

Acum, mergeți la Heroku și conectați-vă (sau deschideți un cont dacă nu aveți unul).

Creați o aplicație nouă și dați-i un nume

Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node
Creați o aplicație nouă pe Heroku

Faceți clic pe Implementați și urmați instrucțiunile de implementare (care cred că sunt destul de auto-explicative, nu are rost să le replicați aici?)

1612147267 698 Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node
Implementați o aplicație pe Heroku

Și asta este, vă puteți deschide aplicația făcând clic pe Deschide aplicatia butonul din colțul din dreapta sus al tabloului de bord Heroku pentru aplicația dvs.

Accesați aplicația implementată pentru acest tutorial: https://cra-express.herokuapp.com/

Alte opțiuni de implementare

Aici scriu despre alte opțiuni de implementare:

Structura proiectului

Aceasta va fi structura finală a proiectului.

1612147268 806 Cum sa faci sa creezi reactioneaza aplicatia sa functioneze cu un Node

Obțineți codul complet pe Depozitul GitHub.

Vă mulțumesc pentru lectură și sper că v-a plăcut. Orice întrebare, sugestie anunță-mă în comentariile de mai jos!

Poți să mă urmărești mai departe Stare de nervozitate, GitHub, Mediu, LinkedIn sau pe toate.

Această postare a fost inițial postată pe pagina mea personală site-ul blogului.


Actualizare 25.08.19: Am construit o aplicație web de rugăciune numită „Timpul meu liniștit – Un jurnal de rugăciune“. Dacă doriți să rămâneți în buclă, vă rugăm să vă înscrieți prin următorul link: http://b.link/mqt

Aplicația va fi lansată înainte de sfârșitul anului, am planuri mari pentru această aplicație. Pentru a vedea câteva capturi de ecran cu machete, urmați următorul link: http://pc.cd/Lpy7

DM-urile mele Stare de nervozitate sunt deschise dacă aveți întrebări cu privire la aplicație?