Otimizar fontes da Web

Nos módulos anteriores, você aprendeu a otimizar recursos de HTML, CSS, JavaScript e mídia. Neste módulo, você vai descobrir alguns métodos para otimizar fontes da Web.

As fontes da Web podem afetar a performance da página no tempo de carregamento e de renderização. Arquivos de fontes grandes podem levar um tempo para serem baixados e afetar negativamente o First Contentful Paint (FCP). Já o valor font-display incorreto pode causar mudanças indesejáveis no layout que contribuem para o Cumulative Layout Shift (CLS) de uma página.

Antes de discutir a otimização de fontes da Web, é útil saber como elas são descobertas pelo navegador. Assim, você entende como o CSS impede a recuperação de fontes da Web desnecessárias em determinadas situações.

Discovery

As fontes da Web de uma página são definidas em uma folha de estilo usando uma declaração @font-face:

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

O snippet de código anterior define um font-family chamado "Open Sans" e informa ao navegador onde encontrar o recurso de fonte da Web respectivo. Para economizar largura de banda, o navegador não faz o download da fonte da Web até que seja determinado que o layout da página atual precisa dela.

h1 {
  font-family: "Open Sans";
}

No snippet de CSS anterior, o navegador baixa o arquivo de fonte "Open Sans" ao analisar um elemento <h1> no HTML da página.

preload

Se as declarações @font-face estiverem definidas em uma folha de estilo externa, o navegador só poderá começar a fazer o download delas depois que a folha de estilo for baixada. Isso faz com que as fontes da Web sejam recursos descobertos tarde, mas há maneiras de ajudar o navegador a descobri-las antes.

É possível iniciar uma solicitação antecipada de recursos de fontes da Web usando a diretiva preload. A diretiva preload torna as fontes da Web detectáveis no início do carregamento da página, e o navegador começa imediatamente a fazer o download delas sem esperar que a folha de estilo termine o download e a análise. A diretiva preload não espera até que a fonte seja necessária na página.

<!-- The `crossorigin` attribute is required for fonts—even
     self-hosted ones, as fonts are considered CORS resources. -->
<link rel="preload" as="font" href="/fonts/OpenSans-Regular-webfont.woff2" crossorigin>

Declarações de @font-face in-line

Você pode tornar as fontes detectáveis mais cedo durante o carregamento da página incorporando CSS de bloqueio de renderização, incluindo as declarações @font-face, no <head> do HTML usando o elemento <style>. Nesse caso, o navegador descobre as fontes da Web mais cedo no carregamento da página, já que não precisa esperar o download de uma folha de estilo externa.

Declarar @font-face em linha tem uma vantagem sobre o uso da dica preload, já que o navegador só baixa as fontes necessárias para renderizar a página atual. Isso elimina o risco de baixar fontes não usadas.

Download

Depois de descobrir as fontes da Web e garantir que elas são necessárias para o layout da página atual, o navegador pode fazer o download delas. O número de fontes da Web, a codificação e o tamanho do arquivo podem afetar significativamente a velocidade com que uma fonte da Web é baixada e renderizada pelo navegador.

Fazer auto-hospedagem das fontes da Web

As fontes da Web podem ser disponibilizadas por serviços de terceiros, como o Google Fonts, ou auto-hospedadas na sua origem. Ao usar um serviço de terceiros, sua página da Web precisa abrir uma conexão com o domínio do provedor antes de começar a baixar as fontes da Web necessárias. Isso pode atrasar a descoberta e o download subsequente de fontes da Web.

Essa sobrecarga pode ser reduzida usando a dica de recurso preconnect. Ao usar preconnect, você pode instruir o navegador a abrir uma conexão com a origem cruzada antes do que ele faria normalmente:

<link rel="preconnect" href="https://fonts.googleapis.com">  
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

O snippet HTML anterior indica ao navegador que estabeleça uma conexão com fonts.googleapis.com e uma conexão CORS com fonts.gstatic.com. Alguns provedores de fontes, como o Google Fonts, oferecem CSS e recursos de fontes de diferentes origens.

Você pode eliminar a necessidade de uma conexão de terceiros hospedando suas próprias fontes da Web. Na maioria dos casos, a auto-hospedagem de fontes da Web é mais rápida do que o download delas de uma origem cruzada. Se você planeja fazer a hospedagem própria de fontes da Web, verifique se o site está usando uma rede de entrega de conteúdo (CDN), HTTP/2 ou HTTP/3 e define os cabeçalhos de cache corretos para as fontes da Web necessárias para seu site.

Use WOFF2, e somente WOFF2

O WOFF2 tem ampla compatibilidade com navegadores e a melhor compressão, até 30% melhor que o WOFF. O tamanho reduzido do arquivo resulta em tempos de download mais rápidos. O formato WOFF2 geralmente é o único necessário para compatibilidade total em navegadores modernos.

Criar subconjuntos de fontes da Web

As fontes da Web geralmente incluem uma ampla variedade de glifos, que são necessários para representar a grande variedade de caracteres usados em diferentes idiomas. Se a página veicula conteúdo em apenas um idioma ou usa um único alfabeto, é possível reduzir o tamanho das fontes da Web usando subconjuntos. Isso geralmente é feito especificando um número ou um intervalo de pontos de código Unicode.

Um subconjunto é um conjunto reduzido dos glifos incluídos no arquivo de webfont original. Por exemplo, em vez de veicular todos os glifos, sua página pode veicular um subconjunto específico para caracteres latinos. Dependendo do subconjunto necessário, a remoção de glifos pode reduzir significativamente o tamanho de um arquivo de fonte.

Alguns provedores de fontes da Web, como o Google Fonts, oferecem subconjuntos automaticamente usando um parâmetro de string de consulta. Por exemplo, o URL https://fonts.googleapis.com/css?family=Roboto&subset=latin veicula uma folha de estilo com a família tipográfica Roboto para a Web que usa apenas o alfabeto latino.

Se você decidiu hospedar as fontes da Web por conta própria, a próxima etapa é gerar e hospedar esses subconjuntos usando ferramentas como glyphanger ou subfont.

No entanto, se você não tiver capacidade para auto-hospedar suas próprias fontes da Web, é possível criar um subconjunto de fontes da Web fornecidas pelo Google Fonts especificando um parâmetro de string de consulta text adicional que contenha apenas os pontos de código Unicode necessários para seu site. Por exemplo, se você tiver uma fonte da Web de exibição no seu site que só precisa de um pequeno número de caracteres para a frase "Welcome", é possível solicitar esse subconjunto no Google Fonts usando o seguinte URL: https://fonts.googleapis.com/css?family=Monoton&text=Welcome. Isso pode reduzir significativamente a quantidade de dados de fontes da Web necessários para um único tipo de letra no seu site, se esse subconjunto extremo for útil.

Renderização de fontes

Depois que o navegador descobre e baixa uma fonte da Web, ela pode ser renderizada. Por padrão, o navegador bloqueia a renderização de qualquer texto que use uma fonte da Web até que ela seja baixada. É possível ajustar o comportamento de renderização de texto do navegador e configurar qual texto deve ser mostrado (ou não) até que a webfont seja totalmente carregada usando a propriedade font-display do CSS.

block

O valor padrão de font-display é block. Com block, o navegador bloqueia a renderização de qualquer texto que use a fonte da Web especificada. Navegadores diferentes têm comportamentos ligeiramente diferentes. O Chromium e o Firefox bloqueiam a renderização por até 3 segundos antes de usar um substituto. O Safari bloqueia indefinidamente até que a fonte da Web seja carregada.

swap

swap é o valor de font-display mais usado. swap não bloqueia a renderização e mostra o texto imediatamente em um substituto antes de trocar pela fonte da Web especificada. Isso permite mostrar seu conteúdo imediatamente sem esperar o download da fonte da Web.

No entanto, a desvantagem do swap é que ele causa uma mudança de layout se a fonte da Web de substituição e a fonte da Web especificada no CSS variarem muito em termos de altura da linha, kerning e outras métricas de fonte. Isso pode afetar o CLS do seu site se você não usar a dica preload para carregar um recurso de fonte da Web assim que possível ou se não considerar outros valores de font-display.

fallback

O valor fallback para font-display é uma espécie de compromisso entre block e swap. Ao contrário de swap, o navegador bloqueia a renderização de uma fonte, mas troca o texto substituto apenas por um período muito curto. No entanto, ao contrário do block, o período de bloqueio é extremamente curto.

Usar o valor fallback pode funcionar bem em redes rápidas, em que, se a fonte da Web for baixada rapidamente, ela será o tipo de letra usado imediatamente na renderização inicial da página. No entanto, se as redes estiverem lentas, o texto substituto será mostrado primeiro após o período de bloqueio e depois será trocado quando a fonte da Web chegar.

optional

optional é o valor de font-display mais restrito e só usa o recurso de fonte da Web se ele for baixado em até 100 milissegundos. Se uma fonte da Web demorar mais do que isso para carregar, ela não será usada na página, e o navegador usará a família tipográfica substituta para a navegação atual enquanto a fonte da Web é baixada em segundo plano e colocada no cache do navegador.

Como resultado, as navegações de página subsequentes podem usar a fonte da Web imediatamente, já que ela já foi baixada. font-display: optional evita a mudança de layout vista com swap, mas alguns usuários não veem a fonte da Web se ela chegar muito tarde na navegação inicial da página.

Demonstrações de fontes

Teste seus conhecimentos

Quando o navegador faz o download de um recurso de fonte da Web (supondo que ele não seja buscado com uma diretiva preload)?

Quando o CSSOM da página é criado e é determinado que a fonte da Web é necessária para o layout atual.
Assim que a referência a ele é descoberta em uma folha de estilo.

Qual é o único formato (e o mais eficiente) necessário para veicular fontes da Web em todos os navegadores modernos?

WOFF2
TTF
WOFF
EOT

Próximo: divisão de código JavaScript

Agora que você já sabe como otimizar fontes, pode passar para o próximo módulo, que aborda um tema com grande potencial para melhorar a velocidade de carregamento inicial da página para os usuários: adiar o carregamento de JavaScript usando a divisão de código. Assim, você pode manter a disputa de largura de banda e CPU o mais baixa possível durante a fase de inicialização de uma página, um período em que os usuários provavelmente vão interagir com ela.