Progressive Web Apps (PWAs) are modern web applications that offer a native app-like experience, including offline capabilities, push notifications, and improved performance. In this blog post, we'll explore how to build a PWA using the MERN (MongoDB, Express, React, Node.js) stack.
Why Build a PWA?
- Offline Functionality: PWAs can work without an internet connection.
- Performance Boost: Faster load times with caching and service workers.
- Push Notifications: Engage users with timely updates.
- No App Store Hassle: Users can install PWAs directly from the browser.
Setting Up the MERN Stack
Before making our app a PWA, let’s set up a MERN stack application:
Backend (Node.js & Express)
- Initialize a Node.js project:
   mkdir mern-pwa && cd mern-pwa
   npm init -y
- Install dependencies:
   npm install express mongoose cors dotenv
- Create a simple Express server:
   const express = require('express');
   const mongoose = require('mongoose');
   require('dotenv').config();
   const app = express();
   app.use(express.json());
   mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
      .then(() => console.log('MongoDB connected'))
      .catch(err => console.error(err));
   app.get('/', (req, res) => res.send('API Running'));
   app.listen(5000, () => console.log('Server running on port 5000'));
Frontend (React)
- Create a React app:
   npx create-react-app client
   cd client
   npm install axios
- Connect the React app to the backend by adding a proxy in package.json:
   "proxy": "http://localhost:5000"
- Fetch data from the backend in App.js:
   import { useEffect, useState } from 'react';
   import axios from 'axios';
   function App() {
       const [message, setMessage] = useState('');
       useEffect(() => {
           axios.get('/')
               .then(res => setMessage(res.data))
               .catch(err => console.error(err));
       }, []);
       return <h1>{message}</h1>;
   }
   export default App;
Making the App a PWA
1. Register a Service Worker
Service workers enable offline functionality. Modify index.js:
   if ('serviceWorker' in navigator) {
       window.addEventListener('load', () => {
           navigator.serviceWorker.register('/service-worker.js')
               .then(reg => console.log('Service Worker registered:', reg))
               .catch(err => console.error('Service Worker registration failed:', err));
       });
   }
2. Create a Service Worker
Inside public/, create service-worker.js:
   const CACHE_NAME = 'pwa-cache-v1';
   const urlsToCache = [
       '/',
       '/index.html',
       '/static/js/bundle.js'
   ];
   self.addEventListener('install', event => {
       event.waitUntil(
           caches.open(CACHE_NAME)
               .then(cache => cache.addAll(urlsToCache))
       );
   });
   self.addEventListener('fetch', event => {
       event.respondWith(
           caches.match(event.request)
               .then(response => response || fetch(event.request))
       );
   });
3. Add a Web Manifest
Create public/manifest.json:
   {
       "short_name": "MERN PWA",
       "name": "MERN Stack PWA",
       "icons": [
           {
               "src": "icon.png",
               "type": "image/png",
               "sizes": "192x192"
           }
       ],
       "start_url": "/",
       "display": "standalone",
       "background_color": "#ffffff",
       "theme_color": "#000000"
   }
Reference the manifest in public/index.html:
   <link rel="manifest" href="/manifest.json">
4. Enable HTTPS (Optional for Local Development)
PWAs require HTTPS for service workers to function properly. For local testing, use:
   npm install -g serve
   serve -s build
Deploying the PWA
- Backend: Deploy the Node.js server on a platform like Heroku or Render.
- Frontend: Deploy the React app on Vercel, Netlify, or Firebase Hosting.
- Ensure the start_urlinmanifest.jsonmatches the deployed domain.
Conclusion
Building a PWA with the MERN stack enhances user experience by making web apps faster, installable, and accessible offline. By integrating service workers and a web manifest, your app can behave more like a native mobile application while still leveraging the power of web technologies.
Are you building a PWA? Let us know your experience in the comments below!
Support My Work ❤️
If you enjoy my content and find it valuable, consider supporting me by buying me a coffee. Your support helps me continue creating and sharing useful resources. Thank you!
Connect with Me 🌍
Let’s stay connected! You can follow me or reach out on these platforms:
🔹 YouTube – Tutorials, insights & tech content
🔹 LinkedIn – Professional updates & networking
🔹 GitHub – My open-source projects & contributions
🔹 Instagram – Behind-the-scenes & personal updates
🔹 X (formerly Twitter) – Quick thoughts & tech discussions  
I’d love to hear from you—whether it’s feedback, collaboration ideas, or just a friendly hello!
Disclaimer
This content has been generated with the assistance of AI. While I strive for accuracy and quality, please verify critical information independently.
 

 
    
Top comments (0)