Precauzione nella cache con Workbox

La pre-memorizzazione nella cache è una delle operazioni più comuni in un service worker e Workbox offre molta flessibilità nel modo in cui puoi svolgere questa importante attività, indipendentemente da quale strumenti di creazione di Workbox scegli. In questa guida imparerai a pre-memorizzare nella cache gli asset utilizzando sia generateSW che injectManifest e quali di questi metodi potrebbero essere più adatti al tuo progetto.

Precauzione nella cache con generateSW

generateSW è il modo più semplice per pre-memorizzare nella cache le risorse in Workbox. La cosa più importante da ricordare su generateSW è che non stai scrivendo il tuo service worker, stai chiedendo a Workbox di generarne uno per te. Tuttavia, puoi influenzare il suo comportamento tramite una serie di opzioni di configurazione.

Per impostazione predefinita, generateSW svolge azioni diverse a seconda dello strumento di creazione utilizzato. Quando utilizzi workbox-webpack-plugin, non è necessario specificare alcuna opzione di configurazione. Per impostazione predefinita, il plug-in memorizza nella cache tutto ciò che include webpack nel suo grafico delle dipendenze e scrive un service worker denominato service-worker.js nella directory specificata da output.path

Se invece utilizzi workbox-build o workbox-cli, per impostazione predefinita verranno pre-memorizzati nella cache solo gli asset HTML, CSS e JavaScript letti dal file system locale. A livello di configurazione, devi specificare swDest e l'opzione globDirectory in generateSW config affinché la pre-memorizzazione funzioni. È probabile che tu voglia configurare opzioni aggiuntive che influiscono sul comportamento del service worker, quindi dai un'occhiata alla documentazione.

Precauzione nella cache con injectManifest

Utilizzare injectManifest non è facile come usare generateSW, ma devi rinunciare alla facilità d'uso per ottenere una maggiore flessibilità. Se generateSW gestisce per te l'intera generazione del service worker, injectManifest prende come origine un service worker che scrivi e inserisce un elenco di URL da pre-memorizzare nella cache, lasciando il resto del service worker così com'è.

Quando utilizzi injectManifest, sei responsabile di configurare la logica di precaricamento. Quando injectManifest esamina il service worker di input, cerca una variabile self.__WB_MANIFEST speciale e la sostituisce con il manifest di pre-cache. Se questa variabile non è presente, injectManifest restituirà un errore.

L'elenco delle voci nel file manifest di pre-cache può essere modificato con altre opzioni di configurazione.

Confronto affiancato

Fai clic su ciascuna delle schede seguenti per confrontare l'utilizzo dei metodi generateSW e injectManifest:

Poiché generateSW genera un service worker, devi solo specificare una configurazione. Di seguito è riportato un esempio in cui viene utilizzato workbox-build:

// build-sw.js
import {generateSW} from 'workbox-build';

generateSW({
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

Il service worker può quindi essere creato sulla riga di comando con Node:

node build-sw.js

Poiché injectManifest richiede un service worker di origine, un esempio minimamente attuabile richiede un file del service worker di origine. Se è sufficiente inserire nella cache, il service worker di input potrebbe essere simile al seguente:

import {precacheAndRoute} from 'workbox-precaching';

precacheAndRoute(self.__WB_MANIFEST);

Prendi nota della stringa self.__WB_MANIFEST. Si tratta di un segnaposto che Workbox sostituisce con il manifest di pre-cache. Di seguito è riportata una configurazione valida per questo caso d'uso:

// build-sw.js
import {injectManifest} from 'workbox-build';

injectManifest({
  swSrc: './src/sw.js',
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

injectManifest è preferibile se hai requisiti complessi, ad esempio routing avanzato, strategie di memorizzazione nella cache personalizzate o altri aspetti che non sono coperti dalle opzioni fornite da generateSW.

Conclusione

La pre-memorizzazione nella cache in Workbox è molto più semplice rispetto alla gestione autonoma della pre-memorizzazione nella cache, soprattutto nel caso in cui riguardi gli asset con controllo delle versioni compilati dai bundler. Tuttavia, la pre-memorizzazione nella cache non è l'unica cosa che farai probabilmente in un service worker. Mentre procedi, imparerai altre tecniche, come la memorizzazione nella cache di runtime.