Este guia se concentra em alterações interruptivas introduzidas no Workbox v3, com exemplos das mudanças que você precisaria fazer ao fazer upgrade de uma configuração da Workbox v2.
Se você usa a combinação legada de sw-precache
/sw-toolbox
e quer fazer a transição para o Workbox pela primeira vez, consulte este guia de migração.
Contexto da v3
A versão v3 do Workbox representa uma refatoração significativa da base de código existente. Os objetivos principais são:
- Minimize o tamanho da caixa de trabalho. A quantidade de código de ambiente de execução do service worker que é baixada e executada foi reduzida. Em vez de permitir que todos os usuários participem de um pacote monolítico, apenas o código dos recursos específicos que você está usando será importado no ambiente de execução.
- O Workbox tem uma CDN. Oferecemos uma hospedagem CDN totalmente compatível e baseada no Google Cloud Storage como a opção canônica para acessar as bibliotecas de ambiente de execução do Workbox, facilitando a implementação e a execução do Workbox.
- Melhorias na depuração e nos registros. A experiência de depuração e geração de registros foi bastante aprimorada. Os registros de depuração são ativados por padrão sempre que a caixa de trabalho é usada de uma origem
localhost
e todos os registros e declarações são removidos dos builds de produção. - Plug-in webpack melhorado. O
workbox-webpack-plugin
se integra melhor ao processo de build do webpack, o que permite um caso de uso sem configuração quando você quer pré-armazenar todos os recursos no pipeline de build em cache.
Para atingir essas metas e limpar alguns aspectos da interface anterior que pareciam estranhos ou levavam a antipadrões, exigiu a introdução de uma série de alterações interruptivas na versão v3.
Alterações importantes
Configuração do build
As mudanças abaixo afetam o comportamento de todas as nossas ferramentas de build (workbox-build
, workbox-cli
, workbox-webpack-plugin
), que compartilham um conjunto comum de opções de configuração.
- O nome do gerenciador
'fastest'
era válido anteriormente e era tratado como um alias para'staleWhileRevalidate'
durante a configuração deruntimeCaching
. Ela não é mais válida, e os desenvolvedores precisam passar a usar'staleWhileRevalidate'
diretamente. - Vários nomes de propriedades
runtimeCaching.options
foram atualizados e há uma validação de parâmetro adicional em vigor que vai causar a falha de um build se uma configuração inválida for usada. Consulte a documentação deruntimeCaching
para uma lista das opções compatíveis no momento.
workbox-background-sync
- O parâmetro de configuração
maxRetentionTime
agora é interpretado como um número de minutos, não de milissegundos. - Agora há uma string obrigatória, que representa o nome da fila, que deve ser transmitida como o primeiro parâmetro ao construir o plug-in ou a classe autônoma. Antes ela era transmitida como uma propriedade das opções. Consulte a documentação da plataforma atualizada da API.
workbox-broadcast-cache-update
- Agora há uma string obrigatória, que representa o nome do canal, que deve ser transmitida como o primeiro parâmetro ao construir o plug-in ou a classe autônoma.
Por exemplo, na v2, você inicializaria a classe do plug-in da seguinte maneira:
new workbox.broadcastCacheUpdate.BroadcastCacheUpdatePlugin({
channelName: 'cache-updates',
headersToCheck: ['etag'],
});
O uso equivalente na v3 é:
new workbox.broadcastUpdate.Plugin('cache-updates', {headersToCheck: ['etag']});
Consulte a documentação da plataforma atualizada da API.
workbox-build
- Por padrão, a correspondência do padrão
glob
será realizada com as opçõesfollow: true
(que seguirão links simbólicos) estrict: true
(que é menos tolerante a erros "incomuns"). Você pode desativar qualquer um deles e retornar ao comportamento anterior definindoglobFollow: false
e/ouglobStrict: false
na configuração do build. - Todas as funções em
workbox-build
retornam uma propriedade adicional,warnings
, nas respostas retornadas. Alguns cenários que eram tratados como erros fatais na v2 agora são permitidos, mas informados viawarnings
, que é uma matriz de strings.
Na v2, você pode chamar generateSW
da seguinte forma:
const workboxBuild = require('workbox-build');
workboxBuild.generateSW({...})
.then(({count, size}) => console.log(`Precached ${count} files, totaling ${size} bytes.`))
.catch((error) => console.error(`Something went wrong: ${error}`));
Embora seja possível usar o mesmo código na v3, é uma boa ideia verificar se há warnings
e registrá-los:
const workboxBuild = require('workbox-build');
workboxBuild.generateSW({...})
.then(({count, size, warnings}) => {
for (const warning of warnings) {
console.warn(warning);
}
console.log(`Precached ${count} files, totalling ${size} bytes.`);
})
.catch((error) => console.error(`Something went wrong: ${error}`));
- Os desenvolvedores que criaram as próprias funções
ManifestTransform
personalizadas na v2 precisam retornar a matriz de manifesto em um objeto (ou seja, em vez dereturn manifestArray;
, usereturn {manifest: manifestArray};
). Isso permite que seu plug-in inclua uma propriedadewarnings
opcional, que precisa ser uma matriz de strings contendo informações de aviso não fatais.
Se você estava escrevendo um ManifestTransform
personalizado na v2, o código seria como:
const cdnTransform = manifestEntries => {
return manifestEntries.map(entry => {
const cdnOrigin = 'https://example.com';
if (entry.url.startsWith('/assets/')) {
entry.url = cdnOrigin + entry.url;
}
return entry;
});
};
tem um equivalente v3 de:
const cdnTransform = manifestEntries => {
const manifest = manifestEntries.map(entry => {
const cdnOrigin = 'https://example.com';
if (entry.url.startsWith('/assets/')) {
entry.url = cdnOrigin + entry.url;
}
return entry;
});
return {manifest, warnings: []};
};
- A função
getFileManifestEntries()
foi renomeada comogetManifest()
, e a promessa retornada agora inclui mais informações sobre os URLs que são pré-armazenados em cache.
Código como o seguinte na v2:
const manifestEntries = await workboxBuild.getFileManifestEntries({...});
pode ser reescrito na v3 como:
const {manifestEntries, count, size, warnings} = await workboxBuild.getManifest({...});
// Use manifestEntries like before.
// Optionally, log the new info returned in count, size, warnings.
- A função
generateFileManifest()
foi removida. Em vez disso, recomendamos que os desenvolvedores chamemgetManifest()
e usem a resposta dela para gravar dados no disco no formato apropriado.
workbox-cache-expiration
- A API do plug-in permaneceu a mesma, que é o modo que a maioria dos desenvolvedores acabará usando. No entanto, há mudanças significativas na API que afetam os desenvolvedores que a usam como uma classe autônoma. Consulte a documentação da plataforma atualizada da API.
workbox-cli
Os desenvolvedores podem executar a CLI com a flag --help
para um conjunto completo de parâmetros compatíveis.
- O suporte para o alias
workbox-cli
para o script binário foi removido. O binário agora só pode ser acessado comoworkbox
. - Os comandos da v2
generate:sw
einject:manifest
foram renomeados comogenerateSW
einjectManifest
na v3. - Na v2, o arquivo de configuração padrão (usado quando não era fornecido explicitamente) era
workbox-cli-config.js
no diretório atual. Na v3, éworkbox-config.js
.
Considerados em conjunto, isso significa que na v2:
$ workbox inject:manifest
executaria o comando "inject manifesto" processo de build, usando uma configuração lida de workbox-cli-config.js
e na v3:
$ workbox injectManifest
vai fazer o mesmo, mas vai ler a configuração de workbox-config.js
.
pré-armazenamento em cache na caixa de trabalho
- Anteriormente, o método
precache()
executava as modificações de cache e configurou o roteamento para exibir entradas em cache. Agora, oprecache()
só modifica as entradas de cache, e um novo método,addRoute()
, foi exposto para registrar uma rota a fim de exibir essas respostas em cache. Os desenvolvedores que quiserem a funcionalidade "dois em um" anterior podem mudar para chamarprecacheAndRoute()
. - Várias opções que eram configuradas pelo construtor
WorkboxSW
agora são transmitidas como o parâmetrooptions
noworkbox.precaching.precacheAndRoute([...], options)
. Quando não configuradas, os padrões dessas opções estão listados nos documentos de referência. - Por padrão, os URLs sem extensão de arquivo serão automaticamente verificados quanto à correspondência com uma entrada de cache que contenha uma extensão
.html
. Por exemplo, se uma solicitação for feita para/path/to/index
(que não está pré-armazenada em cache) e houver uma entrada pré-armazenada em cache para/path/to/index.html
, essa entrada será usada. Os desenvolvedores podem desativar esse novo comportamento definindo{cleanUrls: false}
ao transmitir opções paraworkbox.precaching.precacheAndRoute()
. - O
workbox-broadcast-update
não será mais configurado automaticamente para anunciar atualizações de cache para recursos pré-armazenados em cache.
O código a seguir na v2:
const workboxSW = new self.WorkboxSW({
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
precacheChannelName: 'precache-updates',
});
workboxSW.precache([...]);
tem um equivalente v3 de:
workbox.precaching.addPlugins([
new workbox.broadcastUpdate.Plugin('precache-updates')
]);
workbox.precaching.precacheAndRoute([...], {
cleanUrls: false,
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
});
roteamento de caixa de trabalho
- Os desenvolvedores que usavam o
workbox-routing
com o namespaceworkbox.router.*
de um objeto WorkboxSW precisam mudar para o novo namespaceworkbox.routing.*
. - As rotas agora são avaliadas em uma ordem de "primeiro registrado-vitória". Essa é a ordem oposta da avaliação de
Route
usada na v2, em que o últimoRoute
registrado teria prioridade. - A classe
ExpressRoute
e suporte para "estilo Express" os caracteres curinga foram removidos. Isso reduz consideravelmente o tamanho doworkbox-routing
. As strings usadas como o primeiro parâmetro paraworkbox.routing.registerRoute()
agora serão tratadas como correspondências exatas. As correspondências parciais ou curinga precisam ser processadas porRegExp
s. O uso de qualquerRegExp
que corresponda a todo ou parte do URL da solicitação pode acionar uma rota. - O método auxiliar
addFetchListener()
da classeRouter
foi removido. Os desenvolvedores podem adicionar o próprio gerenciadorfetch
explicitamente ou usar a interface fornecida porworkbox.routing
, que cria um gerenciadorfetch
implicitamente para eles. - Os métodos
registerRoutes()
eunregisterRoutes()
foram removidos. As versões desses métodos que operam em uma únicaRoute
não foram alteradas, e os desenvolvedores que precisam registrar ou cancelar o registro de várias rotas de uma vez precisam fazer uma série de chamadas pararegisterRoute()
ouunregisterRoute()
.
O código a seguir na v2:
const workboxSW = new self.WorkboxSW();
workboxSW.router.registerRoute(
'/path/with/.*/wildcard/',
workboxSW.strategies.staleWhileRevalidate()
);
workboxSW.router.registerRoute(
new RegExp('^https://example.com/'),
workboxSW.strategies.networkFirst()
);
tem um equivalente v3 de:
workbox.routing.registerRoute(
new RegExp('^https://example.com/'),
workbox.strategies.networkFirst()
);
workbox.routing.registerRoute(
new RegExp('^/path/with/.*/wildcard'),
workbox.strategies.staleWhileRevalidate()
);
Estratégias de caixa de trabalho (antes conhecidas como workbox-runtime-caching)
- O módulo
workbox-runtime-caching
agora é oficialmente conhecido comoworkbox-strategies
e foi publicado emnpm
com seu novo nome. - Usar a expiração do cache em uma estratégia sem fornecer também um nome de cache não é mais válido. Na v2, isso era possível:
workboxSW.strategies.staleWhileRevalidate({
cacheExpiration: {maxEntries: 50},
});
Isso levaria à expiração de entradas no cache padrão, o que é inesperado. Na v3, um nome de cache é obrigatório:
workboxSW.strategies.staleWhileRevalidate({
cacheName: 'my-cache',
plugins: [new workbox.expiration.Plugin({maxEntries: 50})],
});
- O método de ciclo de vida
cacheWillMatch
foi renomeado paracachedResponseWillBeUsed
. Essa não será uma mudança visível para os desenvolvedores, a menos que eles tenham criado os próprios plug-ins que reagiram àcacheWillMatch
. - A sintaxe para especificar plug-ins ao configurar uma estratégia mudou. Cada plug-in precisa ser listado explicitamente na propriedade
plugins
da configuração da estratégia.
O código a seguir na v2:
const workboxSW = new self.WorkboxSW();
const networkFirstStrategy = workboxSW.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
cacheExpiration: {
maxEntries: 50,
},
cacheableResponse: {
statuses: [0, 200],
},
});
tem um equivalente v3 de:
const networkFirstStrategy = workbox.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.Plugin({maxEntries: 50}),
new workbox.cacheableResponse.Plugin({statuses: [0, 200]}),
],
});
Você pode saber mais em "Como usar plug-ins" guia.
workbox-sw
- Internamente, o
workbox-sw
foi reescrito para ser um "carregador" leve. , que requer uma configuração básica e é responsável por extrair os outros módulos necessários no ambiente de execução. Em vez de criar uma nova instância da classeWorkboxSW
, os desenvolvedores vão interagir com uma instância que é exposta automaticamente no namespace global.
Anteriormente na v2:
importScripts('<path to workbox-sw>/importScripts/workbox-sw.prod.v2.1.3.js');
const workbox = new WorkboxSW({
skipWaiting: true,
clientsClaim: true,
// etc.
});
workbox.router.registerRoute(...);
Na v3, basta importar o script workbox-sw.js
, e uma instância pronta para uso será disponibilizada automaticamente no namespace global como workbox
:
importScripts('<path to workbox-sw>/3.0.0/workbox-sw.js');
// workbox is implicitly created and ready for use.
workbox.routing.registerRoute(...);
skipWaiting
eclientsClaim
não são mais opções transmitidas para o construtorWorkboxSW
. Em vez disso, eles foram alterados para os métodosworkbox.clientsClaim()
eworkbox.skipWaiting()
.- A opção
handleFetch
, que anteriormente tinha suporte no construtor da v2, não é mais compatível na v3. Os desenvolvedores que precisam de uma funcionalidade semelhante para testar o service worker sem que nenhum gerenciador de busca seja invocado podem usar "Bypass for network" (Ignorar para a rede). disponível nas Ferramentas para desenvolvedores do Chrome.
workbox-webpack-plugin
O plug-in foi substancialmente reescrito e, em muitos casos, pode ser usado sem configuração. modo Consulte a documentação da plataforma atualizada da API.
- Agora, a API expõe duas classes,
GenerateSW
eInjectManifest
. Isso torna a alternância entre os modos explícita, em comparação com o comportamento da v2, em que o comportamento mudou com base na presença deswSrc
. - Por padrão, os recursos no pipeline de compilação do webpack são pré-armazenados em cache, e não é mais necessário configurar o
globPatterns
. O único motivo para continuar usandoglobPatterns
é se você precisar pré-armazenar em cache recursos que não estão incluídos no seu build do webpack. Em geral, ao migrar para o plug-in v3, comece removendo toda a configuração anterior baseada emglob
e adicione-a novamente apenas se você precisar dela.
Receber ajuda
Acreditamos que a maioria das migrações será simples. Se você tiver problemas que não foram abordados neste guia, abra um problema (link em inglês) no GitHub.