Building a Progressive Web Application with Node.js

Progressive Web Applications (PWA) are web applications that offer the native-like experience of mobile applications, with the advantage of being built using web technologies like HTML, CSS, and JavaScript. Node.js, being a popular backend technology, provides a great platform for building PWAs. In this article, we will explore how to build a PWA with Node.js.

What is a PWA?

A PWA is a web application that uses modern web capabilities to provide an app-like experience to users. PWAs can be installed on a user’s home screen, send push notifications, and work offline. PWAs have become increasingly popular because they provide an immersive and engaging user experience without the need to download a native mobile application.

Building a PWA with Node.js

To build a PWA with Node.js, we need to use a few tools and libraries. Here are the steps to build a PWA with Node.js:

  1. Create a Node.js project using a package manager like npm or yarn.
  2. Install the following dependencies:
  • Express: a minimal and flexible web application framework that provides a set of features for building web applications.
  • Pug: a template engine that provides an elegant syntax for building HTML templates.
  • Compression: a middleware that compresses HTTP responses to reduce the size of files sent from the server.
  • Serve-favicon: a middleware that serves a favicon to web clients.
  • Helmet: a middleware that adds various security-related HTTP headers to the response.
npm install express pug compression serve-favicon helmet
  1. Create an index.js file that sets up the Express application.
const express = require('express');
const compression = require('compression');
const favicon = require('serve-favicon');
const helmet = require('helmet');
const path = require('path');

const app = express();

// Enable compression

// Serve favicon
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));

// Secure HTTP headers

// Set Pug as the view engine
app.set('view engine', 'pug');

// Serve static files
app.use(express.static(path.join(__dirname, 'public')));

// Route for the home page
app.get('/', (req, res) => {

// Start the server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server started on port ${PORT}`);
  1. Create a public directory that contains the static assets of the application, like CSS, JavaScript, and images.
  2. Create a manifest.json file that describes the PWA to the browser. The manifest file provides information about the name, icons, and start URL of the PWA.
  "name": "My PWA",
  "short_name": "My PWA",
  "icons": [
      "src": "/images/icon-192x192.png",
      "type": "image/png",
      "sizes": "192x192"
      "src": "/images/icon-512x512.png",
      "type": "image/png",
      "sizes": "512x512"
  "start_url": "/",
  "background_color": "#ffffff",
  "display": "standalone"
  1. Create a service-worker.js file that registers a service worker for the application. The service worker is a script that runs in the background and handles caching, push notifications, and other features of the PWA.
const CACHE_NAME = 'my-pwa-cache';
const urlsToCache = [

  7.In the index.js file, register the service worker by adding the following code:


if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
      .then(registration => {
        console.log('Service worker registered:', registration);
      .catch(error => {
        console.error('Service worker registration failed:', error);

    8.Finally, deploy the application to a server or a cloud platform like Heroku.


In this article, we learned how to build a Progressive Web Application with Node.js. We used Express to create a server, Pug to render HTML templates, and various middleware to enhance the security and performance of the application. We also created a manifest file and a service worker to enable app-like features like offline support and push notifications. With these tools and techniques, you can build powerful and engaging web applications that provide a seamless experience to your users.