跳到内容
返回博客

2021年6月15日,星期二

Next.js 11

发布者

正如我们在Next.js Conf上宣布的那样,我们创建最佳开发体验的使命仍在继续,Next.js 11带来:

  • 一致性:一个提供精心设计的解决方案以支持最佳用户体验的系统。
  • 性能改进:进一步优化以改善冷启动时间,让您可以更快地开始编码。
  • next/script:自动优先加载第三方脚本以提高性能。
  • next/image:通过自动尺寸检测和支持模糊占位符,减少布局偏移并创建更流畅的视觉体验。
  • Webpack 5:现在为所有 Next.js 应用程序默认启用,为所有 Next.js 开发者带来这些好处
  • Create React App 迁移(实验性):自动将 Create React App 转换为 Next.js 兼容。
  • Next.js Live(预览版):在浏览器中与您的团队实时编码。

立即运行 npm i next@latest react@latest react-dom@latest 进行更新,并参考下面的迁移指南

一致性

即使有了框架中的优秀工具和自动优化,网站所有者和应用程序开发者也经常被要求成为用户体验质量方面(如性能、安全性和可访问性)的专家。随着功能的增加和团队的扩大,开发者需要以不同的方式思考。

通过他们构建大型 Web 应用程序(如搜索和地图)的工作,Google 已经证明,框架在团队和应用程序规模扩展时保持质量方面可以发挥关键作用。通过利用一套强大的默认值和保障措施,他们使开发者能够更专注于功能和产品。

今天,Google 的 Web 平台团队已开始将他们的系统开源,即 Next.js 的一致性

一致性是一个系统,它提供精心设计的解决方案和规则,以支持最佳加载和核心 Web 指标,并会进一步增加对安全性、可访问性等其他质量方面的支持。这些解决方案使您的团队无需记住所有最新的最佳加载性能规则,同时仍为您提供灵活性,以便为您的应用程序做出正确的选择。

除了许多由性能研究支持的基础优化之外,Next.js 11 现在开箱即用支持ESLint,使在开发过程中更容易捕获特定于框架的问题,并为您的团队设置指导方针,以确保即使在规模扩展时也能遵循最佳实践。

要开始使用 ESLint,请在升级到 Next.js 11 后运行 npx next lint。ESLint 集成适用于新的和现有的 Next.js 应用程序,提供一套新的规则来帮助开发人员构建更好的应用程序。

终端
$ npx next lint
We created the .eslintrc file for you and included the base Next.js ESLint configuration.
 
./pages/about.js
7:9  Warning: Do not include stylesheets manually. See: https://nextjs.net.cn/docs/messages/no-css-tags.  @next/next/no-css-tags
10:7  Warning: External synchronous scripts are forbidden. See: https://nextjs.net.cn/docs/messages/no-sync-scripts.  @next/next/no-sync-scripts
 
./pages/index.js
4:10  Warning: Do not use the HTML <a> tag to navigate to /about/. Use Link from 'next/link' instead. See: https://nextjs.net.cn/docs/messages/no-html-link-for-pages.  @next/next/no-html-link-for-pages
 
Need to disable some ESLint rules? Learn more here: https://nextjs.net.cn/docs/pages/building-your-application/configuring/eslint#disabling-rules
 
  Done in 1.94s.

Google 博客上了解更多关于框架一致性的信息。

性能改进

自 Next.js 10 以来,我们一直致力于进一步改善 Next.js 的开发者体验。在10.110.2中,我们将启动时间提高了 24%,并通过 React Fast Refresh 将更改的处理时间缩短了 40%。您只需更新 Next.js 即可获得这些惊人的速度提升。

Next.js 11 包含了 Babel 的另一个优化,以进一步减少启动时间。我们为 webpack 创建了一个全新的 Babel loader 实现,优化了加载并添加了一个内存中的配置缓存层。实际上,这意味着对开发者而言没有变化,但最终会带来更快的开发体验。

脚本优化

新的 Next.js Script 组件是一项基础优化,它使开发人员能够设置第三方脚本的加载优先级,从而节省开发人员时间并提高加载性能。

网站通常需要第三方服务来处理分析、广告、客户支持小部件和同意管理等事宜。然而,这些脚本往往会严重影响加载性能,并可能降低用户体验。开发人员常常难以决定将它们放置在应用程序的何处以实现最佳加载。

使用 next/script,您可以定义 strategy 属性,Next.js 将自动优先处理它们以提高加载性能

  • beforeInteractive:用于需要在页面可交互之前获取和执行的关键脚本,例如机器人检测和同意管理。这些脚本从服务器注入到初始 HTML 中,并在自捆绑 JavaScript 执行之前运行。
  • afterInteractive默认):用于可在页面可交互之后获取和执行的脚本,例如标签管理器和分析。这些脚本在客户端注入,并在水合作用后运行。
  • lazyOnload:用于可在空闲时间等待加载的脚本,例如聊天支持和社交媒体小部件。
<Script
  src={url}
  strategy="beforeInteractive" // lazyOnload, afterInteractive
/>

您还可以在加载后运行代码。例如,您可以等到用户回答同意后才执行代码。

<Script
  src={url} // consent mangagement
  strategy="beforeInteractive"
  onLoad={() => {
    // If loaded successfully, then you can load other scripts in sequence
  }}
/>

我们还将 Next.js 11 中脚本的默认加载体验从预加载和 async 更改为 defer。第三方脚本通常与优先级更高的资源(如 CSS、字体和图像)竞争。相对于这些资源以及其他脚本,维护正确的加载顺序给开发人员带来了不必要的负担。

通过提供一个默认加载策略为 afterInteractive 的脚本组件,开发人员现在拥有了最佳性能的更好默认值,同时仍然可以根据需要选择 beforeInteractive

要了解有关更改默认设置背后的技术选择的更多信息,请查看 RFC 和 Google Chrome 团队的预加载挑战

图像改进

我们很高兴分享 next/image 组件中社区最常请求的两个功能,以减少累计布局偏移并创建更流畅的视觉体验。

自动尺寸检测(本地图片)

使用 import 关键字作为图像 src 来自动为静态图像定义 widthheight

例如,使用内置的 Image 组件现在甚至更容易

pages/index.js
import Image from 'next/image';
import author from '../public/me.png';
 
export default function Home() {
  return (
    // When importing the image as the source, you
    // don't need to define `width` and `height`.
    <Image src={author} alt="Picture of the author" />
  );
}

图片占位符

next/image 现在支持模糊占位符,以缓解从空白空间到图像的过渡,并减少感知加载时间,特别是对于互联网连接较慢的用户。

要使用模糊占位符,请将 placeholder="blur" 添加到您的图像中。

<Image src={author} alt="Picture of the author" placeholder="blur" />

Next.js 还支持通过允许您提供自定义 blurDataURL 来模糊动态图像,该 URL 由您的后端提供。例如,您可以在服务器上生成一个 blurha.sh

<Image
  src="https://nextjs.net.cn/static/blog/next-11/learn.png"
  blurDataURL="data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAb/xAAhEAACAQMDBQAAAAAAAAAAAAABAgMABAUGIWEREiMxUf/EABUBAQEAAAAAAAAAAAAAAAAAAAMF/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAECEgMRkf/aAAwDAQACEQMRAD8AltJagyeH0AthI5xdrLcNM91BF5pX2HaH9bcfaSXWGaRmknyJckliyjqTzSlT54b6bk+h0R//2Q=="
  alt="Picture of the author"
  placeholder="blur"
/>

Webpack 5

在 Next.js 10.2 中,我们将 webpack 5 的推广范围扩展到所有没有在其 next.config.js 中进行自定义 webpack 配置的应用程序。今天,我们将 webpack 5 设为所有 Next.js 应用程序的默认配置,这将提供各种功能和改进

我们与社区密切合作,确保平稳过渡到 webpack 5,超过 3400 个现有 Next.js 集成测试在每个拉取请求上都启用了 webpack 5 运行。

如果您的应用程序有自定义的 webpack 配置,我们建议您遵循webpack 5 的升级文档。如果您遇到任何问题,请与我们分享反馈

CRA 迁移

在过去的六个月里,我们看到越来越多的应用程序从 Create React App 迁移到 Next.js,以利用 Next.js 提供的许多开发者体验和最终用户性能改进。

为了帮助开发者将其应用程序转换为 Next.js,我们在 @next/codemod 中引入了一个新工具,该工具可以自动将 Create React App 应用程序转换为 Next.js 兼容。

该转换会自动添加 pages/ 目录并将 CSS 导入移动到正确的位置。它还会在 Next.js 中启用 Create React App 兼容模式,以确保 Create React App 中使用的一些模式与 Next.js 兼容。

通过利用新的转换,您可以逐步采用 Next.js,同时保持现有 Create React App 应用程序的功能。

要开始迁移您的 Create React App 项目,请使用以下命令

终端
npx @next/codemod cra-to-next

此功能目前处于实验阶段,请在此讨论中分享任何反馈。

Next.js Live(预览版)

Next.js Live 是我们使命的延续,旨在使开发不仅更快、更愉快,而且最重要的是更具包容性,惠及整个组织。通过利用 ServiceWorker、WebAssembly 和 ES Modules 等尖端技术,Next.js Live 将整个开发过程置于 Web 浏览器中。这带来了诸多可能性,例如通过 URL 即时协作和共享,无需构建步骤。对于开发人员而言,这意味着更快的反馈循环,更少的构建等待时间,以及在浏览器中实时进行结对编程和编辑。

要了解更多关于 Next.js Live 以及如何将其与 Vercel 的实时协作引擎结合使用,请参阅文档的Next.js Live部分。

升级指南

Next.js 11 引入了一些破坏性更改,这些更改不应影响大多数用户。这些遗留功能多年来一直以向后兼容的方式维护,有些甚至可以追溯到 v4.0

移除这些功能是为了减小打包大小并确保代码库在未来可维护。要了解有关从版本 10 升级到 11 的更多信息,请参阅升级指南

在 Next.js 11 中,最低 React 版本已更新为 17.0.2。请参阅React 17 博客文章了解更多详情。我们还与 React 团队密切合作,他们正在推出React 18。当使用 React 18 alpha 时,Next.js 11 使用 createRoot

社区

Next.js 是由超过 1600 名独立开发者、Google 和 Facebook 等行业合作伙伴以及我们的核心团队共同努力的成果。

我们很自豪地看到社区持续壮大。仅在过去六个月中,Next.js 在 NPM 上的下载量就增长了 50%,从 410 万次增加到 620 万次,Alexa 全球前 10000 名网站中使用 Next.js 的主页数量也增长了 50%。

本次发布得到了以下贡献者的支持:@kahy9、@ljosberinn、@leerob、@kettanaito、@thomasboyt、@hussainanjar、@styfle、@devknoll、@LiuuY、@timneutkens、@housseindjirdeh、@PepijnSenders、@janicklas-ralph、@payapula、@tmtk75、@ijjk、@hiramhuang、@daku10、@atcastle、@matamatanot、@pelhage、@Lukazovic、@Mzaien、@gleich、@geshan、@Munawwar、@ykzts、@vitalybaev、@mottox2、@vvo、@chrisneven、@turneand、@d3lm、@akellbl4、@sokra、@johnjago、@alicanyildirim、@sanathusk、@valse、@samrobbins85、@SamVerschueren、@ademilter、@ctjlewis、@brandondc741、@eltociear、@martpie、@kasipavankumar、@joecohens、@alexbrazier、@jamsinclair、@fabianishere、@rokinsky、@msidqi、@rubensdemelo、@Simply007、@bradlc、@SinimaWath、@rgabs、@darshkpatel、@sumanthratna、@shuding、@prophet1996、@Joonpark13、@tremby、@stefanprobst、@dopt、@rishabhpoddar、@aydinkn、@ErfanMirzapour、@tubbo、@frontendtony、@eric-burel、@iker-barriocanal、@eps1lon、@Gigiz、@mplis、@HaNdTriX 和 @jigsawye。

以下功能在 Next.js Conf 中提及,但已通过版本10.110.2提前发布

  • 自动 Web 字体优化:通过内联字体 CSS 提高性能。
  • 更快的刷新:刷新速度提高 100 毫秒至 200 毫秒。
  • next/image 改进:支持 Apple Silicon (M1),以及更多布局和加载器选项。
  • Next.js Commerce Shopify 集成:用于可组合电子商务应用程序的灵活数据层。Next.js Commerce 目前支持 Shopify、BigCommerce、Saleor、Swell 和 Vendure。