Um pacote Next.js para gerenciar bibliotecas de terceiros

Em 2021, a equipe do Chrome Aurora introduziu o Script componente para melhorar a ao carregar o desempenho de scripts de terceiros no Next.js. Desde o lançamento, expandiu suas capacidades para facilitar o carregamento de recursos de terceiros e mais rapidamente para os desenvolvedores.

Esta postagem do blog fornece uma visão geral dos recursos mais recentes que lançamos, especialmente a @next/third-parties , bem como um esboço de iniciativas futuras em nosso roteiro.

Implicações no desempenho de scripts de terceiros

41% de todas as solicitações de terceiros nos sites Next.js são scripts. Ao contrário de outros conteúdos tipos, o download e a execução dos scripts pode levar um tempo considerável, o que pode bloquear a renderização e atrasar a interatividade do usuário. Dados do Chrome O Relatório de experiência do usuário (CrUX, na sigla em inglês) mostra que os sites do Next.js que carregam mais sites de terceiros os scripts têm menor Interação com a Próxima Paint (INP) e Maior exibição de conteúdo (LCP).

Gráfico de barras que mostra uma redução na porcentagem de Next.js que alcança boas pontuações de INP e LCP em proporção ao número de terceiros carregados
Relatório CrUX de dezembro de 2023 (110.823 sites)

A correlação observada neste gráfico não implica causalidade. No entanto, as campanhas locais os experimentos fornecem evidências adicionais de que scripts de terceiros afetar o desempenho da página. Por exemplo, a tabela abaixo compara vários laboratórios quando um contêiner do Gerenciador de tags do Google, composto por 18 itens selecionados aleatoriamente, é adicionada à Taxonomy, um exemplo conhecido do Next.js. app.

Gráfico de barras que mostra a diferença em várias métricas do laboratório quando um site é carregado com e sem o Gerenciador de tags do Google.
WebPageTest (Dispositivos móveis 4G - Virgínia, EUA)

Documentação do WebPageTest fornece detalhes sobre como esses tempos são medidos. Olhando rapidamente, é que todas essas métricas do laboratório são afetadas pelo contêiner do GTM. Para exemplo, Total Blocking Time (TBT), um laboratório útil que se aproxime do INP, teve um aumento de quase 20 vezes.

Componente de script

Quando enviamos o componente <Script> no Next.js, introduzimos por uma API fácil de usar que se assemelha ao <script> tradicional. . Com ele, os desenvolvedores podem colocalizar um script de terceiros em qualquer no aplicativo, e o Next.js fará o sequenciamento script após o carregamento dos recursos críticos.

<!-- By default, script will load after page becomes interactive -->
<Script src="https://example.com/sample.js" />

<!-- Script is injected server-side and fetched before any page hydration occurs -->
<Script strategy=”beforeInteractive” src="https://example.com/sample.js" />

<!-- Script is fetched later during browser idle time -->
<Script strategy=”lazyOnload” src="https://example.com/sample.js" />

Dezenas de milhares de aplicativos Next.js, incluindo sites populares como Patreon, Target e Noção: use o componente <Script>. Apesar da da eficácia, alguns desenvolvedores levantaram preocupações sobre os seguintes coisas:

  • Onde colocar o componente <Script> em um app Next.js enquanto obedece as instruções de instalação variadas de provedores terceirizados (experiência do desenvolvedor).
  • Qual estratégia de carregamento é a ideal para casos diferentes scripts de terceiros (experiência do usuário).

Para lidar com essas duas preocupações, lançamos o @next/third-parties, um biblioteca especializada que oferece um conjunto de componentes e utilitários otimizados personalizado para terceiros conhecidos.

Experiência do desenvolvedor: como facilitar o gerenciamento de bibliotecas de terceiros

Muitos scripts de terceiros são usados em uma porcentagem significativa dos sites Next.js, com o Gerenciador de tags do Google é o mais usado, 66% dos sites, respectivamente. O @next/third-parties se baseia no <Script>. introduzindo wrappers de nível superior projetados para simplificar o uso para esses casos de uso comuns.

import { GoogleAnalytics } from "@next/third-parties/google";

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
      <GoogleTagManager gtmId="GTM-XYZ" />
    </html>
  );
}

Google Analytics, outro script de terceiros amplamente utilizado (52% dos sites do Next.js) também tem um componente dedicado.

import { GoogleAnalytics } from "@next/third-parties/google";

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
      <GoogleAnalytics gaId="G-XYZ" />
    </html>
  );
}

O @next/third-parties simplifica o processo de carregamento de scripts usados com frequência. mas também amplia nossa capacidade de desenvolver utilitários para categorias, como incorporações. Por exemplo, as incorporações do Google Maps e do YouTube são usado em 8% e 4% de sites Next.js, e também enviamos componentes para torná-los mais fáceis de carregar.

import { GoogleMapsEmbed } from "@next/third-parties/google";
import { YouTubeEmbed } from "@next/third-parties/google";

export default function Page() {
  return (
    <>
      <GoogleMapsEmbed
        apiKey="XYZ"
        height={200}
        width="100%"
        mode="place"
        q="Brooklyn+Bridge,New+York,NY"
      />
      <YouTubeEmbed videoid="ogfYd705cRs" height={400} params="controls=0" />
    </>
  );
}

Experiência do usuário: carregamento mais rápido de bibliotecas de terceiros

Em um mundo perfeito, toda biblioteca terceirizada amplamente adotada seria otimizados, tornando desnecessárias todas as abstrações que melhoram o desempenho. No entanto, até que isso se torne realidade, podemos tentar melhorar integrada com frameworks conhecidos, como Next.js. Podemos testar diferentes técnicas de carregamento, garantir que os scripts sejam sequenciados da maneira correta e, por fim, compartilhar nossos feedbacks com terceiros provedores para incentivar mudanças upstream.

Veja as incorporações do YouTube, por exemplo. Em que algumas implementações alternativas desempenho muito melhor do que a incorporação nativa. No momento, a versão <YouTubeEmbed> o componente exportado por @next/third-parties usa lite-youtube-embed, que, quando demonstrado em uma demonstração com o Next.js, carrega consideravelmente mais rápido.

GIF que mostra a comparação de carregamento da página entre o componente de incorporação do YouTube e um iframe normal do YouTube
WebPageTest (Dispositivos móveis 4G - Virgínia, EUA)

Da mesma forma, para o Google Maps, incluímos loading="lazy" como um atributo padrão para o incorporado para garantir que o mapa só carregue quando estiver a uma determinada distância do na janela de visualização. Isso pode parecer um atributo óbvio a ser incluído, especialmente já que o SDK do Google Maps documentação incluí-lo no snippet de código de exemplo, mas apenas 45% dos sites da Next.js que incorporam o Google Maps usam o loading="lazy".

Como executar scripts de terceiros em um worker da Web

Uma técnica avançada que estamos explorando no @next/third-parties é torná-la descarregar os scripts de terceiros em um web worker. Popularizado por bibliotecas, como Partytown, isso pode reduzir o impacto de scripts de terceiros no desempenho da página de forma significativa, realocando-os totalmente da linha de execução principal.

O GIF animado a seguir mostra as variações nas tarefas longas e na linha de execução principal tempo de bloqueio ao aplicar diferentes estratégias do <Script> a um contêiner do GTM em um site do Next.js. Enquanto você alterna apenas entre as opções de estratégia, atrasa o tempo de execução desses scripts, realocando-os para um web worker elimina completamente o tempo que eles têm na linha de execução principal.

GIF que mostra as diferenças no tempo de bloqueio da linha de execução principal para as diferentes estratégias de script
WebPageTest (Dispositivos móveis 4G - Virgínia, EUA)

Neste exemplo específico, mover a execução do contêiner do GTM e seu scripts de tags associados a um worker da Web reduziu o TBT em 92%.

É importante ressaltar que, se não for administrada com cuidado, essa técnica pode quebrar muitos scripts de terceiros, o que dificulta a depuração. Nos próximos meses, vamos validar se há componentes de terceiros oferecidos pela @next/third-parties funcionem corretamente quando executados em um web worker. Nesse caso, vamos trabalham para oferecer aos desenvolvedores uma maneira fácil e opcional de usar técnica.

Próximas etapas

No processo de desenvolvimento desse pacote, ficou evidente que havia precisam centralizar recomendações de carregamento de terceiros para que outras estruturas também podem se beneficiar das mesmas técnicas usadas. Isso nos levou a criar serviços de Capital: uma biblioteca. que usa JSON para descrever técnicas de carregamento de terceiros, que atualmente serve como base para @next/third-parties.

Nas próximas etapas, continuaremos a nos concentrar na melhoria dos componentes fornecidos para Next.js, além de expandir nossos esforços para incluir utilitários semelhantes em outros estruturas e plataformas de CMS conhecidas. No momento, estamos em colaboração com a Nuxt mantenedores e planejam lançar utilitários de terceiros semelhantes ao ecossistema em breve.

Se um dos terceiros que você usa no seu app Next.js tiver suporte da @next/third-parties, instalar o pacote e tente! Gostaríamos de receber seu feedback sobre GitHub.