Un paquete de Next.js para administrar bibliotecas de terceros

En 2021, el equipo de Chrome Aurora present� el m�dulo Script componente para mejorar la cargar el rendimiento de secuencias de comandos de terceros en Next.js Desde su lanzamiento, expandi� sus capacidades para facilitar la carga de recursos de terceros m�s r�pido para los desarrolladores.

Esta entrada de blog ofrece una descripci�n general de las funciones nuevas que hemos lanzado, en particular el @next/third-parties y una descripci�n de las iniciativas futuras en nuestra hoja de ruta.

Implicaciones en el rendimiento de las secuencias de comandos de terceros

El 41% de todas las solicitudes de terceros en los sitios de Next.js son secuencias de comandos. Desmarcar Me gusta en otro contenido los tipos de secuencias de comandos, las secuencias de comandos pueden tardar bastante tiempo en descargarse y ejecutarse lo que puede bloquear la renderizaci�n y retrasar la interactividad del usuario. Datos de Chrome El Informe sobre la experiencia del usuario (CrUX) muestra que los sitios de Next.js que cargan m�s las secuencias de comandos tienen una interacci�n con el siguiente procesamiento de imagen (INP) y el Procesamiento de imagen con contenido m�s grande (LCP).

Gr�fico de barras que muestra una disminuci�n en el porcentaje de Next.js que logra buenas puntuaciones de INP y LCP en proporci�n a la cantidad de terceros cargados
Informe CrUX de diciembre de 2023 (110,823 sitios)
.

La correlaci�n observada en este gr�fico no implica causalidad. Sin embargo, la configuraci�n local proporcionan evidencia adicional de que las secuencias de comandos de terceros afectar el rendimiento de la p�gina. Por ejemplo, en el siguiente gr�fico se comparan varios labs m�tricas cuando se selecciona un contenedor de Google Tag Manager, compuesto por 18 etiquetas) se agrega a Taxonomy, un ejemplo popular de Next.js .

Gr�fico de barras que muestra la diferencia en varias m�tricas del lab cuando un sitio se carga con y sin Google Tag Manager
WebPageTest (Mobile 4G - Virginia, EE.UU.)
.

Documentaci�n de WebPageTest proporciona detalles sobre c�mo se miden estos plazos. A simple vista, que todas estas m�tricas del lab se ven afectadas por el contenedor de GTM. Para Ejemplo, Total Blocking Time (TBT), un lab �til que se aproxima a INP, observ� un aumento de casi 20 veces.

Componente de secuencia de comandos

Cuando enviamos el componente <Script> en Next.js, nos aseguramos de presentar a trav�s de una API f�cil de usar que se parece mucho a la <script> tradicional . Al usarla, los desarrolladores pueden ubicar una secuencia de comandos de terceros en cualquier de la aplicaci�n en su aplicaci�n, y Next.js se encargar� una secuencia de comandos despu�s de que se cargan los recursos esenciales.

<!-- 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" />

Decenas de miles de aplicaciones de Next.js, incluidos sitios populares como Patreon, Target y Noción: usa el componente <Script>. A pesar de su eficacia, algunos desarrolladores han planteado inquietudes sobre los siguientes cosas:

  • D�nde colocar el componente <Script> en una app de Next.js mientras se cumple las diversas instrucciones de instalaci�n de los distintos proveedores externos (experiencia del desarrollador).
  • �Qu� estrategia de carga es la m�s �ptima para diferentes secuencias de comandos de terceros (experiencia del usuario).

Para abordar ambas inquietudes, lanzamos @next/third-parties, un biblioteca especializada, que ofrece un conjunto de componentes y utilidades optimizados adaptado para terceros populares.

Experiencia para desarrolladores: Facilitamos la administraci�n de bibliotecas de terceros

Muchas secuencias de comandos de terceros se usan en un porcentaje significativo de sitios de Next.js, con Google Tag Manager es el m�s popular, usado por 66% de los sitios, respectivamente. @next/third-parties se basa en <Script>. principal introduciendo wrappers de nivel superior dise�ados para simplificar el uso de estos casos de uso comunes.

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, otra secuencia de comandos de terceros muy utilizada (52% de los sitios de Next.js), tambi�n tiene un componente propio 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>
  );
}

@next/third-parties simplifica el proceso de carga de secuencias de comandos de uso general. pero tambi�n ampl�a nuestra capacidad de desarrollar utilidades para otros categor�as, como incorporaciones. Por ejemplo, las incorporaciones de Google Maps y YouTube se usado en Un 8% y 4% de los sitios web Next.js respectivamente y tambi�n hemos enviado componentes para que sean m�s f�ciles de cargar.

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" />
    </>
  );
}

Experiencia del usuario: C�mo acelerar la carga de las bibliotecas de terceros

En un mundo ideal, todas las bibliotecas de terceros ampliamente adoptadas optimizado, lo que hace que las abstracciones que mejoren su rendimiento sean innecesarias. Sin embargo, hasta que esto se haga realidad, podemos tratar de mejorar experiencia cuando se integra a trav�s de frameworks populares, como Next.js. Podemos Experimente con distintas t�cnicas de carga, aseg�rese de que las secuencias de comandos est�n secuenciadas de la manera correcta y, en �ltima instancia, compartiremos nuestros comentarios con para fomentar los cambios ascendentes.

Tomemos como ejemplo las incorporaciones de YouTube. Algunas implementaciones alternativas un rendimiento mucho mejor que la incorporaci�n nativa. Actualmente, el <YouTubeEmbed> componente exportado por @next/third-parties usa lite-youtube-embed, que, cuando se muestra en la p�gina "Hello, World" Comparaci�n de Next.js, se carga considerablemente m�s r�pido.

GIF que muestra la comparaci�n de carga de p�gina entre el componente de incorporaci�n de YouTube y un iframe normal de YouTube
WebPageTest (Mobile 4G - Virginia, EE.UU.)
.

Del mismo modo, en el caso de Google Maps, incluimos loading="lazy" como atributo predeterminado para insertar para asegurarte de que el mapa solo se cargue a cierta distancia de el viewport. Puede parecer un atributo obvio, en especial ya que Google Maps documentaci�n lo incluye en el fragmento de c�digo de ejemplo, El 45% de los sitios de Next.js que incorporan Google Maps utilizan loading="lazy".

Ejecuci�n de secuencias de comandos de terceros en un trabajador web

Una t�cnica avanzada que estamos explorando en @next/third-parties es hacer que sea y facilitar la descarga de secuencias de comandos de terceros en un trabajador web. Popularizado por bibliotecas como Partytown, esto puede reducir el impacto de las secuencias de comandos de terceros en el rendimiento de las p�ginas reubicarlas por completo fuera del subproceso principal.

En el siguiente GIF animado, se muestran las variaciones en las tareas largas y el subproceso principal tiempo de bloqueo cuando se aplican diferentes estrategias de <Script> a un contenedor de GTM en un sitio de Next.js. Si bien solo alterna entre las diferentes opciones de estrategia, Retrasa el tiempo de ejecuci�n de estas secuencias de comandos y las reubica en un trabajador web elimina por completo su tiempo en el subproceso principal.

GIF que muestra diferencias en el tiempo de bloqueo del subproceso principal para las diferentes estrategias de secuencia de comandos
WebPageTest (Mobile 4G - Virginia, EE.UU.)
.

En este ejemplo en particular, trasladar la ejecuci�n del contenedor GTM y su secuencias de comandos de etiquetas asociadas a un trabajador web redujo el TBT en un 92%.

Vale la pena se�alar que, si no se administra con cuidado, esta t�cnica puede romper muchas secuencias de comandos de terceros, lo que dificulta la depuraci�n. En las pr�ximas validaremos si alg�n componente de terceros ofrece @next/third-parties funcionan correctamente cuando se ejecutan en un trabajador web. Si es as�, a fin de proporcionar a los desarrolladores una forma f�cil y opcional de usar t�cnica.

Pr�ximos pasos

En el proceso de desarrollo de este paquete, fue evidente que hab�a una necesitan centralizar recomendaciones de carga de terceros para que otros frameworks tambi�n podr�a beneficiarse de las mismas t�cnicas subyacentes empleadas. Esto nos llev� a crear herramientas de Capital, una biblioteca que usa JSON para describir t�cnicas de carga de terceros, que actualmente y sirve como base para @next/third-parties.

En los pr�ximos pasos, seguiremos enfoc�ndonos en mejorar los componentes proporcionados para Next.js y tambi�n ampliaremos nuestros esfuerzos para incluir utilidades similares en otras y plataformas de CMS populares. Actualmente, estamos en colaboraci�n con Nuxt y planean lanzar utilidades de terceros similares adaptadas a su ecosistema en un futuro cercano.

Si alguno de los terceros que usas en tu app de Next.js es compatible con @next/third-parties, instalar el paquete �y pru�bala! Nos encantar�a recibir tus comentarios sobre GitHub: