In this article, I'll show you how to configure webpack-dev-server for proxying requests from React frontend to Node/Express backend.
Getting Started
I won't go into much details on how to set up React, Webpack and Babel. You can either create the project from scratch or you can do the following:
Configure Frontend
1- Use Create React App
Run create-react-app
to create React frontend for your web app.
npx create-react-app my-app-name
2- Configure Webpack
Add webpack and its relevant packages to your project.
yarn add webpack webpack-cli webpack-dev-server --dev yarn add html-webpack-plugin --dev
I'll be using yarn throughout this article
At the root of project folder, create file webpack.config.js
. I won't go into details of the configuration as its very basic.
const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { entry: { basicApp: { import: './src/index.js', filename: 'basicApp.js' } }, output: { path: path.resolve(__dirname, 'build/static') }, devServer: { port: 3000, hot: true, open: true, }, resolve: { extensions: ['.jsx', '.js', '.json'] }, module: { rules: [ { test: /\.(js)x?$/, exclude: /node_modules/, use: [ { loader: 'babel-loader' } ] }, { test: /\.css$/, use: ['style-loader', 'css-loader'] }, { test: /\.(?:ico|gif|png|jpg|jpeg)$/i, type: 'asset/resource' }, { test: /\.(woff(2)?|eot|ttf|otf|svg|)$/, type: 'asset/inline' } ] }, plugins: [ new HtmlWebpackPlugin({ template: './public/index.html' }) ] }
And make the following change in the package.json
:
"scripts": { "start": "webpack serve --mode development", "build": "webpack --mode production", ... }
3- Configure Babel
Now before you try to run the app, configure Babel compiler. Install babel and relevant packages.
yarn add @babel/core @babel/preset-env @babel/preset-react babel-loader --dev yarn add css-loader style-loader --dev
At root of project, create file .babelrc
:
{ "presets": [ "@babel/preset-env", [ "@babel/preset-react", { "runtime": "automatic" } ] ] }
You have successfully configured the frontend of your app.
Configure Backend
Add Express to the project:
yarn add express
It's your choice whether you set up the backend separately or in the same directory. I set it up in the same dir. Create file backend/server.js
at the root.
const express = require("express") const path = require("path") const app = express() const DIST_DIR = path.join(__dirname, 'build/static') const HTML_FILE = path.join(DIST_DIR, 'index.html') app.use(express.static(DIST_DIR)) app.get('/', (req, res) => { res.sendFile(HTML_FILE) }) app.get('/api/ping', (req, res) => { res.send('pong') }) app.listen(5000)
In dev mode of this set up, frontend runs at localhost:3000
and backend runs at localhost:5000
. Hence, you need to connect frontend to backend so that querying on locahost:3000/api/ping
hits the backend localhost:5000/api/ping
. For this you can configure proxy in webpack.config.js
:
devServer: { ... proxy: { '/api': { target: 'http://localhost:3000', router: () => 'http://localhost:5000', logLevel: 'debug' /*optional*/ } } }
Now any request of form /api/**
will be directed to port 5000
.
Run the project
To view output of ping API call, you can make small edit to App.js
:
import { useState } from "react"; import logo from "./logo.svg"; import "./App.css"; function App() { const [pingResponse, setPingResponse] = useState(""); const pingBackend = () => { fetch("/api/ping", { method: "GET", }) .then((response) => response.text().then(function (text) { setPingResponse(text); }) ) .catch((err) => console.log(err)); }; return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <button onClick={pingBackend}>Ping Backend</button> {pingResponse && <p>Backend Responded with '{pingResponse}'</p>} </header> </div> ); } export default App;
You can run the frontend and backend from two terminals. (Recommended: concurrently)
//in one terminal yarn start //in other terminal yarn build //optional node backend/server.js
We've successfully connected the frontend to backend. You can get the code from my GitHub.
sanamumtaz / react-webpack-backend-proxy
Configuring Webpack Dev Server to proxy request from React frontend to Node.js/Express backend.
Share your thoughts. Feedback's always welcome :)
Top comments (1)
Ping Pong