Progressive Web Apps with React

JavaScript Expert
March 18, 2025
Updated on March 21, 2025
0 MIN READ
#next-js#performance#serverless#deployment#progressive

Progressive Web Apps with React

Introduction

Progressive Web Apps (PWAs) have revolutionized the way we build web applications by combining the best of web and mobile experiences. PWAs are fast, reliable, and work offline—qualities that make them ideal for modern web development. React, with its component-based architecture and rich ecosystem, is a perfect fit for building PWAs.

In this post, we'll explore how to build a PWA using React, covering key concepts like service workers, caching strategies, and the Web App Manifest. We'll also provide practical code examples to help you implement these features in your projects.

What Makes a PWA?

A PWA is a web application that leverages modern web capabilities to deliver an app-like experience. The core characteristics of a PWA include:

  1. Reliability – Works offline or on low-quality networks using service workers.
  2. Performance – Loads quickly and responds to user interactions smoothly.
  3. Installability – Can be installed on a device's home screen via the Web App Manifest.
  4. Responsiveness – Adapts to any screen size (desktop, mobile, tablet).

React simplifies PWA development by providing tools like create-react-app (CRA), which includes built-in PWA support.

Setting Up a React PWA

To get started, we'll use create-react-app to scaffold a PWA-ready React application.

  1. Create a new React app with PWA support:
npx create-react-app my-pwa --template cra-template-pwa

This command generates a React app with a pre-configured service worker (service-worker.js) and a Web App Manifest (manifest.json).

  1. Register the Service Worker:

By default, CRA registers a service worker in index.js. Ensure the following line is uncommented:

// In src/index.js  
import * as serviceWorkerRegistration from './serviceWorkerRegistration';  
serviceWorkerRegistration.register();
  1. Configure the Web App Manifest:

The public/manifest.json file defines how your PWA appears when installed. Customize it with your app’s metadata:

{  
  "short_name": "My PWA",  
  "name": "My Progressive Web App",  
  "icons": [  
    {  
      "src": "/icons/icon-192x192.png",  
      "type": "image/png",  
      "sizes": "192x192"  
    },  
    {  
      "src": "/icons/icon-512x512.png",  
      "type": "image/png",  
      "sizes": "512x512"  
    }  
  ],  
  "start_url": "/",  
  "display": "standalone",  
  "theme_color": "#000000",  
  "background_color": "#ffffff"  
}

Implementing Offline Support with Service Workers

Service workers are the backbone of PWAs, enabling offline functionality and performance optimizations. CRA uses Workbox, a library for service worker management, under the hood.

Customizing the Service Worker

To customize caching strategies, modify the service-worker.js file in your public folder. For example, to cache API responses:

// In public/service-worker.js  
import { precacheAndRoute } from 'workbox-precaching';  
import { registerRoute } from 'workbox-routing';  
import { StaleWhileRevalidate } from 'workbox-strategies';  

// Precache static assets  
precacheAndRoute(self.__WB_MANIFEST);  

// Cache API responses with a stale-while-revalidate strategy  
registerRoute(  
  ({ url }) => url.pathname.startsWith('/api/'),  
  new StaleWhileRevalidate()  
);

Testing Offline Mode

  1. Build your app for production:
npm run build
  1. Serve the build folder locally:
npx serve -s build
  1. Open Chrome DevTools (F12), go to the Application tab, and check Offline mode to verify offline functionality.

Enhancing PWA Features

Adding Push Notifications

PWAs can send push notifications using the Push API. Here’s a basic implementation:

// Request notification permission const requestNotificationPermission = async () => { const permission = await Notification.requestPermission(); if (permission === 'granted') { console.log('Notification permission granted.'); } }; // Subscribe to push notifications const subscribeToPush = async () => { const swRegistration = await navigator.serviceWorker.ready; const subscription = await swRegistration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: 'YOUR_VAPID_PUBLIC_KEY' }); console.log('Push subscription:', subscription); };

Background Sync

Background Sync lets your PWA defer actions until the user has a stable connection.

// Register a sync event in the service worker  
self.addEventListener('sync', (event) => {  
  if (event.tag === 'sync-data') {  
    event.waitUntil(sendDataToServer());  
  }  
});

Conclusion

Building a PWA with React is straightforward thanks to tools like create-react-app and libraries like Workbox. By implementing service workers, caching strategies, and the Web App Manifest, you can create fast, reliable, and installable web applications that rival native apps.

To take your PWA further, explore features like push notifications, background sync, and IndexedDB for offline data storage. With React’s flexibility and the power of modern web APIs, the possibilities are endless.

Start building your React PWA today and deliver seamless experiences to your users—online or offline!

Share this article