Best Practices for Building Progressive Web Apps (PWAs)

Build powerful Progressive Web Apps (PWAs) with best practices. Learn how to create fast, reliable, and engaging web applications that work offline.

Progressive Web Apps (PWAs) are becoming a popular choice for developers because they offer a seamless user experience across all devices. PWAs combine the best features of web and mobile apps, such as fast loading times, offline functionality, and the ability to install on the user’s home screen. They provide an engaging and reliable user experience, which can significantly boost user engagement and retention. In this article, we will discuss the best practices for building PWAs, ensuring they are efficient, user-friendly, and reliable.

Understanding Progressive Web Apps

PWAs are web applications that use modern web technologies to deliver an app-like experience on the web. They are built using standard web technologies like HTML, CSS, and JavaScript but are enhanced with features that make them behave like native apps.

What Are PWAs?

PWAs are web applications that use modern web technologies to deliver an app-like experience on the web. They are built using standard web technologies like HTML, CSS, and JavaScript but are enhanced with features that make them behave like native apps.

These features include offline support, push notifications, and the ability to install the app on the home screen.

Benefits of PWAs

PWAs offer numerous benefits for both users and developers. For users, they provide a fast and responsive experience, even on slow networks. They can be accessed offline and offer a smooth, app-like interaction.

For developers, PWAs are easier to build and maintain than native apps. They also offer a single codebase that works across all devices, reducing development and maintenance costs.

 

 

Building a PWA: Key Elements

Service workers are a core technology of PWAs. They are JavaScript files that run in the background and handle tasks such as caching, background sync, and push notifications.

Service Workers

Service workers are a core technology of PWAs. They are JavaScript files that run in the background and handle tasks such as caching, background sync, and push notifications.

Service workers enable PWAs to work offline by caching essential resources and providing a fallback when the network is unavailable. To implement a service worker, you need to register it in your application and define its behavior.

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker registered with scope:', registration.scope);
    })
    .catch(error => {
      console.error('Service Worker registration failed:', error);
    });
}

In this example, the service worker is registered, and its scope is logged to the console. If the registration fails, an error message is displayed.

App Shell Model

The app shell model is a design pattern for PWAs that separates the application shell (the user interface) from the content. The shell is cached and loaded quickly, providing an instant, reliable experience even if the network is slow or unavailable.

The content is then loaded and updated dynamically. This approach ensures that users have a fast and smooth experience, with minimal delays.

To implement the app shell model, cache the essential UI components in the service worker and load the dynamic content as needed. This can be done using the Cache API and Fetch API.

const cacheName = 'app-shell-v1';
const appShellFiles = [
  '/',
  '/index.html',
  '/styles.css',
  '/app.js'
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(cacheName)
      .then(cache => cache.addAll(appShellFiles))
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => response || fetch(event.request))
  );
});

In this example, the service worker caches the app shell files during the install event. During the fetch event, it serves the cached files or fetches them from the network if they are not in the cache.

 

 

Web App Manifest

The web app manifest is a JSON file that provides metadata about the PWA, such as the app name, icons, theme color, and start URL. It allows the app to be installed on the home screen and launched in full-screen mode, providing a native-like experience.

To create a web app manifest, include a manifest.json file in your project and reference it in the HTML.

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

In this example, the manifest file includes the app name, short name, start URL, display mode, background color, theme color, and icons. Reference the manifest in the HTML file:

<link rel="manifest" href="/manifest.json">

Enhancing User Experience

Ensuring that your PWA performs quickly and reliably is crucial for providing a good user experience. Slow-loading apps can frustrate users and lead to higher bounce rates.

Fast and Reliable Performance

Ensuring that your PWA performs quickly and reliably is crucial for providing a good user experience. Slow-loading apps can frustrate users and lead to higher bounce rates.

To optimize performance, focus on reducing the size of your JavaScript bundles, minimizing the number of HTTP requests, and leveraging browser caching. Tools like Webpack can help you bundle and minify your code, while lazy loading can defer the loading of non-essential resources until they are needed.

Using a Content Delivery Network (CDN) can also improve load times by serving your app’s static assets from locations closer to the user. For example, hosting images, scripts, and stylesheets on a CDN ensures that users can access these resources quickly, regardless of their geographical location.

Offline Functionality

One of the standout features of PWAs is their ability to work offline. By caching key resources using service workers, you can ensure that your app remains functional even when there is no internet connection. This is particularly important for users in areas with unreliable or limited connectivity.

 

 

To implement offline functionality, cache the essential resources your app needs to run, such as HTML, CSS, JavaScript, and key API responses. Provide fallback content or messages for features that require an active connection.

For instance, if your app includes a news feed, cache the most recent articles and display them when the user is offline.

const offlinePage = '/offline.html';

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(cacheName)
      .then(cache => cache.addAll([offlinePage]))
  );
});

self.addEventListener('fetch', event => {
  event.respondWith(
    fetch(event.request).catch(() => caches.match(offlinePage))
  );
});

In this example, the service worker caches an offline page during installation and serves it when a network request fails.

Push Notifications

Push notifications are a powerful way to engage users and keep them coming back to your PWA. They allow you to send timely updates and reminders directly to the user’s device, even when the app is not open.

To implement push notifications, you need to integrate with the Push API and a push service like Firebase Cloud Messaging (FCM).

First, request the user’s permission to send notifications:

Notification.requestPermission().then(permission => {
  if (permission === 'granted') {
    console.log('Notification permission granted.');
  } else {
    console.log('Notification permission denied.');
  }
});

Next, subscribe the user to push notifications and handle incoming messages:

navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: '<Your VAPID Key>'
  }).then(subscription => {
    console.log('User is subscribed:', subscription);
  }).catch(error => {
    console.error('Failed to subscribe the user:', error);
  });
});

self.addEventListener('push', event => {
  const data = event.data.json();
  const options = {
    body: data.body,
    icon: '/icons/icon-192x192.png'
  };
  event.waitUntil(
    self.registration.showNotification(data.title, options)
  );
});

Responsive Design

A key aspect of PWAs is their ability to provide a seamless experience across all devices. Responsive design ensures that your app looks and functions well on various screen sizes, from smartphones to desktops. Use flexible layouts, scalable images, and CSS media queries to create a responsive design.

For example, use a fluid grid layout that adjusts based on the screen size:

.container {
  display: grid;
  grid-template-columns: 1fr;
}

@media (min-width: 600px) {
  .container {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 900px) {
  .container {
    grid-template-columns: 1fr 1fr 1fr;
  }
}

This CSS example creates a grid layout that adjusts the number of columns based on the screen width, ensuring a consistent and optimized layout for different devices.

Accessibility

Making your PWA accessible ensures that it can be used by everyone, including people with disabilities. Follow accessibility best practices, such as using semantic HTML, providing alternative text for images, and ensuring sufficient color contrast.

Use ARIA (Accessible Rich Internet Applications) attributes to enhance the accessibility of dynamic content and interactive elements.

For example, use ARIA roles and properties to improve the accessibility of a modal dialog:

<div role="dialog" aria-labelledby="dialog-title" aria-describedby="dialog-description">
  <h1 id="dialog-title">Dialog Title</h1>
  <p id="dialog-description">This is the description of the dialog.</p>
  <button aria-label="Close">Close</button>
</div>

Ensuring Security

Security is a critical aspect of PWAs. Ensuring that your app is served over HTTPS is essential for protecting user data and building trust. HTTPS encrypts the data exchanged between the user and your server, preventing eavesdropping and tampering.

HTTPS and Secure Contexts

Security is a critical aspect of PWAs. Ensuring that your app is served over HTTPS is essential for protecting user data and building trust. HTTPS encrypts the data exchanged between the user and your server, preventing eavesdropping and tampering.

Most modern browsers require a secure context (HTTPS) for many PWA features, such as service workers and push notifications.

To implement HTTPS, obtain an SSL/TLS certificate from a trusted certificate authority (CA) and configure your web server to use it. Many hosting providers offer easy SSL/TLS setup, and services like Let’s Encrypt provide free certificates.

Once your site is secured with HTTPS, ensure that all resources, such as images and scripts, are also loaded over HTTPS to avoid mixed content issues.

Implementing Content Security Policy (CSP)

Content Security Policy (CSP) is a security feature that helps prevent cross-site scripting (XSS) attacks and other code injection attacks. CSP allows you to define which sources are trusted for loading resources such as scripts, styles, and images.

By implementing CSP, you can significantly reduce the risk of malicious code being executed on your site.

To implement CSP, add a Content-Security-Policy HTTP header to your server configuration or HTML document. Define the sources that are allowed to load resources. For example:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' https://trusted-cdn.com;">

In this example, the CSP policy allows resources to be loaded only from the same origin ('self') and from https://trusted-cdn.com.

Protecting Against Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery (CSRF) is an attack that tricks users into performing actions they did not intend to perform. To protect against CSRF attacks, use anti-CSRF tokens. These tokens are unique to each session and are included in forms and AJAX requests.

Cross-Site Request Forgery (CSRF) is an attack that tricks users into performing actions they did not intend to perform. To protect against CSRF attacks, use anti-CSRF tokens. These tokens are unique to each session and are included in forms and AJAX requests.

The server validates the token to ensure that the request is legitimate.

When implementing CSRF protection, generate a token on the server and include it in each form or request. For example, in a form:

<form action="/submit" method="POST">
  <input type="hidden" name="csrf_token" value="unique_token">
  <!-- other form fields -->
  <button type="submit">Submit</button>
</form>

On the server side, validate the CSRF token before processing the request.

Secure Storage of Data

When storing data on the client side, use secure storage mechanisms. Local storage and session storage are convenient but do not provide encryption. Instead, use the Web Cryptography API to encrypt sensitive data before storing it.

For example, to encrypt data using the Web Cryptography API:

const key = window.crypto.subtle.generateKey(
  {
    name: 'AES-GCM',
    length: 256
  },
  true,
  ['encrypt', 'decrypt']
);

const encryptedData = window.crypto.subtle.encrypt(
  {
    name: 'AES-GCM',
    iv: window.crypto.getRandomValues(new Uint8Array(12))
  },
  key,
  new TextEncoder().encode('Sensitive data')
);

Store the encrypted data and decryption key securely, and decrypt the data when needed.

Enhancing Engagement

Add to Home Screen (A2HS)

One of the defining features of PWAs is the ability to be installed on the user’s home screen, providing a native app-like experience. The Add to Home Screen (A2HS) feature prompts users to install the app, making it easily accessible.

To implement A2HS, ensure that your web app manifest is correctly configured and that the site is served over HTTPS.

Listen for the beforeinstallprompt event and prompt the user to install the app:

let deferredPrompt;

window.addEventListener('beforeinstallprompt', event => {
  event.preventDefault();
  deferredPrompt = event;
  // Show your custom install button
  document.getElementById('install-button').style.display = 'block';

  document.getElementById('install-button').addEventListener('click', () => {
    deferredPrompt.prompt();
    deferredPrompt.userChoice.then(choiceResult => {
      if (choiceResult.outcome === 'accepted') {
        console.log('User accepted the A2HS prompt');
      } else {
        console.log('User dismissed the A2HS prompt');
      }
      deferredPrompt = null;
    });
  });
});

Push Notifications for Re-engagement

Push notifications are a powerful tool for re-engaging users and keeping them informed about updates, new content, and other important information. Ensure that your push notifications are relevant, timely, and not too frequent to avoid annoying users.

To send push notifications, use a push service like Firebase Cloud Messaging (FCM). Implement push notifications by subscribing users and sending notifications from your server:

navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: '<Your VAPID Key>'
  }).then(subscription => {
    console.log('User is subscribed:', subscription);
    // Send subscription to your server
  }).catch(error => {
    console.error('Failed to subscribe the user:', error);
  });
});

self.addEventListener('push', event => {
  const data = event.data.json();
  const options = {
    body: data.body,
    icon: '/icons/icon-192x192.png'
  };
  event.waitUntil(
    self.registration.showNotification(data.title, options)
  );
});

Background Sync

Background sync allows your PWA to complete tasks in the background, even when the user is offline. This feature is useful for ensuring that data is synced and actions are completed when the user regains connectivity. To implement background sync, use the Background Sync API:

self.addEventListener('sync', event => {
  if (event.tag === 'sync-tag') {
    event.waitUntil(syncData());
  }
});

function syncData() {
  // Code to sync data
  return fetch('/sync-endpoint', {
    method: 'POST',
    body: JSON.stringify(data)
  });
}

Implementing Analytics and Monitoring

Importance of Analytics in PWAs

Analytics play a crucial role in understanding user behavior, tracking performance, and making informed decisions about improvements.

By integrating analytics into your PWA, you can gather valuable insights into how users interact with your app, which features are most popular, and where potential issues may arise.

Setting Up Google Analytics

Google Analytics is a powerful tool for tracking user interactions. To set up Google Analytics for your PWA, create an account and obtain a tracking ID. Then, add the tracking code to your PWA’s main HTML file.

<script async src="https://www.googletagmanager.com/gtag/js?id=YOUR_TRACKING_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'YOUR_TRACKING_ID');
</script>

This code initializes Google Analytics and starts tracking page views. For more detailed tracking, you can use events to monitor specific user actions, such as button clicks or form submissions.

document.getElementById('my-button').addEventListener('click', () => {
  gtag('event', 'button_click', {
    'event_category': 'User Interaction',
    'event_label': 'My Button'
  });
});

Performance Monitoring with Lighthouse

Lighthouse is an open-source tool that helps improve the quality of web pages, including PWAs. It provides audits for performance, accessibility, SEO, and more. To use Lighthouse, you can run it in Chrome DevTools, from the command line, or as a Node module.

To run Lighthouse in Chrome DevTools:

  1. Open your PWA in Chrome.
  2. Press Ctrl+Shift+I (or Cmd+Option+I on Mac) to open DevTools.
  3. Go to the “Lighthouse” tab.
  4. Click “Generate report.”

Lighthouse will analyze your PWA and provide a detailed report with scores and suggestions for improvement.

Error Tracking with Sentry

Sentry is a real-time error tracking tool that helps identify and fix errors in your PWA. To integrate Sentry, create an account and obtain a DSN (Data Source Name). Then, install the Sentry SDK and initialize it in your PWA.

npm install @sentry/browser
import * as Sentry from '@sentry/browser';

Sentry.init({ dsn: 'YOUR_SENTRY_DSN' });

Sentry will automatically capture and report errors, providing detailed information about the error, the affected users, and the stack trace. This allows you to quickly identify and resolve issues.

User Feedback

Collecting user feedback is essential for understanding user needs and improving your PWA. Implement feedback forms, surveys, or in-app messaging to gather user opinions and suggestions. Tools like Hotjar and Qualaroo can help you create and integrate feedback mechanisms into your PWA.

For example, you can add a simple feedback form to your PWA:

<form id="feedback-form">
  <label for="feedback">Your Feedback:</label>
  <textarea id="feedback" name="feedback"></textarea>
  <button type="submit">Submit</button>
</form>
document.getElementById('feedback-form').addEventListener('submit', event => {
  event.preventDefault();
  const feedback = document.getElementById('feedback').value;
  // Send feedback to your server
});

Best Practices for SEO in PWAs

Ensuring Crawlability

Search engines need to be able to crawl and index your PWA's content to include it in search results. Ensure that your app is accessible to search engines by using server-side rendering (SSR) or pre-rendering to generate static HTML for your pages.

Search engines need to be able to crawl and index your PWA’s content to include it in search results. Ensure that your app is accessible to search engines by using server-side rendering (SSR) or pre-rendering to generate static HTML for your pages.

This makes it easier for search engines to index your content, even if your app relies heavily on JavaScript.

Using Meta Tags

Meta tags provide search engines with information about your app, such as its title, description, and keywords. Include meta tags in the head of your HTML to help search engines understand and rank your content.

<meta name="description" content="Your app description">
<meta name="keywords" content="keyword1, keyword2, keyword3">
<meta name="robots" content="index, follow">

Structured Data

Structured data helps search engines understand the content of your PWA and display it more effectively in search results. Use JSON-LD (JavaScript Object Notation for Linked Data) to add structured data to your app.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebApplication",
  "name": "Your PWA",
  "url": "https://yourpwa.com",
  "description": "Description of your PWA",
  "author": {
    "@type": "Person",
    "name": "Your Name"
  }
}
</script>

Improving Page Speed

Page speed is a critical factor for both user experience and SEO. Optimize your PWA’s performance by reducing file sizes, minimizing HTTP requests, and leveraging browser caching. Tools like Google PageSpeed Insights can help you identify performance issues and provide recommendations for improvement.

Mobile-Friendliness

Since PWAs are designed to work seamlessly across all devices, ensuring mobile-friendliness is essential. Use responsive design techniques to create layouts that adapt to different screen sizes. Google’s Mobile-Friendly Test tool can help you assess your app’s mobile compatibility and identify areas for improvement.

Progressive Enhancement

Building for Core Functionality First

Progressive enhancement involves building your PWA to work with the most basic functionality first and then adding advanced features for more capable devices and browsers. This approach ensures that your app remains usable for all users, regardless of their device or browser capabilities.

Start by implementing the core functionality using standard HTML and CSS. Ensure that your app provides a basic but complete experience, even if JavaScript is disabled or not supported. Once the core functionality is in place, enhance your app with advanced features using JavaScript and modern web APIs.

Using Feature Detection

Feature detection allows you to check whether a browser supports a particular feature before using it. This ensures that your app can gracefully degrade or provide fallback functionality for unsupported features.

For example, use feature detection to check for service worker support:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker registered with scope:', registration.scope);
    })
    .catch(error => {
      console.error('Service Worker registration failed:', error);
    });
} else {
  console.log('Service Workers are not supported in this browser.');
}

Providing Fallback Content

When building advanced features, provide fallback content or functionality for users with less capable devices or browsers. For example, if your app uses WebGL for rendering graphics, provide a static image or a simplified version of the content for browsers that do not support WebGL.

Continuous Integration and Deployment

Automating the Build Process

Automating the build process is essential for ensuring that your PWA is always up-to-date and free of errors. Continuous integration (CI) systems like Jenkins, Travis CI, or GitHub Actions can help automate tasks such as running tests, linting code, and building your application.

By setting up a CI pipeline, you can catch issues early and ensure that every change to your codebase is thoroughly tested.

For example, using GitHub Actions, you can create a workflow to build and test your PWA:

name: CI

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm test

      - name: Build application
        run: npm run build

Continuous Deployment

Continuous deployment (CD) takes automation a step further by automatically deploying your PWA to a hosting service whenever changes are made to the codebase. This ensures that your users always have access to the latest version of your app. Popular CD services include Netlify, Vercel, and AWS Amplify.

For example, using Netlify, you can automatically deploy your PWA whenever changes are pushed to your Git repository. Simply connect your Git repository to Netlify, and it will handle the rest, including building and deploying your application.

Version Control and Rollbacks

Using version control systems like Git allows you to manage changes to your codebase effectively. In the event of a critical issue, version control enables you to quickly roll back to a previous, stable version of your PWA.

Implementing version control best practices, such as branching strategies and regular commits, can help maintain a clean and manageable codebase.

Monitoring and Alerts

Monitoring your PWA in production is crucial for maintaining performance and reliability. Tools like New Relic, Datadog, and Google Cloud Monitoring provide real-time insights into your app’s performance, including response times, error rates, and user interactions.

Set up alerts to notify you of any issues, such as increased error rates or slow response times, so you can address them promptly.

User-Centric Design

Understanding Your Audience

A user-centric design approach focuses on understanding and meeting the needs of your users. Conduct user research to gather insights into your target audience’s preferences, behaviors, and pain points.

Techniques such as surveys, interviews, and usability testing can help you gain a deeper understanding of your users and inform your design decisions.

For example, if your PWA targets young professionals, you might find that they prioritize speed and efficiency. This insight can guide you to design a streamlined interface that allows users to complete tasks quickly.

Creating Intuitive Navigation

Navigation is a critical aspect of user experience. Ensure that your PWA’s navigation is intuitive and easy to use. Use clear labels, logical grouping, and consistent navigation patterns to help users find what they need quickly. Implementing a search function can also enhance usability, especially for content-heavy PWAs.

For instance, a news app could feature a prominent search bar and categorize articles by topics like technology, sports, and entertainment. This helps users quickly locate articles of interest.

Designing for Touch Interactions

With the prevalence of mobile devices, designing for touch interactions is essential. Ensure that touch targets, such as buttons and links, are large enough to be easily tapped. Provide sufficient spacing between interactive elements to prevent accidental taps. Implement touch gestures, like swiping and pinching, to enhance the user experience.

For example, a photo gallery app could allow users to swipe between images and pinch to zoom in and out, providing a more interactive experience.

Providing Visual Feedback

Visual feedback helps users understand the result of their actions and improves the overall user experience. Use animations, transitions, and visual cues to provide feedback for interactions, such as button clicks, form submissions, and loading states.

For instance, display a loading spinner when fetching data and use animations to highlight successful form submissions. This reassures users that their actions are being processed and improves their confidence in your app.

Ensuring Accessibility

Accessibility ensures that your PWA can be used by everyone, including people with disabilities. Follow accessibility best practices, such as using semantic HTML, providing alt text for images, and ensuring sufficient color contrast. Conduct accessibility testing to identify and address potential issues.

For example, use screen reader testing tools to ensure that your app’s content is accessible to visually impaired users. Implement keyboard navigation to allow users to interact with your app without a mouse.

Staying Updated with Web Technologies

The web development landscape is constantly evolving, with new technologies, frameworks, and best practices emerging regularly. Stay updated by following industry blogs, attending conferences, and participating in online communities.

This helps you stay informed about the latest trends and techniques, ensuring that your PWA remains modern and competitive.

For example, regularly check resources like MDN Web Docs, CSS-Tricks, and Smashing Magazine for the latest articles and tutorials on web development.

Learning from Successful PWAs

Study successful PWAs to understand what makes them effective. Analyze their design, performance, and features to identify best practices and innovative approaches. Use these insights to inform your own PWA development and improve your app’s user experience.

For example, analyze popular PWAs like Twitter Lite, Pinterest, and Uber to understand how they optimize performance, provide offline functionality, and engage users.

Experimenting and Iterating

Web development is an iterative process. Continuously experiment with new ideas, test different approaches, and iterate based on user feedback and analytics. This allows you to refine your PWA and ensure that it meets the evolving needs of your users.

For instance, conduct A/B testing to compare different design elements, features, or user flows. Use the results to make data-driven decisions and improve your app.

Conclusion

Building Progressive Web Apps (PWAs) requires a thoughtful approach that combines the best of web and mobile app development. By focusing on key elements like service workers, the app shell model, and web app manifests, you can create PWAs that offer fast, reliable, and engaging experiences. Ensuring security, enhancing user engagement, and implementing analytics are crucial for maintaining a high-quality app. Additionally, adopting user-centric design principles and staying updated with the latest trends and best practices will help you build PWAs that meet user needs and stand out in a competitive landscape. Embrace these best practices to create Progressive Web Apps that deliver exceptional value and performance to your users.

Read Next: