Otimize as fontes da Web para as Core Web Vitals.
Este artigo discute as práticas recomendadas de desempenho para fontes. As fontes da Web afetam o desempenho de várias maneiras:
- Atraso na renderização de texto:se uma fonte da Web não é carregada, os navegadores geralmente atrasam a renderização do texto. Em muitas situações, isso atrasa a primeira exibição de conteúdo (FCP, na sigla em inglês). Em algumas situações, isso atrasa a Maior exibição de conteúdo (LCP).
- Mudanças de layout:a prática de troca de fontes pode causar mudanças de layout e, portanto, afetar a Mudança de layout cumulativa (CLS). Essas mudanças de layout ocorrem quando uma fonte da Web e sua fonte substituta ocupam diferentes quantidades de espaço na página.
Este artigo é dividido em três seções: carregamento de fonte, envio de fonte e renderização de fonte. Cada seção explica como esse aspecto específico do ciclo de vida da fonte funciona e apresenta as práticas recomendadas correspondentes.
Carregamento de fonte
As fontes normalmente são recursos importantes, porque sem elas o usuário pode não conseguir visualizar o conteúdo da página. Assim, as práticas recomendadas para o carregamento de fontes geralmente se concentram em garantir que as fontes sejam carregadas o mais cedo possível. É preciso ter cuidado especial com fontes carregadas de sites de terceiros, porque o download desses arquivos de fontes requer configurações de conexão separadas.
Se você não tiver certeza se as fontes da sua página estão sendo solicitadas a tempo, consulte a guia Tempo no painel Rede do Chrome DevTools para mais informações.
Noções básicas sobre @font-face
Antes de seguir as práticas recomendadas de carregamento de fontes, é importante entender como o @font-face
funciona e como isso afeta o carregamento de fontes.
A declaração @font-face
é uma parte essencial do trabalho com qualquer fonte da Web. No mínimo, ela declara o nome que será usado para se referir à fonte e indica o local do arquivo da fonte correspondente.
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}
Um equívoco comum é achar que uma fonte é solicitada quando uma declaração @font-face
é encontrada, o que não é verdade. Por si só, a declaração @font-face
não aciona o download da fonte. Em vez disso, uma fonte só é baixada se é referenciada pelo estilo usado na página. Por exemplo, assim:
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}
h1 {
font-family: "Open Sans"
}
Em outras palavras, no exemplo acima, o download de Open Sans
só seria feito se a página contivesse um elemento <h1>
.
Assim, ao pensar na otimização de fontes, é importante dar às folhas de estilo o mesmo valor que os próprios arquivos de fonte. Alterar o conteúdo ou a entrega das folhas de estilo pode ter um impacto significativo na chegada das fontes. Da mesma forma, remover CSS não utilizado e dividir folhas de estilo pode reduzir o número de fontes carregadas por uma página.
Declarações de fontes inline
A maioria dos sites se beneficiaria muito com declarações de fonte inline e outros estilos essenciais no <head>
do documento principal, em vez de incluí-los em uma folha de estilo externa. Isso permite que o navegador descubra as declarações de fonte mais rapidamente, já que não precisa aguardar o download da folha de estilo externa.
<head>
<style>
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}
body {
font-family: "Open Sans";
}
...etc.
</style>
</head>
A inserção de elementos CSS essenciais em linha pode ser uma técnica mais avançada que nem todos os sites conseguirão realizar. Os benefícios para o desempenho são claros, mas são necessários processos adicionais e ferramentas de criação para garantir que o CSS (e, de preferência, somente o CSS essencial) seja alinhado corretamente e que qualquer CSS adicional seja fornecido sem bloqueio de renderização.
Pré-conexão com origens críticas de terceiros
Caso seu site carrega fontes de um site de terceiros, é altamente recomendável usar a dica de recurso preconnect
para estabelecer conexões antecipadas com a origem de terceiros. As dicas de recursos precisam ser colocadas no <head>
do documento. A dica de recurso abaixo configura uma conexão para carregar a folha de estilo de fonte.
<head>
<link rel="preconnect" href="https://fonts.com">
</head>
Para pré-conectar a conexão usada para fazer o download do arquivo de fonte, adicione uma dica de recurso preconnect
separada que use o atributo crossorigin
. Ao contrário das folhas de estilo, os arquivos de fontes precisam ser enviados por uma conexão CORS.
<head>
<link rel="preconnect" href="https://fonts.com">
<link rel="preconnect" href="https://fonts.com" crossorigin>
</head>
Ao usar a dica de recurso preconnect
, lembre-se de que um provedor de fontes pode disponibilizar folhas de estilo e fontes de origens separadas. Por exemplo, é assim que a dica de recurso preconnect
seria usada para o Google Fonts.
<head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
</head>
Tenha cuidado ao usar preload
para carregar fontes.
Embora o preload
seja altamente eficaz em tornar fontes detectáveis no início do processo de carregamento de página, isso prejudica o carregamento de outros recursos do navegador.
Inserir declarações de fonte e ajustar folhas de estilo pode ser uma abordagem mais eficaz. Esses ajustes se aproximam de abordar a causa raiz das fontes descobertas tardiamente, em vez de apenas fornecer uma solução alternativa.
Além disso, usar preload
como uma estratégia de carregamento de fonte também deve ser usado com cuidado, porque ele ignora algumas das estratégias de negociação de conteúdo integradas do navegador. Por exemplo, preload
ignora declarações unicode-range
e, se usado de maneira prudente, só pode ser usado para carregar um único formato de fonte.
No entanto, ao usar folhas de estilo externas, o pré-carregamento das fontes mais importantes pode ser muito eficaz, pois o navegador não descobrirá se a fonte é necessária muito mais tarde.
Exibição de fontes
A entrega de fontes mais rápida resulta em uma renderização de texto mais rápida. Além disso, se uma fonte for enviada cedo o suficiente, isso pode ajudar a eliminar mudanças de layout resultantes da troca de fontes.
Como usar fontes auto-hospedadas
No papel, o uso de uma fonte auto-hospedada melhora o desempenho porque elimina a configuração de uma conexão de terceiros. No entanto, na prática, as diferenças de desempenho entre essas duas opções são menos claras: por exemplo, o Almanaque da Web descobriu que sites com fontes de terceiros tinham uma renderização mais rápida do que as fontes com fontes primárias.
Se você estiver pensando em usar fontes auto-hospedadas, confirme se o site usa uma rede de fornecimento de conteúdo (CDN) e HTTP/2. Sem essas tecnologias, é muito menos provável que fontes auto-hospedadas ofereçam melhor desempenho. Para mais informações, consulte Redes de fornecimento de conteúdo.
Se você usa uma fonte auto-hospedada, é recomendável aplicar também algumas das otimizações de arquivos de fontes que os provedores de fontes de terceiros normalmente fornecem automaticamente. Por exemplo, a criação de subconjuntos de fontes e a compactação WOFF2. O esforço necessário para aplicar essas otimizações dependerá um pouco dos idiomas com suporte no seu site. É importante lembrar que otimizar fontes para idiomas CJK pode ser um desafio.
Usar WOFF2
Das fontes de fontes modernas, a WOFF2 é a mais recente, oferece a maior compatibilidade com navegadores e a melhor compactação. Por usar o Brotli, o WOFF2 compacta 30% melhor do que o WOFF, diminuindo os dados para download e, portanto, com um desempenho mais rápido.
Devido ao suporte ao navegador, os especialistas agora recomendam usar apenas o WOFF2:
Na verdade, também é hora de dizer: use apenas WOFF2 e esqueça todo o resto.
Bram Stein, do Almanaque da Web de 2022
Isso simplifica imensamente o CSS e o fluxo de trabalho, além de evitar downloads acidentais ou duplicados de fontes. O WOFF2 agora tem suporte em todos os lugares. Portanto, a menos que você precise de suporte para navegadores antigos, basta usar WOFF2. Se isso não for possível, considere não exibir fontes da Web nesses navegadores mais antigos. Isso não será um problema se você tiver uma estratégia de substituição robusta. Os visitantes com navegadores mais antigos simplesmente verão suas fontes substitutas.
Fontes do subconjunto
Os arquivos de fonte normalmente incluem um grande número de glifos para todos os diversos caracteres compatíveis. Mas talvez você não precise de todos os caracteres da página e pode reduzir o tamanho dos arquivos de fontes com a subconfiguração das fontes.
O descritor unicode-range
na declaração @font-face
informa ao navegador quais caracteres uma fonte pode ser usada.
@font-face {
font-family: "Open Sans";
src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
unicode-range: U+0025-00FF;
}
O download de um arquivo de fonte será feito se a página tiver um ou mais caracteres que correspondam ao intervalo Unicode. Geralmente, o unicode-range
é usado para exibir arquivos de fonte diferentes, dependendo do idioma usado pelo conteúdo da página.
O unicode-range
costuma ser usado em conjunto com a técnica de criação de subconjuntos. Uma fonte de subconjunto inclui uma porção menor dos glifos contidos no arquivo da fonte original. Por exemplo, em vez de exibir todos os caracteres para todos os usuários, um site pode gerar fontes de subconjuntos separadas para caracteres latinos e cirílicos. O número de glifos por fonte varia muito: as fontes latinas costumam ter de 100 a 1.000 glifos por fonte. As fontes CJK podem ter mais de 10 mil caracteres. A remoção de glifos não utilizados pode reduzir significativamente o tamanho do arquivo de uma fonte.
Alguns provedores de fontes podem fornecer automaticamente versões diferentes dos arquivos de fontes com diferentes subconjuntos. Por exemplo, o Google Fonts faz isso por padrão:
/* devanagari */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJbecnFHGPezSQ.woff2) format('woff2');
unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* latin-ext */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJnecnFHGPezSQ.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Poppins';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
Na opção de auto-hospedagem, esta é uma otimização que pode ser facilmente ignorada e levar a arquivos de fontes maiores localmente.
Também é possível criar um subconjunto de fontes manualmente, caso o provedor permita, seja por uma API (o Google Fonts oferece suporte ao fornecer um parâmetro text
) ou editando manualmente os arquivos da fonte e hospedando seus dados. As ferramentas para gerar subconjuntos de fontes incluem subfont e glyphanger. No entanto, verifique na licença as fontes que permitem a criação de subconjuntos e a auto-hospedagem.
Usar menos fontes da Web
A fonte mais rápida de ser entregue é aquela que não é solicitada. As fontes do sistema e as variáveis são duas maneiras de reduzir potencialmente o número de fontes da Web usadas no seu site.
Uma fonte do sistema é a fonte padrão usada pela interface do usuário do dispositivo. As fontes do sistema normalmente variam de acordo com o sistema operacional e a versão. Como a fonte já está instalada, não é necessário fazer o download dela. As fontes do sistema podem funcionar muito bem para o corpo do texto.
Para usar a fonte do sistema no CSS, liste system-ui
como a família de fontes:
font-family: system-ui
A ideia por trás das fontes variáveis é que uma única fonte variável possa ser usada para substituir vários arquivos de fontes. As fontes variáveis funcionam definindo um estilo de fonte "padrão" e fornecendo eixos para manipular a fonte. Por exemplo, uma fonte variável com um eixo Weight
poderia ser usada para implementar letras que antes precisavam de fontes separadas para luz, normal, negrito e negrito extra.
Nem todos se beneficiarão com a mudança para fontes variáveis. As fontes variáveis contêm muitos estilos, por isso, normalmente têm tamanhos de arquivo maiores do que as fontes não variáveis individuais que contêm apenas um estilo. Os sites que terão a maior melhoria com o uso de fontes variáveis são aqueles que usam (e precisam usar) uma variedade de estilos e pesos de fonte.
Renderização da fonte
Ao enfrentar uma fonte da Web que ainda não foi carregada, o navegador se depara com um dilema: ele deve adiar a renderização do texto até que a fonte da Web tenha chegado? Ou ele deveria renderizar o texto em uma fonte substituta até que a fonte da Web chegue?
Navegadores diferentes lidam com esse cenário de maneira diferente. Por padrão, os navegadores baseados no Chromium e o Firefox bloquearão a renderização de texto por até três segundos se a fonte da Web associada não for carregada. O Safari bloqueará a renderização de texto indefinidamente.
Esse comportamento pode ser configurado usando o atributo font-display
. Essa escolha pode ter implicações significativas: o font-display
pode afetar a LCP, a FCP e a estabilidade do layout.
Escolha uma estratégia de font-display
adequada
font-display
informa ao navegador como proceder com a renderização de texto quando a fonte da Web associada não for carregada. Ela é definida por tipo de fonte.
@font-face {
font-family: Roboto, Sans-Serif
src: url(/fonts/roboto.woff) format('woff'),
font-display: swap;
}
Há cinco valores possíveis para font-display
:
Valor | Período de bloqueio | Período de troca |
---|---|---|
Automático | Varia de acordo com o navegador | Varia de acordo com o navegador |
Bloquear | 2 a 3 segundos | Indeterminado |
Trocar | 0ms | Indeterminado |
Fallback | 100 ms | 3 segundos |
Opcional | 100 ms | Nenhuma |
- Período de bloqueio: o período de bloqueio começa quando o navegador solicita uma fonte da Web. Durante o período de bloqueio, se a fonte da Web não estiver disponível, ela será renderizada em uma fonte substituta invisível e, portanto, o texto não ficará visível para o usuário. Se a fonte não estiver disponível no final do período de bloqueio, ela será renderizada na fonte substituta.
- Período de troca: o período de troca vem após o período de bloqueio. Se a fonte da Web ficar disponível durante o período de troca, ela será "trocada".
As estratégias de font-display
refletem diferentes pontos de vista sobre a compensação entre performance e estética. Por isso, é difícil oferecer uma abordagem recomendada, porque ela depende de preferências individuais, da importância da fonte da Web para a página e da marca e de como uma fonte tardia pode ser desagradável quando trocada.
Estas são as três estratégias mais aplicáveis para a maioria dos sites:
Se o desempenho for a prioridade:use
font-display: optional
. Essa é a abordagem com melhor desempenho: a renderização de texto é atrasada por não mais de 100 ms e há garantia de que não haverá mudanças de layout relacionadas à troca de fontes. No entanto, a desvantagem é que a fonte da Web não será usada se chegar atrasada.Se exibir texto rapidamente for uma prioridade, mas você ainda quiser garantir que a fonte da Web seja usada:use
font-display: swap
, mas envie a fonte com antecedência suficiente para não causar uma mudança no layout. A desvantagem dessa opção é a mudança desagradável quando a fonte chega atrasada.Se a prioridade for garantir que o texto seja exibido como uma fonte da Web:use
font-display: block
, mas envie a fonte com antecedência suficiente para minimizar o atraso do texto. A desvantagem disso é que a exibição inicial do texto será atrasada. Apesar disso, ele ainda pode causar uma mudança de layout, já que o texto é desenhado invisível e, portanto, o espaço da fonte substituta é usado para reservar o espaço Uma vez que a fonte da Web é carregada, isso pode exigir espaço de diferença e, portanto, uma mudança. No entanto, essa pode ser uma mudança menos desagradável do quefont-display: swap
, já que o texto em si não será visto como mudando.
Lembre-se também de que essas duas abordagens podem ser combinadas. Por exemplo, use font-display: swap
para branding e outros elementos de página visualmente distintos. Use font-display: optional
para fontes usadas no corpo do texto.
Reduzir a mudança entre a fonte substituta e a fonte da Web
Para reduzir o impacto na CLS, você pode usar os novos atributos size-adjust
. Para mais informações, consulte o artigo sobre CSS size-adjust
. Essa é uma adição muito nova ao nosso conjunto de ferramentas, por isso é mais avançada e um pouco manual no momento. Mas definitivamente vale a pena testar e ficar de olho nas melhorias nas ferramentas no futuro!
Conclusão
As fontes da Web ainda são um gargalo de desempenho, mas temos uma gama cada vez maior de opções que nos permitem otimizá-las para reduzir esse gargalo o máximo possível.