Progressive web applications (PWA) combine the features of both web and mobile applications—like normal web apps, they are accessible from multiple devices or platforms, and similar to mobile apps, they can be used without an internet connection and be integrated with other apps on that device. A PWA is still a web application that provides a platform-specific user experience built with the usual web technologies. PWAs provide a faster and more seamless user experience across multiple devices, primarily because they can be used offline like normal desktop applications.
The following points summarize some of the features of a PWA:
Like any other desktop or mobile application, they get their own icon and thus can be easily located and accessed.
They can keep running in the background and can even be used when the user is offline. Thus, if we were creating a chat app using the PWA architecture, it would still receive messages when the app wasn’t open or not actively being used.
PWAs provide their own seamless user interfaces.
They can integrate with the host device’s OS and access underlying hardware like a camera or software like the GPS.
We can distribute them via app stores similar to other desktop or mobile apps or install them directly from the web and launch them as a standalone app.
The following diagram shows a traditional website that can be visited through the browser and requires a stable internet connection. It also displays how PWAs operate. PWAs resemble platform-specific apps but are still native web applications. However, unlike web applications, they don’t require a browser UI to encapsulate their interfaces. The browser engine, like the one shown in the diagram below, runs and manages PWAs, but it still works in the background. For platform-specific applications, this is the task of the underlying operating system.
A PWA can have two types of architectures. They are described as follows:
Server-side rendering (SSR): A PWA with this architectural style is rendered on the web server and then delivered to the client. The initial load time for a web page is greatly reduced this way. Furthermore, we don’t have to worry about cross-browser incompatibility issues — all browsers are supported regardless of the type of JavaScript features implemented.
Client-side rendering (CSR): Any content is rendered in the client’s browser after being delivered by the web server. The server sends an empty page to the client where dynamic content is loaded by the browser JavaScript. Rendering after the initial load is faster. However, this heavily depends on the client’s support for the JavaScript features implemented.
The following shows a diagrammatic view of the differences between traditional and progressive web apps.
Whether the application implements SSR or CSR, any PWA has the following four essential components.
Service workers are an important part of a PWA and work in the background, in isolation from the browser, to handle all network requests and notifications. They speed up page loading by caching certain page assets. Caching allows PWAs to function in offline mode. Even if users are not using the app, they can receive push notifications via a service worker.
service-worker.js
The following is the service-worker.js
file that we’ll be using to handle caching and fetch requests.
import { precacheAndRoute } from 'workbox-precaching';// eslint-disable-next-line no-restricted-globalsprecacheAndRoute(self.__WB_MANIFEST);console.log("Educative's service worker");const educatives_cache = 'Educative PWA';const cache_urls = ['/', '/index.html', '/manifest.json',];// eslint-disable-next-line no-restricted-globalsself.addEventListener('install', event => {event.waitUntil(caches.open(educatives_cache).then(cache => cache.addAll(cache_urls)));});// eslint-disable-next-line no-restricted-globalsself.addEventListener('fetch', event => {event.respondWith(caches.match(event.request).then(response => {return response || fetch(event.request);}));});
The above code is a service worker file that handles caching resources and enables offline mode. We’ll add offline support to our web app by importing the precacheAndRoute
library. self.__WB_MANIFEST
contains a list of files that will be cached by the precacheAndRoute
method. The name of our cache is Educative PWA
, and the paths of all resources to be cached are contained in the cache_urls
list. Take a look at lines 9 to 13. An event listener is triggered against the install
event and caches all the resources specified in the cache_urls
upon installation. From lines 16 to 21, the second event listener handles all requests for accessing resources; any requested resource is brought from the cache. The resource is fetched from the network if not found. To register a service worker for enabling caching and offline mode, we’ll place serviceWorkerRegistration.register()
in our index.js
file.
The application shell is the basic HTML, CSS, and JavaScript—the backbone of any application. This is the first thing loaded when the app is launched. Like other resources, the application shell is placed in the cache for faster loads and offline access.
A web app manifest is a simple JSON file that contains configurations on how the app would look when downloaded on the client’s device. It contains specifications about the web applications and is added to the HTML page using the link
tag as shown below.
<link rel="manifest" href="manifest.json" />
The following is a sample manifest.json
file containing specifications for a PWA made in React. The name
is a mandatory key that can be specified at the root. It will store the name of the application to display to the user. short_name
is a shorter version of the web app’s name and is displayed when there is not enough space on the screen to display the full name. The icons
array is a way to represent the web app amongst other web applications using a specific icon. The image’s type
, size
, and src
properties are specified. The optional description
key contains a string displayed to the user on the popup window when they try to install the app. The screenshots
array is a list of images displayed in the popup window, with a description
of the app. We can have several screenshots depending on the type of devices the web app can be downloaded from; for example, a separate image has been used for a
view on a desktop. A smaller image size is required for smaller screen sizes like mobile devices. We can specify the type of viewport using the form_factor
key — wide
represents Desktops while narrow
represents mobile. The start_url
is the URL loaded on the app launch. In our case, it’s localhost:3000
. The id
key uniquely identifies the app. The display-override
key will contain all the possible screen displays to adopt for the app. It will override the value of the display
property. First, the display will have a value of standalone
, which means it will be shown on a different window outside the browser. The fallback chain for this app is standalone
, fullscreen
, and finally, minimal-ui
. In fullscreen
, the minimal-ui
is also a standalone app, but it lacks some UI elements.
{"short_name": "Educative PWA","name": "Educative PWA","icons": [{"src": "logo_react.png","type": "image/png","sizes": "512x512"}],"description" : "Welcome to a simple progressive web app made using ReactJS","screenshots": [{"src": "educative_progressive.png","sizes": "768x483","type": "image/png","form_factor": "wide","label": "Educative Progressive Web App"},{"src": "educative_mobile.png","sizes": "500x320","type": "image/png","form_factor": "narrow","label": "Educative Progressive Web App"}],"start_url": ".","id" : "/","display_override" : ["standalone", "fullscreen"],"display": "minimal-ui","theme_color": "#e6e6fa","background_color": "#ff97c0"}
Cache storage is mostly used in online applications to display frequently accessed content. Without retrieving the same content from the original server, a cache stores that data for quick retrieval. Instead of loading images and scripts on every page reload, cached data is accessed from the local cache, increasing performance. Moreover, it is also useful for implementing the offline mode for PWAs.
The following is a PWA made in React. Once the app is launched, you’ll see an install icon on the search bar to its right; once you click it, you can install and use the web application like a native desktop app. The steps to install the app are shown in the slides below.
Press the "Run" button to launch the application and experiment with the code.
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
Free Resources