Loading component...

Published on November 21, 2024Reading time: 6 min read

Creating a Progressive Web App Using Next.js

A guide to setting up your first progressive web app using Next.js

Loading component...

Related Articles

SitecoreAI

Sitecore Workflow Automation with Management API

A practical guide to managing Sitecore workflows programmatically using the Management GraphQL API with production-tested patterns.

November 20, 20251 min read
Blog Card Placeholder
Dev

How to Create a New Sitecore SXA Headless Site

SXA Headless is easy, awesome and powerful! Learn how to create your first Sitecore Headless Tenant & Site with SXA.

November 19, 20251 min read

Loading component...

Digital solutions

Learn how to maximize your investment in Sitecore by working with us.

AI solutions

Dominate your industry. Work with us to digitally transform your business.

Fishtank's proprietary project accelerator. Save time and money. Build what matters.

Utilities

Energy

Education

Healthcare

Manufacturing

Professional services

Financial services

Non-profits and associations

About FishtankThe PlaybookSitecore SnackContact us

Solutions

  • Digital solutions
  • AI solutions
  • TIDAL for XM Cloud

About

  • About Fishtank
  • The Playbook
  • Sitecore Snack
  • Contact us

Insights

Work

Industries

  • Utilities
  • Energy
  • Education
  • Healthcare
  • Manufacturing
  • Professional services
  • Financial services
  • Non-profits and associations

Start typing to search...

Creating a Progressive Web App Using Next.js

Progressive Web Apps (PWAs) have been gaining a ton of popularity as a strong choice of framework to build digital experiences. Due to its abilities of being accessed via a web browser and also providing users an app-like feel, developers prefer building a PWA to benefit from the numerous features it provides. Capabilities such as fast load times, offline access and seemless navigation such as push notifications. When these features get paired up with Next.js, a powerful React framework, developing a PWA becomes very efficient, thanks to Next.js’s support for server-side rendering, static site generation, and compatible PWA configuration.

In this blog post, I am going to go through the process of setting up a PWA app using Next.js. I will explore all the steps involved in detail to get you up and running with your first PWA project. If you are interested in getting an intro about PWA, check out the video below.

Why Next.js for PWAs

Next.js is a great choice for building PWAs. With features such as automatic code splitting, server-side rendering (SSR), static site generation (SSG) and API routes out of the box, it makes it an ideal choice for building high-performance PWAs.

With Next.js, you can easily add PWA features to your application such as:

  • Offline functionality
  • Push notifications
  • Optimized caching
  • And much more

Getting Started with a Next.js PWA

Lets begin by creating a next.js application and then add the support to make it a PWA. Follow the steps below in this order.

Step 1 - Create a New Next.js Project

Use the command line interface and run the following command:

npx create-next-app@latest your app name

For the example of this project, I am going to use Typescript so ensure to hit Yes to the following prompts when creating the app:

  • Typescript
  • ESLint
  • Tailwindcss
  • App router

Step 2 - Navigate to Your Project Directory

cd your-app-name

Step 3 - Install next-pwa Package

Installing the next-pwa package give access to a bunch of features that makes it easy to create PWAs on next.js. Features such as:

  • No config needed for registering and generating service worker
  • Optimize precache and runtime cache
  • Offline support
  • Manifest file generation

Install the package by entering the command:

npm install next-pwa

Step 4 - Configuring next-pwa

Next, we need to configure next-pwa in the Next.js project. If it doesn’t exist already, create a next.config.ts file in the project’s root directory. Here is how the code should look like:

import type { NextConfig } from "next";
import withPWA from 'next-pwa';

export default withPWA({ dest: "public", // destination directory for the PWA files disable: process.env.NODE_ENV === "development", // disable PWA in the development environment register: true, // register the PWA service worker skipWaiting: true, // skip waiting for service worker activation });

Using the next-pwa package, this code sets up your next.js application to benefit from the pwa capabilities. With these settings, next-pwa will automatically generate s service worker within the public directory.

Step 5 - Adding a manifest.json File

Creating a manifest.json file, in your public directory, is essential for PWAs. It defines the app details and metadata of your app. The file provides important app details such as app name, description, theme and background color, icons etc. Here is a snippet of what the manifest.json file should look like:

{
    "name": "Your app name",
    "short_name": "App shot name",
    "theme_color": "#00ff00",
    "background_color": "#ffffff",
    "display": "standalone",
    "orientation": "any",
    "scope": "/",
    "start_url": "/",
    "icons": [
      {
        "src": "/icon-192x192.png",
        "type": "image/png",
        "sizes": "192x192"
      },
      {
        "src": "/icon-256x256.png",
        "type": "image/png",
        "sizes": "256x256"
      },
      {
        "src": "/icon-512x512.png",
        "type": "image/png",
        "sizes": "512x512"
      }
    ]
  }

You would have notice the reference for several icon sizes in the code above. Icons are crucial for any PWA as they are used when the app is installed on any device. All icons, for different breakpoints and screen sizes, should be placed in the public directory.

Step 6 - Linking the Manifest File

The next step is to link the manifest.json file to be recognized and be considered by the app. To do this, open up the layout.tsx from src/app and adjust the metadata in the following way:

export const metadata: Metadata = {
  title: "Your app name",
  description: "Your app description",
  generator: "Next.js",
  manifest: "/manifest.json",
  keywords: ["nextjs", "next14", "pwa", "next-pwa"],
  themeColor: [{ media: "(prefers-color-scheme: dark)", color: "#fff" }],
  viewport:
    "minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no, viewport-fit=cover",
  icons: [
    { rel: "apple-touch-icon", url: "icon-192x192.png" },
    { rel: "icon", url: "icon-192x192.png" },
  ],
};

Step 7 - Build and Run PWA

At this point, you have finished configuring the code for PWA and are ready to test out your application. Start by building you next application by running the following command:

npm run build

As soon as the build process is complete and successful, you will see two new files created in your public directory:

  • sw.js: This is a service worker file which is used for caching, background synchronization, enabling offline support and more.
  • workbox-4754cb34.js: This file is used for asset caching. It improves the app’s performance by storing most commonly used assets locally without the need for repeated downloads.

You can now run the app locally by running the following command:

npm run dev

Visit http://localhost:3000/ on your browser and you would see the icon, as highlighted in the below screenshot, to download the app to your device. You can simply click the icon and install the app to your device. After installation, you can search and launch the app on your computer, similar to any other app.

Next.js localhost screen with getting started instructions and highlighted external link button in the browser toolbar.

Getting Started With PWAs in Next.js

The guide provided in this blog, is a basic setup to get you going with building your first PWA. Following these steps, you have setup a basic PWA app with features like caching, a service worker and generation of a manifest. This setup will further assist you in refining your PWA leveraging the other amazing features it provides. All these features, that PWA offers, combined with the capabilities of neext.js, will be a strong foundation to build and enhance the user experience and engagement that you are looking for in your product.

Solutions

  • Digital solutions
  • AI solutions

Brands

  • TIDAL for SitecoreAI
  • Sitecore Snack
  • The Playbook

Fishtank lore

  • Work
  • Insights
  • About us
  • Contact us

Industries

Utilities
Professional services
Energy
Financial services
Healthcare
Education
Non-profits and associations
Manufacturing
Utilities
Professional services
Energy
Financial services
Healthcare
Education
Non-profits and associations
Manufacturing

2025 @All Rights Reserved. Privacy Policy.

FISHTANK