UNPKG

parcel-config-precache-manifest

Version:
75 lines (61 loc) 2.64 kB
# parcel-config-precache-manifest A Parcel 2 plugin that generates a manifest for precaching assets ## Usage In `.parcelrc`: ```json { "extends": ["@parcel/config-default", "parcel-config-precache-manifest"] } ``` This will inject a precache manifest similar to the following into all service workers: ```js self.__precacheManifest = [ { url: '/index.fe3a45.js', revision: 'fe3a45' }, { url: '/my-custom-icon.svg', revision: '3b68dc' }, ... ] ``` To use the manifest with [Workbox](https://developers.google.com/web/tools/workbox/), write the following in your service worker: ```js import workbox from 'workbox-sw'; workbox.precaching.precacheAndRoute(self.__precacheManifest); ``` To use the manifest manually and precache yourself: ```js const precacheVersion = self.__precacheManifest .map(p => p.revision) .join(''); const precacheFiles = self.__precacheManifest.map(p => p.url); self.addEventListener('install', ev => { // Do not finish installing until every file in the app has been cached ev.waitUntil( caches.open(precacheVersion).then( cache => cache.addAll(precacheFiles) ) ); }); // Optionally, to clear previous precaches, also use the following: self.addEventListener('activate', ev => { ev.waitUntil( caches.keys().then(keys => Promise.all( keys.filter(k => k !== precacheVersion).map( k => caches.delete(k) ) )) ); }); ``` Please note that this plugin supports *Parcel 2 only*. See [`parcel-plugin-precache-manifest`](https://npmjs.com/package/parcel-plugin-precache-manifest) for a plugin that supports Parcel 1. ## Why? Precaching is a fundamental part of any PWA. When offline, the browser cannot make any network requests, so every file crucial to your app must be stored in a persistent cache. However, it's impossible to know which files to cache during the `'install'` event without some sort of manifest, which is what this plugin allows you to generate. This plugin can be thought of as a port of [`workbox-webpack-plugin`'s `InjectManifest`](https://developers.google.com/web/tools/workbox/modules/workbox-webpack-plugin#injectmanifest) to Parcel. ## Advanced: Filters By default, service workers will not be precached, since they are automatically cached by the browser until a new service worker is discovered. To prevent the caching of a specific type of file (say all `.png` files), you can filter the items in `self.__precacheManifest` at the top of the service worker itself: ```js self.__precacheManifest = self.__precacheManifest.filter( item => !/\.png$/.test(item.url) ); // Rest of your service worker code ``` ## License MIT