# Build a Full-Stack React Application
# Create a simple todo app with Remult using a React frontend
In this tutorial, we are going to create a simple app to manage a task list. We'll use React
for the UI, Node.js
+ Express.js
for the API server, and Remult as our full-stack CRUD framework. For deployment to production, we'll use Heroku
and a PostgreSQL
database.
By the end of the tutorial, you should have a basic understanding of Remult and how to use it to accelerate and simplify full stack app development.
Prefer Angular?
Check out the Angular tutorial.
# Prerequisites
This tutorial assumes you are familiar with TypeScript
and React
.
Before you begin, make sure you have Node.js (opens new window) and git (opens new window) installed.
# Setup for the Tutorial
This tutorial requires setting up a React project, an API server project, and a few lines of code to add Remult.
You can either use a starter project to speed things up, or go through the step-by-step setup.
# Option 1: Clone the Starter Project
- Clone the react-vite-express-starter repository from GitHub and install its dependencies.
git clone https://github.com/remult/react-vite-express-starter.git remult-react-todo
cd remult-react-todo
npm install
- Open your IDE.
- Open a terminal and run the
dev
npm script.
npm run dev
The default "Vite + React" app main screen should be available at the default Vite dev server address http://127.0.0.1:5173 (opens new window).
At this point, our starter project is up and running. We are now ready to move to the next step of the tutorial and start creating the task list app.
# Option 2: Step-by-step Setup
# Create a React project using Vite
Create the new React project.
npm create -y vite@latest remult-react-todo -- --template react-ts
cd remult-react-todo
Run into issues scaffolding the Vite project?
See Vite documentation (opens new window) for help.
In this tutorial, we'll be using the root folder created by Vite
as the root folder for our server project as well.
# Install required packages
We need Express
to serve our app's API, and, of course, Remult
. For development, we'll use ts-node-dev (opens new window) to run the API server, and concurrently (opens new window) to run both API server and the React dev server from a single command.
npm i express remult
npm i --save-dev @types/express ts-node-dev concurrently
# Create the API server project
The starter API server TypeScript project contains a single module that initializes Express
, and begins listening for API requests.
Open your IDE.
In the root folder, create a TypeScript configuration file
tsconfig.server.json
for the server project.
tsconfig.server.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"emitDecoratorMetadata": true,
"esModuleInterop": true
}
}
Create a
server
folder under thesrc/
folder created by Vite.Create an
index.ts
file in thesrc/server/
folder with the following code:
src/server/index.ts
import express from 'express';
const app = express();
app.listen(3002, () => console.log("Server started"));
Important
Our server Node.js project is using the CommonJS module system.
Therefore, it is important to remove the "type": "module"
entry from the package.json
file created by Vite.
package.json
"type": "module", // <- remove this
Don't worry, this does not cause any side-effects.
# Bootstrap Remult in the back-end
Remult is loaded in the back-end as an Express middleware
.
- Create an
api.ts
file in thesrc/server/
folder with the following code:
src/server/api.ts
import { remultExpress } from 'remult/remult-express';
export const api = remultExpress();
- Add the highlighted code lines to register the middleware in the main server module
index.ts
.
src/server/index.ts
import express from 'express';
import { api } from './api';
const app = express();
app.use(api);
app.listen(3002, () => console.log("Server started"));
# Final tweaks
Our full stack starter project is almost ready. Let's complete these final configurations.
# Enable TypeScript decorators in the React app
Add the following entry to the compilerOptions
section of the tsconfig.json
file to enable the use of decorators in the React app.
tsconfig.json
"experimentalDecorators": true
# Proxy API requests from Vite dev server to the API server
The react app created in this tutorial is intended to be served from the same domain as its API.
However, for development, the API server will be listening on http://localhost:3002
, while the react app is served from the default http://localhost:5173
.
We'll use the proxy (opens new window) feature of Vite to divert all calls for http://localhost:5173/api
to our dev API server.
Configure the proxy by adding the following entry to the vite.config.ts
file:
vite.config.ts
//...
export default defineConfig({
plugins: [react()],
server: { proxy: { '/api': 'http://localhost:3002' } }
})
# Run the app
- Replace the
npm
script nameddev
to start the dev API server and the react dev server (vite), by replacing the following entry in thescripts
section ofpackage.json
.
package.json
"dev": "concurrently -k -n \"API,WEB\" -c \"bgBlue.bold,bgGreen.bold\" \"ts-node-dev -P tsconfig.server.json src/server/\" \"vite\""
- Open a terminal and start the app.
npm run dev
The server is now running and listening on port 3002. ts-node-dev
is watching for file changes and will restart the server when code changes are saved.
The default "Vite + React" app main screen should be available at the default Vite dev server address http://127.0.0.1:5173 (opens new window).
# Setup completed
At this point, our starter project is up and running. We are now ready to move to the next step of the tutorial and start creating the task list app.
Entities →