parcel-config-precache-manifest
Version:
A Parcel 2 plugin that generates a manifest for precaching assets
75 lines (61 loc) • 2.64 kB
Markdown
# 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