Esegui la migrazione da sw-precache o sw-toolkit

Gli sviluppatori che hanno utilizzato in precedenza sw-precache e/o sw-toolbox hanno un percorso di upgrade semplice alla famiglia di librerie Workbox. L'upgrade a Workbox fornirà un'esperienza moderna ed estensibile con il servizio worker, con un debug e un'ergonomia dello sviluppatore migliorati.

Modifiche alla configurazione esistente

Se utilizzi sw-precache configurato con una delle seguenti opzioni, dovrai prendere in considerazione le modifiche seguenti durante la migrazione a Workbox.

Opzioni rinominate

Il parametro di configurazione dynamicUrlToDependencies è stato rinominato templatedURLs.

Il parametro di configurazione staticFileGlobs è stato rinominato globPatterns.

Il parametro di configurazione runtimeCaching accetta un insieme aggiornato di opzioni, corrispondenti ai nomi utilizzati nei moduli Workbox sottostanti. Per illustrare cosa è stato rinominato, questa configurazione sw-precache:

runtimeCaching: [{
  urlPattern: /api/,
  handler: 'fastest',
  options: {
    cache: {
      name: 'my-api-cache',
      maxEntries: 5,
      maxAgeSeconds: 60,
    },
  },
}],

è equivalente a questa configurazione di Workbox:

runtimeCaching: [{
  urlPattern: /api/,
  // 'fastest' is now 'StaleWhileRevalidate'
  handler: 'StaleWhileRevalidate',
  options: {
    // options.cache.name is now options.cacheName
    cacheName: 'my-api-cache',
    // options.cache is now options.expiration
    expiration: {
      maxEntries: 5,
      maxAgeSeconds: 60,
    },
  },
}],

Opzioni ritirate

I percorsi con caratteri jolly in stile Express non sono più supportati. Se utilizzavi percorsi con caratteri jolly in stile Express nella configurazione di runtimeCaching o direttamente in sw-toolbox, esegui la migrazione a un percorso con espressione regolare equivalente quando utilizzi Workbox.

Migrazioni sw-precache

Dall'interfaccia a riga di comando sw-precache a workbox-cli

Gli sviluppatori che utilizzano l'interfaccia a riga di comando sw-precache, eseguono il comando manualmente o nell'ambito di un processo di compilazione basato su npm scripts, troveranno il modulo workbox-cli il modo più semplice per eseguire la migrazione. L'installazione di workbox-cli ti consentirà di accedere a un file binario denominato workbox.

Sebbene l'interfaccia a riga di comando sw-precache supporti la configurazione tramite flag a riga di comando o un file di configurazione, l'interfaccia a riga di comando workbox richiede che tutte le opzioni di configurazione vengano fornite in un file di configurazione utilizzando CommonJS module.exports.

La CLI workbox supporta una serie di modalità diverse. (Utilizza workbox --help per visualizzarli tutti.) Tuttavia, la modalità più simile alla funzionalità di sw-precache è generateSW. Quindi una chiamata a

$ sw-precache --config='sw-precache-config.js'

può essere espresso come

$ workbox generateSW workbox-config.js

Dal modulo del nodo sw-precache al modulo del nodo workbox-build

Gli sviluppatori che utilizzano l'API node per sw-precache, nell'ambito di un flusso di lavoro gulp/Grunt o semplicemente all'interno di uno script di build node personalizzato, possono eseguire la migrazione passando al modulo workbox-build node.

La funzione generateSW() del modulo workbox-build corrisponde maggiormente alla funzione write() del modulo sw-precache. Una differenza fondamentale è che generateSW() restituisce sempre una promessa, mentre la vecchia funzione write() supportava sia un callback sia un'interfaccia basata su promesse.

Utilizzo di gulp in linea con

const swPrecache = require('sw-precache');
gulp.task('generate-service-worker', function () {
  return swPrecache.write('service-worker.js', {
    // Config options.
  });
});

può essere modificato in

const workboxBuild = require('workbox-build');
gulp.task('generate-service-worker', function () {
  return workboxBuild.generateSW({
    // Config options.
  });
});

Dal plug-in sw-precache-webpack al plug-in webpack di Workbox

Gli sviluppatori che utilizzano sw-precache-webpack-plugin come parte del processo di creazione del proprio webpack possono eseguire la migrazione passando alla classe GenerateSW all'interno del modulo workbox-webpack-plugin.

workbox-webpack-plugin si integra direttamente con il processo di compilazione di webpack e "conosce" tutte le risorse generate da una determinata compilazione. Ciò significa che, per molti casi d'uso, puoi fare affidamento sul comportamento predefinito di workbox-webpack-plugin senza configurazione aggiuntiva e ottenere un service worker equivalente a quello fornito da sw-precache-webpack-plugin.

const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
const webpackConfig = {
  // ...
  plugins: [
    new SWPrecacheWebpackPlugin({
      dontCacheBustUrlsMatching: /\.\w{8}\./,
      filename: 'service-worker.js',
    }),
  ],
};

può essere modificato in

const {GenerateSW} = require('workbox-webpack-plugin');
const webpackConfig = {
  // ...
  plugins: [
    new GenerateSW({
      // Config options, if needed.
    }),
  ],
};

Migrazioni di sw-toolbox

Eseguire la migrazione da sw-toolbox creato manualmente a workbox-sw

Se utilizzavi sw-toolbox direttamente (anziché implicitamente tramite l'opzione runtimeCaching di sw-precache), la migrazione a Workbox richiede alcuni aggiustamenti manuali per ottenere il comportamento equivalente. Per maggiore contesto, leggi la documentazione relativa ai moduli workbox-routing e workbox-strategies.

Ecco alcuni snippet di codice per facilitare la migrazione. Questo codice di sw-toolbox:

importScripts('path/to/sw-toolbox.js');

// Set up a route that matches HTTP 'GET' requests.
toolbox.router.get(
  // Match any URL that contains 'ytimg.com', regardless of
  // where in the URL that match occurs.
  /\.ytimg\.com\//,

  // Apply a cache-first strategy to anything that matches.
  toolbox.cacheFirst,

  {
    // Configure a custom cache name and expiration policy.
    cache: {
      name: 'youtube-thumbnails',
      maxEntries: 10,
      maxAgeSeconds: 30,
    },
  }
);

// Set a default network-first strategy to use when
// there is no explicit matching route:
toolbox.router.default = toolbox.networkFirst;

è equivalente a questo codice Workbox:

importScripts('path/to/workbox-sw.js');

workbox.routing.registerRoute(
  // Match any URL that contains 'ytimg.com'.
  // Unlike in sw-toolbox, in Workbox, a RegExp that matches
  // a cross-origin URL needs to include the initial 'https://'
  // as part of the match.
  new RegExp('^https://.*.ytimg.com'),

  // Apply a cache-first strategy to anything that matches.
  new workbox.strategies.CacheFirst({
    // Configuration options are passed in to the strategy.
    cacheName: 'youtube-thumbnails',
    plugins: [
      new workbox.expiration.ExpirationPlugin({
        maxEntries: 10,
        maxAgeSeconds: 30,
      }),
      // In Workbox, you must explicitly opt-in to caching
      // responses with a status of 0 when using the
      // cache-first strategy.
      new workbox.cacheableResponse.CacheableResponsePlugin({
        statuses: [0, 200],
      }),
    ],
  })
);

// Set a default network-first strategy to use when
// there is no explicit matching route:
workbox.routing.setDefaultHandler(new workbox.strategies.NetworkFirst());

Richiesta di aiuto

Prevediamo che la maggior parte delle migrazioni a Workbox sarà semplice. Se riscontri problemi non trattati in questa guida, comunicacelo aprendo un problema su GitHub.