MEAN, MERN and MEVN

These stacks use JavaScript from the database to the browser: MongoDB stores JSON-like documents, Express handles HTTP routing, a front-end framework (Angular, React or Vue) renders the interface, and Node.js runs the server. One language and one data format (JSON) run through every layer. Current releases are Node.js 24 2,131 LTS, Express 5.2, React 19.3 7,897 , Angular 22 42,088 , Vue 3.5 5,482 and MongoDB 8 1,815 .

Request flow in a MERN application
Request flow in a MERN application
Installing Node.js 24 LTS with nvm on Linux or macOS and scaffolding a MERN projectShell
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.7/install.sh | bash
\. "$HOME/.nvm/nvm.sh"
nvm install 24                                     # Node.js 24 LTS with npm
mkdir notes && cd notes
npm init -y && npm pkg set type=module
npm install express mongoose
npm create vite@latest client -- --template react  # use --template vue for MEVN

On Windows, use the nodejs.org installer; for MEAN, create the client with npx @angular/cli new client. This API keeps notes in an array, so it runs before you install a database:

server.js: a JSON API that also serves the built React appJavaScript
import express from 'express';
const app = express();
const notes = [{ id: 1, text: 'Install Node.js 24 LTS' }];
app.use(express.json());                     // parse JSON request bodies
app.use(express.static('client/dist'));      // serve the built React app
app.get('/api/notes', (req, res) => res.json(notes));
app.post('/api/notes', (req, res) => {
  const note = { id: notes.length + 1, text: req.body.text };
  notes.push(note);
  res.status(201).json(note);
});
app.listen(3000, () => console.log('API listening on http://localhost:3000'));
Output
API listening on http://localhost:3000

In a second terminal, curl 3,008 localhost:3000/api/notes returns the notes as JSON, and a POST with a JSON body such as {"text":"Build the React client"} answers 201 Created with the new note.

To persist the notes, start MongoDB (for example docker run -d -p 27017:27017 mongo:8, or a free 512 MB M0 cluster on MongoDB Atlas), connect with await mongoose.connect('mongodb://127.0.0.1:27017/notes') and replace the array with a model: const Note = mongoose.model('Note', new mongoose.Schema({ text: String })), then await Note.find() and await Note.create({ text }) in the two routes. During development run npm 2,036 run dev inside client/ and add server: { proxy: { '/api': 'http://localhost:3000' } } to vite.config.js, so the React app on port 5173 reaches the API without CORS errors.

live-server, once a popular auto-reloading server, has not had a release since 2022. Vite 25,978 's dev server (Other Development Servers) reloads the browser on every save, and node --watch server.js restarts the API when its files change.