用于管理第三方库的 Next.js 软件包

2021 年,Chrome Aurora 团队推出了脚本 组件来改进 Next.js 中第三方脚本的加载性能。自推出以来 扩展了其功能,以便更轻松地加载第三方资源, 为开发者提供更快的速度

本博文概要介绍了我们已经发布的新功能, 尤其是 @next/third-parties 库,以及我们路线图中未来计划的概述。

第三方脚本的性能影响

在 Next.js 网站中,所有第三方请求中有 41% 是脚本。取消点赞其他内容 脚本可能需要花费相当长的时间来下载和执行, 这可能会阻止呈现并延迟用户互动。来自 Chrome 的数据 用户体验报告 (CrUX) 显示,会加载更多第三方的 Next.js 网站 脚本的 Interaction to Next Paint (INP)Largest Contentful Paint (LCP) 通过率。

<ph type="x-smartling-placeholder">
</ph> 条形图:显示实现良好 INP 和 LCP 得分的 Next.js 所占百分比与加载的第三方数量成比例的下降情况 <ph type="x-smartling-placeholder">
</ph> 2023 年 12 月的 CrUX 报告(110,823 个网站)

在此图表中观察到的相关性并不意味着存在因果关系。不过,本地 实验提供了更多证据,证明第三方脚本显著 对网页性能的影响例如,下面的图表比较了各种实验 (其中包含 18 个随机选择的 标记 - 已添加到分类法(一种热门的 Next.js 示例)中 应用。

<ph type="x-smartling-placeholder">
</ph> 一张条形图,显示了在加载网站(无论是否使用 Google 跟踪代码管理器)的情况下,各种实验指标的差异 <ph type="x-smartling-placeholder">
</ph> WebPageTest(移动 4G - 美国弗吉尼亚州)

WebPageTest 文档 提供了有关如何衡量这些时间的详细信息。我们看一下 所有这些实验指标都会受到 GTM 容器的影响对于 例如 Total Blocking Time (TBT),这是一项实用的实验 代理 INP - 实现了将近 20 倍的增长。

脚本组件

在 Next.js 中推出 <Script> 组件时,我们确保引入了 它通过一个与传统的 <script> 非常相似的人性化 API 元素。通过使用该 API,开发者可以在任意环境中 组件,而 Next.js 将负责对 关键资源加载完成后运行脚本。

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

成千上万的 Next.js 应用,包括一些热门网站,例如 PatreonTarget概念 - 使用 <Script> 组件。尽管 一些开发者对以下 事情:

  • <Script> 组件放置在 Next.js 应用中的什么位置,同时遵循 根据不同第三方提供商的不同安装说明 (开发者体验)
  • 对于不同的加载环境, 第三方脚本(用户体验)

为解决这两个问题,我们推出了 @next/third-parties, 提供一组经过优化的组件和实用程序的专用库 。

开发者体验:使第三方库更易于管理

很多 Next.js 网站都使用了许多第三方脚本, Google 跟踪代码管理器是最受欢迎的,使用方式包括: 分别为 66% 的网站@next/third-parties<Script> 的基础上构建而成 引入一个更高级的封装容器,用于简化 这些常见的使用场景

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- 另一种广泛使用的第三方脚本 (52% 的 Next.js 网站)- 也有自己的专用组件。

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 简化了加载常用脚本的过程, 同时也拓展了我们为其他第三方供应商开发实用程序的能力。 例如嵌入。例如,Google 地图和 YouTube 嵌入代码 用于 8%4% Next.js 网站的两个不同版本 以便更轻松地加载

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

用户体验:提高第三方库的加载速度

在理想情况下,每个被广泛采用的第三方库都将完全 因此无需进行任何用于提升性能的抽象操作。 不过,在这成为现实之前,我们可以试着 通过 Next.js 等热门框架集成后,能够获得良好的体验。我们可以 尝试不同的加载技术,确保脚本按顺序 正确方式,并最终与第三方分享我们的反馈 以鼓励向上游进行更改。

以 YouTube 嵌入内容为例。某些替代实现方式 相比原生嵌入代码的性能要好得多。目前,<YouTubeEmbed>@next/third-parties 个用户导出的组件使用了 lite-youtube-embed 使用“Hello, World”Next.js 比较,加载大量 。

<ph type="x-smartling-placeholder">
</ph> 此 GIF 显示了 YouTube 嵌入组件和常规 YouTube iframe 之间的网页加载比较 <ph type="x-smartling-placeholder">
</ph> WebPageTest(移动 4G - 美国弗吉尼亚州)

同样,对于 Google 地图,我们将 loading="lazy" 添加为 这样可以确保地图仅在 视口这似乎是一个很明显的属性,特别是 自 Google 地图推出以来, 文档 添加到他们的示例代码段中,但只有 嵌入 Google 地图的 45% 的 Next.js 网站使用了 loading="lazy"

在 Web Worker 中运行第三方脚本

我们正在 @next/third-parties 中探索的一项高级技术是 将第三方脚本分流给 Web Worker。推广方 Partytown 等库,这样可以减少 可显著减少第三方脚本对网页性能的影响, 将它们完全从主线程中移除。

下面的动画 GIF 显示了长时间运行的任务和主线程的变体 向 GTM 容器应用不同的 <Script> 策略时的阻塞时间 Next.js 网站中请注意,虽然切换策略选项 延迟了这些脚本的执行时间,并将其重新定位到 Web Worker 完全消除了它们在主线程上花费的时间。

<ph type="x-smartling-placeholder">
</ph> 此 GIF 显示了不同脚本策略在主线程阻塞时间方面的差异 <ph type="x-smartling-placeholder">
</ph> WebPageTest(移动 4G - 美国弗吉尼亚州)

在此特定示例中,将 GTM 容器的执行及其 将代码脚本关联到 Web Worker,将 TBT 减少了 92%

值得注意的是,如果管理方式不谨慎, 会破坏许多第三方脚本,难以进行调试。即将推出 我们会验证 在 Web Worker 中运行时,@next/third-parties 可以正常运行。如果是这样,我们将 为开发者提供一种简便的可选方式, 分析法。

后续步骤

在开发这个软件包的过程中,很明显, 需要集中第三方加载建议,以便其他框架 也可以从所用的相同基础技术中受益。这促使我们 建立第三方 Capital 是图书馆 使用 JSON 来描述第三方加载技术, 是 @next/third-parties 的基础。

接下来,我们将继续专注于改进所提供的组件。 并扩展我们的工作,将类似的实用程序纳入 热门框架和内容管理系统平台目前,我们正在与 Nuxt 合作 并且正计划发布类似的第三方实用程序, 生态系统。

如果您在 Next.js 应用中使用的第三方提供方均受 @next/third-parties, 安装软件包 尝试一下吧!我们非常期待听到您对 GitHub