How to Build a Modern Web Application (A Step-by-Step Guide for Beginners)

RustcodeWeb
5 min readMay 26, 2024

--

Photo by Sincerely Media on Unsplash

Building a modern web application can seem like a daunting task, especially if you’re just starting out. However, with the right guidance and tools, you can create a powerful, responsive, and visually appealing web app. This article will walk you through the process step-by-step, covering everything from setting up your development environment to deploying your application.

1. Introduction

Modern web applications are dynamic, responsive, and feature-rich. They leverage the latest technologies and frameworks to provide a seamless user experience. In this guide, we will build a simple web application using React for the frontend, Node.js for the backend, and MongoDB for the database.

2. Setting Up Your Development Environment

Before we start coding, we need to set up our development environment.

A) Prerequisites

Node.js: Install Node.js from nodejs.org.
Code Editor: Use a code editor like Visual Studio Code (VS Code).

B) Installing Node.js and npm

Node.js comes with npm (Node Package Manager). To check if they are installed, run:

node -v
npm -v

C) Installing Create React App

Create React App is a tool that sets up a new React project with a sensible default configuration.

npx create-react-app my-app
cd my-app
npm start

This will start a development server and open your new React app in the browser.

3. Planning Your Application

Planning is crucial for a successful web application. Define the purpose of your app, its features, and the user interface.

Example Application

Let’s build a simple To-Do List application. Features include:

  • Adding tasks
  • Marking tasks as complete
  • Deleting tasks

4. Creating the Frontend

React is a popular library for building user interfaces. We’ll use it to create our frontend.

A) Setting Up React Components

In the src folder, create a new folder called components. Inside, create TodoList.js, TodoItem.js, and AddTodo.js.

B) TodoList.js

This component will display the list of tasks.

import React, { useState } from 'react';
import TodoItem from './TodoItem';
import AddTodo from './AddTodo';

const TodoList = () => {
const [todos, setTodos] = useState([]);

const addTodo = (task) => {
setTodos([...todos, { task, completed: false }]);
};

const toggleTodo = (index) => {
const newTodos = [...todos];
newTodos[index].completed = !newTodos[index].completed;
setTodos(newTodos);
};

const deleteTodo = (index) => {
const newTodos = [...todos];
newTodos.splice(index, 1);
setTodos(newTodos);
};

return (
<div>
<h1>Todo List</h1>
<AddTodo addTodo={addTodo} />
{todos.map((todo, index) => (
<TodoItem
key={index}
index={index}
todo={todo}
toggleTodo={toggleTodo}
deleteTodo={deleteTodo}
/>
))}
</div>
);
};

export default TodoList;

C) TodoItem.js

This component will display individual tasks.

import React from 'react';

const TodoItem = ({ todo, index, toggleTodo, deleteTodo }) => {
return (
<div style={{ textDecoration: todo.completed ? 'line-through' : '' }}>
{todo.task}
<button onClick={() => toggleTodo(index)}>Complete</button>
<button onClick={() => deleteTodo(index)}>Delete</button>
</div>
);
};

export default TodoItem;

D) AddTodo.js

This component will handle adding new tasks.

import React, { useState } from 'react';

const AddTodo = ({ addTodo }) => {
const [task, setTask] = useState('');

const handleSubmit = (e) => {
e.preventDefault();
if (!task) return;
addTodo(task);
setTask('');
};

return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={task}
onChange={(e) => setTask(e.target.value)}
/>
<button type="submit">Add</button>
</form>
);
};

export default AddTodo;

5. Building the Backend

For the backend, we’ll use Node.js and Express to create a simple API. MongoDB will serve as our database.

A) Setting Up Express

Create a new folder for the backend and initialize a new Node.js project.

mkdir backend
cd backend
npm init -y
npm install express mongoose cors

B) Creating the Server

Create a server.js file in the backend folder.

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');

const app = express();
app.use(cors());
app.use(express.json());

mongoose.connect('mongodb://localhost:27017/todo', {
useNewUrlParser: true,
useUnifiedTopology: true,
});

const TodoSchema = new mongoose.Schema({
task: String,
completed: Boolean,
});

const Todo = mongoose.model('Todo', TodoSchema);

app.get('/todos', async (req, res) => {
const todos = await Todo.find();
res.json(todos);
});

app.post('/todos', async (req, res) => {
const todo = new Todo({
task: req.body.task,
completed: false,
});
await todo.save();
res.json(todo);
});

app.put('/todos/:id', async (req, res) => {
const todo = await Todo.findById(req.params.id);
todo.completed = !todo.completed;
await todo.save();
res.json(todo);
});

app.delete('/todos/:id', async (req, res) => {
await Todo.findByIdAndDelete(req.params.id);
res.json({ message: 'Todo deleted' });
});

app.listen(5000, () => {
console.log('Server is running on port 5000');
});

6. Connecting Frontend and Backend

To connect the frontend to the backend, we need to make HTTP requests from React to our Express server.

A) Using Axios for HTTP Requests

Install Axios in the frontend project:

npm install axios

B) Modifying TodoList.js

Update TodoList.js to fetch tasks from the backend.

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import TodoItem from './TodoItem';
import AddTodo from './AddTodo';

const TodoList = () => {
const [todos, setTodos] = useState([]);

useEffect(() => {
axios.get('http://localhost:5000/todos').then((response) => {
setTodos(response.data);
});
}, []);

const addTodo = (task) => {
axios.post('http://localhost:5000/todos', { task }).then((response) => {
setTodos([...todos, response.data]);
});
};

const toggleTodo = (index) => {
const todo = todos[index];
axios.put(`http://localhost:5000/todos/${todo._id}`).then((response) => {
const newTodos = [...todos];
newTodos[index] = response.data;
setTodos(newTodos);
});
};

const deleteTodo = (index) => {
const todo = todos[index];
axios.delete(`http://localhost:5000/todos/${todo._id}`).then(() => {
const newTodos = [...todos];
newTodos.splice(index, 1);
setTodos(newTodos);
});
};

return (
<div>
<h1>Todo List</h1>
<AddTodo addTodo={addTodo} />
{todos.map((todo, index) => (
<TodoItem
key={index}
index={index}
todo={todo}
toggleTodo={toggleTodo}
deleteTodo={deleteTodo}
/>
))}
</div>
);
};

export default TodoList;

7. Testing Your Application

Testing is a crucial step to ensure your application works as expected.

A) Manual Testing

Functionality: Verify that adding, completing, and deleting tasks work correctly.
UI/UX: Ensure the user interface is responsive and user-friendly.

B) Automated Testing

Consider adding unit tests using frameworks like Jest for React and Mocha for Node.js.

8. Deploying Your Web Application

Once your application is tested and ready, it’s time to deploy.

Frontend Deployment: Use services like Netlify or Vercel for easy React app deployment.

Backend Deployment Deploy the backend using services like Heroku or DigitalOcean.

9. Conclusion

Building a modern web application involves several steps, from setting up your development environment to deploying your app. By following this guide, you should have a functional To-Do List application that demonstrates the fundamental aspects of web development.

Remember, the key to mastering web development is practice and continuous learning. Explore more features, experiment with different technologies, and keep building!

Further Reading:

By diving deeper into these resources, you can expand your knowledge and tackle more complex web development projects. Happy coding!

Originally published at https://www.rustcodeweb.com on May 26, 2024.

--

--