O armazenamento em cache de recursos com um service worker pode acelerar as visitas repetidas e oferecer suporte off-line. O Workbox facilita isso e é incluído no Create React App por padrão.
O Workbox é integrado ao
Create React App (CRA) com uma configuração padrão que armazena em pré-cache todos os
recursos estáticos no aplicativo em cada build.
Por que isso é útil?
Os service workers permitem armazenar recursos importantes no cache (pré-armazenamento em cache) para que, quando um usuário carregar a página da Web pela segunda vez, o navegador possa recuperá-los do service worker em vez de fazer solicitações à rede. Isso resulta em carregamentos de página mais rápidos em visitas repetidas, além da capacidade de mostrar conteúdo quando o usuário está off-line.
Workbox no CRA
O Workbox é uma coleção de ferramentas que permite criar e manter service
workers. No CRA, o
workbox-webpack-plugin
já está incluído no build de produção e só precisa ser ativado no
arquivo src/index.js para registrar um novo service worker com cada
build:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(<App />, document.getElementById('root'));
serviceWorker.unregister();
serviceWorker.register();
Veja um exemplo de um app React criado com o CRA que tem um service worker ativado por esse arquivo:
Para ver quais recursos estão sendo armazenados em cache:
- Para visualizar o site, pressione View App. Em seguida, pressione
Fullscreen
.
- Pressione Control+Shift+J (ou Command+Option+J no Mac) para abrir o DevTools.
- Clique na guia Rede.
- Atualize o app.
Em vez de mostrar o tamanho do payload, a coluna Size mostra
uma mensagem (from ServiceWorker) para indicar que esses recursos foram recuperados
do service worker.

Como o service worker armazena em cache todos os recursos estáticos, tente usar o aplicativo enquanto estiver off-line:
- Na guia Rede do DevTools, marque a caixa de seleção Off-line para simular uma experiência off-line.
- Atualize o app.
O aplicativo funciona exatamente da mesma maneira, mesmo sem uma conexão de rede.
Como modificar estratégias de armazenamento em cache
A estratégia de pré-armazenamento em cache padrão usada pelo Workbox no CRA é cache-first, em que todos os recursos estáticos são buscados no cache do service worker e, se isso falhar (por exemplo, se o recurso não estiver armazenado em cache), a solicitação de rede será feita. É assim que o conteúdo ainda pode ser veiculado aos usuários, mesmo quando eles estão em um estado totalmente off-line.
Embora o Workbox ofereça suporte para definir diferentes estratégias e abordagens
para armazenar em cache recursos estáticos e dinâmicos, a configuração padrão no CRA não pode
ser modificada ou substituída, a menos que você faça a ejeção completa. No entanto, há uma
proposta aberta
para adicionar suporte a um arquivo workbox.config.js externo. Isso
permitiria que os desenvolvedores substituíssem as configurações padrão criando apenas um
arquivo workbox.config.js.
Como lidar com uma estratégia que prioriza o cache
Confiar primeiro no cache do service worker e depois recorrer à rede é uma excelente maneira de criar sites que carregam mais rápido em visitas subsequentes e funcionam off-line até certo ponto. No entanto, é preciso considerar alguns pontos:
- Como os comportamentos de armazenamento em cache de um service worker podem ser testados?
- Deve haver uma mensagem para os usuários informando que eles estão vendo conteúdo em cache?
A documentação da CRA (em inglês) explica esses pontos e outros em detalhes.
Conclusão
Use um service worker para pré-armazenar em cache recursos importantes no aplicativo para oferecer uma experiência mais rápida aos usuários, além de suporte off-line.
- Se você estiver usando o CRA, ative o service worker pré-configurado em
src/index.js. - Se você não estiver usando o CRA para criar um aplicativo React, inclua uma das
várias bibliotecas fornecidas pelo Workbox, como
workbox-webpack-plugin, no seu processo de build. - Fique de olho em quando o CRA vai oferecer suporte a um arquivo de substituição
workbox.config.jsneste problema do GitHub.