This context provides a tutorial on how to develop and build a React application with NodeJS, including prerequisites, an example project, and steps for both development and production phases.
Abstract
The context discusses the process of developing and building a React application using NodeJS. It begins by explaining the role of NodeJS in loading React assets and handling API calls from the React UI app. The tutorial then outlines the prerequisites for following along, including NodeJS, Create React App, VSCode, and react-bootstrap. An example project is introduced, which demonstrates adding users, counting them, and displaying them on the side, with API calls to the NodeJS server for storage and retrieval.
The tutorial is divided into two phases: development and production. In the development phase, the React app runs on port 3000 with the help of a webpack dev server, while the NodeJS server runs on port 3080. The project structure is explained, with separate package.json files for the React app and NodeJS API. The NodeJS API uses express and nodemon, with two routes defined: /api/users and /api/user. The React UI calls the NodeJS API using a service file with two async functions that use the fetch API to make API calls.
In the production phase, the React app is built and loaded as static assets with the Node server. The server.js file is modified to include express.static and load index.html for the default route. The tutorial concludes by summarizing the steps taken and discussing the benefits of using NodeJS for building and shipping React apps.
Bullet points
The tutorial explains how to develop and build a React application using NodeJS.
NodeJS is used to load React assets and handle API calls from the React UI app.
Prerequisites for following along include NodeJS, Create React App, VSCode, and react-bootstrap.
An example project is introduced, which demonstrates adding users, counting them, and displaying them on the side, with API calls to the NodeJS server for storage and retrieval.
The tutorial is divided into two phases: development and production.
In the development phase, the React app runs on port 3000 with the help of a webpack dev server, while the NodeJS server runs on port 3080.
The project structure includes separate package.json files for the React app and NodeJS API.
The NodeJS API uses express and nodemon, with two routes defined: /api/users and /api/user.
The React UI calls the NodeJS API using a service file with two async functions that use the fetch API to make API calls.
In the production phase, the React app is built and loaded as static assets with the Node server.
The server.js file is modified to include express.static and load index.html for the default route.
The tutorial concludes by summarizing the steps taken and discussing the benefits of using NodeJS for building and shipping React apps.
How To Develop and Build React App With NodeJS
Learn How you develop and build with an example project
There are so many ways we can build React apps and ship for production. One way is to build the React app with NodeJS or Java and another way is to build the angular and serve that static content with NGINX web server. With NodeJS we have to deal with the server code as well, for example, you need to load index.html page with node.
In this post, we will see the details and implementation with the NodeJS. We will go through step by step with an example.
Introduction
Prerequisites
Example Project
Just Enough NodeJS For This Project
Development Phase
How To Build Project For Production
Summary
Conclusion
Introduction
React is a javascript library for building web apps and it doesn’t load itself in the browser. We need some kind of mechanism that loads the index.html (single page) of React application with all the dependencies(CSS and js files) in the browser. In this case, we are using node as the webserver which loads React assets and accepts any API calls from the React UI app.
React With NodeJS
If you look at the above diagram all the web requests without the /api will go to React routing and the React Router kicks in and loads components based on the path. All the paths that contain /api will be handled by the Node server itself.
In this post, we are going to develop the React app with NodeJS and see how to build for production.
Prerequisites
There are some prerequisites for this article. You need to have nodejs installed on your laptop and know-how http works. If you want to practice and run this on your laptop you need to have these on your machine.
This is a simple project which demonstrates developing and running React application with NodeJS. We have a simple app in which we can add users, count, and display them at the side, and retrieve them whenever you want.
Example Project
As you add users we are making an API call to the nodejs server to store them and get the same data from the server when we retrieve them. You can see network calls in the following video.
API network calls
Here is a Github link to this project. You can clone it and run it on your machine.
If you are new to NodeJS don’t worry this short description is enough to get you started with this project. If you are already aware of NodeJS, you can skip this section.
NodeJS is an asynchronous event-driven javascript runtime environment for server-side applications. The current version of the nodejs is 12 and you can install it from this link here. You can click on any LTS link and the NodeJS package is downloaded and you can install it on your laptop.
You can check the version of the Node with this command node -v. You can run javascript on the node REPL by typing the command node on the CLI.
Typing commands on REPL
The installation of a node is completed and you know how to run javascript. You can even run javascript files. For example, Let’s put the above commands in the sample.js file and run it with this command node sample.js.
Development Phase
Usually, the way you develop and the way you build and run in production are completely different. Thatswhy, I would like to define two phases: Development phase and Production phase.
In the development phase, we run the nodejs server and the React app on completely different ports. It’s easier and faster to develop that way. If you look at the following diagram the React app is running on port 3000 with the help of a webpack dev server and the nodejs server is running on port 3080.
Development Environment
Project Structure
Let’s understand the project structure for this project. We will have two package.json: one for the React and another for nodejs API. It’s always best practice to have completely different node_modules for each one. In this way, you won’t get merging issues or any other problems regarding web and server node modules collision.
Project Structure
If you look at the above project structure, all the React app resides under the my-app folder and nodejs API resides under the api folder. If you put NodeJS API at the root folder instead of in a separate folder you might have issues with the create-react-app picking up root node_modules.
NodeJS API
We use the express and nodemon on the server-side. Express is the Fast, unopinionated, minimalist web framework for NodeJS and nodemon is the library which makes your API reloads automatically whenever there is a change in the files. Let’s install these two dependencies. nodemon is only used for development so install this as a dev dependency.
We need to import express and define two routes: /api/users and /api/user and the server listening on the port 3080. Here is the server.js file. We use body-parser to handle data in the http request object.
You need to start the nodejs API with this command npm run devand the moment you change any file, it will be automatically updated. We are using nodemon to watch files.
nodemon in action
React UI
Now the nodejs API is running on port 3080. Now it’s time to look at the React UI. The entire React app is under the folder my-app. You can create with this command npx create-react-app my-appI am not going to put all the files here you can look at the entire files in the above Github link or here.
Let’s see some important files here. Here is the service file which calls node API. This is a service file with two async functions that use fetch API to make the API calls.
Here is the app component that calls this service and gets the data from the API. Once we get the data from the API we set the state accordingly and renders the appropriate components again to pass the data down the component tree. You can find other components here.
Interaction between React UI and Node API
In the development phase, the React app is running on port 3000 with the help of a create-react-app and nodejs API running on port 3080.
There should be some interaction between these two. We can proxy all the API calls to nodejs API. Create-react-app provides some inbuilt functionality and to tell the development server to proxy any unknown requests to your API server in development, add a proxy field to your package.json of the React. Have a look at the below package.json below. Remember you need to put this in the React UI package.json file.
With this in place, all the calls start with /api will be redirected to http://localhost:3080where the nodejs API running.
Once this is configured, you can run the React app on port 3000 and nodejs API on 3080 still make them work together.
// nodejs API (Terminal 1)
cd api (change itto API directory)
npm run dev
// React app (Terminal 2)
cd my-app (change itto app directory)
npm start
How To Build Project For Production
The React app runs on the port 3000 with the help of a create-react-app. This is not the case for running in production. We have to build the React project and load those static assets with the node server. Let’s see those step by step here.
First, we need to build the React project with this command npm run build and all the built assets will be put under the build folder.
npm run build
Second, we need to make some changes on the server-side. Here is the modified server.js file.
We need to import path that resolves . and .., and uses the appropriate file separator for any platform
We have to use express.static at line number 11 to let express know there are a build folder and assets of the React build.
Load index.html for the default route / at line number 26
Once you are done with the above changes, you can actually run the whole app with the nodejs server running on port 3080 like below as nodejs acts as a web server as well. At this time you don’t need to run create-react-app on port 3000. Every time you change anything on the react side you need to build the project again to reflect the changes.
running the whole app on port 3080
Summary
There are so many ways we can build React apps and ship for production.
One way is to build the React app with NodeJS.
In the development phase, we can run React UI and Nodejs on separate ports.
The interaction between these two happens with proxying all the calls to API.
In the production phase, you can build the React app and put all the assets in the build folder and load it with the node server.
Nodejs act as a web server as well in the above case. You need to let express know where are all the React build assets are.
We can package the application in a number of ways.
You can deploy the packaged zip folder in any node environment.
Conclusion
This is one way of building and shipping React apps. This is really useful when you want to do server-side rendering or you need to do some processing. NodeJS is non-blocking IO and it is very good for normal websites as well. In future posts, I will discuss more on deploying strategies for this kind of architecture.