
Next.js Pwas Redefine Web Apps In 2025
Build next.js pwas in 2025 for offline, app-like web experiences with top performance.

Next.js PWAs Redefine Web Apps in 2025
As of April 14, 2025, Progressive Web Apps (PWAs) are surging in popularity, blending web accessibility with native app vibes. Next.js 15 empowers developers to craft PWAs that work offline, load instantly, and feel seamless. This article unpacks how to build stellar Next.js PWAs, diving into setup, service workers, offline support, push notifications, performance tweaks, testing, deployment, and real-world use cases to lead the web in 2025.
Kickstart a PWA with Next.js
Launch your project with npx create-next-app@latest PwaApp
. Pick the App Router for 2025’s best PWA integration. Install TypeScript for robustness: npm install typescript @types/react @types/node
, and set tsconfig.json
with "jsx": "react-jsx"
. Add next-pwa
for PWA magic: npm install next-pwa
.
Configure in next.config.js
:
const withPWA = require('next-pwa')({
dest: 'public',
register: true,
skipWaiting: true,
});
module.exports = withPWA({
reactStrictMode: true,
});
This generates a service worker and manifest, setting the stage for offline-ready apps, a 2025 trend.
Enable Offline Support
Offline capability defines PWAs. The next-pwa
plugin creates sw.js
in public/.
Cache static assets in app/layout.js
:
export default function RootLayout({ children }) {
return (
<html lang="en">
<head>
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#000000" />
</head>
<body>{children}</body>
</html>
);
}
Create public/manifest.json
:
{
"name": "My PWA",
"short_name": "PWA",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#000000",
"icons": [
{
"src": "/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
In 2025, offline caching trends for e-commerce and news apps, ensuring users stay engaged without connectivity.
Add Push Notifications
Push notifications boost engagement. In app/api/push/route.js
, set up a subscription endpoint:
import webPush from 'web-push';
export async function POST(request) {
const subscription = await request.json();
await webPush.sendNotification(subscription, JSON.stringify({ title: 'New Update!' }));
return new Response('Subscribed', { status: 201 });
}
On the client, register in app/components/Notify.js
:
'use client';
import { useEffect } from 'react';
export default function Notify() {
useEffect(() => {
if ('serviceWorker' in navigator && 'PushManager' in window) {
navigator.serviceWorker.ready.then((registration) => {
registration.pushManager.subscribe({ userVisibleOnly: true }).then((subscription) => {
fetch('/api/push', {
method: 'POST',
body: JSON.stringify(subscription),
headers: { 'Content-Type': 'application/json' },
});
});
});
}
}, []);
return null;
}
In 2025, this trend reengages users with timely alerts, like order updates or breaking news.
Cache Dynamic Data
Dynamic content needs smart caching. Use React Server Components in app/page.js
:
async function fetchData() {
const res = await fetch('https://api.example.com', { next: { revalidate: 3600 } });
return res.json();
}
export default async function Page() {
const data = await fetchData();
return <div>{data.message}</div>;
}
Update next.config.js to cache API responses in the service worker:
const withPWA = require('next-pwa')({
dest: 'public',
runtimeCaching: [
{
urlPattern: /^https:\/\/api\.example\.com/,
handler: 'NetworkFirst',
options: { cacheName: 'api-cache', expiration: { maxEntries: 50 } },
},
],
});
module.exports = withPWA({});
This 2025 trend ensures dynamic PWAs stay fast, even offline, for feeds or dashboards.
Tune PWA Performance
Speed is PWA’s heart. Use next/image
for optimized assets:
import Image from 'next/image';
export default function Hero() {
return (
<Image
src="/hero.jpg"
alt="App hero"
width={1200}
height={600}
priority
sizes="100vw"
quality={75}
/>
);
}
Lazy-load non-critical components with next/dynamic
:
import dynamic from 'next/dynamic';
const HeavyFeature = dynamic(() => import('../components/HeavyFeature'), { ssr: false });
export default function Home() {
return <HeavyFeature />;
}
Profile with Lighthouse, aiming for a Performance Score above 90. In 2025, PWAs trend for sub-second loads, rivaling native apps.
Test PWA Features
Testing ensures reliability. Use Jest (npm install --save-dev jest) for service worker logic:
test('caches API data', async () => {
global.caches = { open: jest.fn(() => ({ put: jest.fn() })) };
const request = new Request('https://api.example.com');
const response = new Response(JSON.stringify({ message: 'test' }));
await cacheHandler(request, response);
expect(caches.open).toHaveBeenCalledWith('api-cache');
});
For e2e, Playwright (npm install --save-dev playwright
) verifies offline and notifications:
import { test, expect } from '@playwright/test';
test('loads offline', async ({ page }) => {
await page.goto('/');
await page.setOffline(true);
await page.reload();
await expect(page.getByText('test')).toBeVisible();
});
In 2025, this trend catches PWA bugs, ensuring seamless UX across conditions.
Deploy Your PWA
Deploy with Vercel: vercel deploy
. Set CACHE_CONTROL=max-age=31536000
for static assets in Vercel’s dashboard. For custom setups, use AWS Amplify with a Dockerfile
, serving via CloudFront for global reach.
Monitor with Sentry (npm install @sentry/nextjs
): Sentry.captureException(error)
for offline or push errors. In 2025, PWAs trend with install prompts, enabled via beforeinstallprompt
listeners, boosting user retention.
Shine in Real-World Use Cases
PWAs excel in practice. Build a news app with app/news/page.js
:
async function getNews() {
const res = await fetch('https://api.news.com', { next: { revalidate: 300 } });
return res.json();
}
export default async function News() {
const articles = await getNews();
return (
<ul>
{articles.map((item) => (
<li key={item.id}>{item.title}</li>
))}
</ul>
);
}
For e-commerce, cache cart data offline and sync with app/api/sync/route.js
. In 2025, PWAs redefine delivery apps and social platforms with installable, offline-ready flows.
Conclusion
Next.js PWAs redefine web apps in 2025 with app-like polish. With service workers, push notifications, and smart caching, you can lead the charge. Build with these strategies, test rigorously, and deploy to captivate users!