Next.js 11的新功能

1,059 阅读8分钟

在6月15日举行的2021年Next.js大会上,来自世界各地的开发者共同见证了Next.js 11的发布,这是Vercel团队的最新版本。Next.js 11中包含的更新和新功能为一个已经很受欢迎的库提供了重大改进。

在这篇文章中,我们将深入了解这些更新中的一些内容,它们对用户和开发者的体验都有影响。让我们开始吧!

一致性

一致性的核心是一套原则或编码指南,它将一些决策责任从开发者身上移开。通过设置默认值和提供准则,更容易达到预期的结果,并防止常见的错误。

根据Next.js团队的说法"一致性是一个系统,它提供精心设计的解决方案和规则,以支持最佳的加载和核心Web Vitals"。

Next.js 11中新的一致性原则可以分为三个方面。

1.强大的默认值

框架必须在其核心部分建立某些设计模式,使开发者难以做错事。

2.2.可操作的规则

尽管有强大的默认值,但在某些情况下,开发者还是有责任在两条潜在的路径中进行选择。一套可操作的规则将使应用程序更容易遵守强大的性能标准,同时仍然允许足够水平的定制。

3.授权时间

编写时间在一个功能的开发周期中而不是在生产之后对性能给予重视。性能必须在代码提交前被考虑,而不是在产品发布后被当作一个基于分析的指标。

强制执行编写时间原则的最简单的方法之一是通过刷新规则。因此,Next.js 11支持开箱即用的ESLint。

要获得这些功能的好处,你必须通过运行以下代码升级到最新版本的Next.js。

npm i next@latest react@latest react-dom@latest

通过运行下面的代码来启用linting。

npx next lint

一旦我们升级我们的版本并启用ESLint,我们就会开始收到警告,提示我们向行业最佳实践的方向发展,帮助我们的应用程序遵守一致性准则。

脚本优化

许多网站包括第三方脚本以实现分析和广告。

脚本的加载顺序对页面性能有很大的影响,尤其是在处理一个网页上的几个外部脚本时。如果管理不当,脚本会严重降低用户体验。

Next.js引入了一个带有strategy 属性的脚本组件,可以处理很多这些问题。

让我们来测试一下!一个明显的变化是,我们不再需要用next/head 标签来包裹本地HTML脚本标签。

import Head from 'next/head'
function Home() {
 return (
    <>
      <Head>
        <script async src="https://polyfill.io/v3/polyfill.min.js?features=WebAnimations" />
      </Head>
    </>
  )
}

相反,我们可以直接使用本地HTML脚本标签,如下图所示。

import Script from 'next/script'
function Home() {
  return (
    <>
      <Script src="https://polyfill.io/v3/polyfill.min.js?features=WebAnimations" />
    </>
  )
}

在这个例子中,我们被建议使用beforeInteractive 策略来加载我们的polyfill。让我们改变策略,看看它对加载脚本有什么影响!

beforeInteractive

脚本在服务器端被注入到HTML中,并在绑定的JavaScript运行之前在浏览器上运行。使用下面的代码块,我们可以看到,在网络标签中,获取polyfill的网络调用是在其他一切之前进行的。

<Script src="https://polyfill.io/v3/polyfill.min.js?features=WebAnimations" 
`strategy="beforeInteractive" />

Beforeinteractive Script Polyfill First

afterInteractive

如果我们把策略改为afterInteractive ,那么脚本将在页面变成交互式后执行。在网络选项卡中,网络请求位于页面的底部,这将优先考虑更重要的任务。

After Interactive Script Execute Last

lazyOnload

将策略改为lazyOnload ,告诉Next.js在空闲时间加载脚本。获取polyfill的网络请求进一步移动到页面底部;没有其他懒惰加载的脚本,如下图所示。

Lazy On Load Polyfill

onLoad pro

除了上面的定制,如果我们想在脚本加载后执行一些代码,我们可以在脚本标签中使用onLoad 这个道具。onLoad 这个道具可以确保上面的脚本已经加载,让函数使用脚本的功能和变量而不会崩溃。

<Script
  id="my-script"
src="https://polyfill.io/v3/polyfill.min.js?features=WebAnimations"
  onLoad={() => {
    // this executes after the script is loaded
  }}
/>

图像的改进

Next.js 11包括对next/image 组件的改进,如减少布局偏移,为终端用户提供了更流畅的体验。

静态图像的尺寸检测

以前,要使用Image 组件渲染图像,heightwidth 道具是必须的。这些道具允许Next.js识别图像的大小,并渲染一个占位符,防止布局偏移和混乱的用户界面。

<Image
  alt="Fixing"
  src="/fixing.png"
  layout="intrinsic"
  width={700}
  height={475}
/>

Next.js 11提供了对src 道具的支持,可以使用import 关键字来应用它。如果你以这种方式导入源代码,就不需要单独指定heightwidth 道具。

import source from '../public/fixing.png'
<Image
  alt="Fixing"
  src={source}
  layout="intrinsic"
/>

图片占位符

在Next.js 11中,next/image 组件支持一个新的占位符道具,在较慢的连接上将value 设置为blurnext/image 组件将在加载原始图像时显示一个模糊的、低分辨率的图像。

<Image
  alt="Fixing"
  src={source}
  layout="intrinsic"
  placeholder="blur"
/>

模糊的图像将显示两到三秒,然后才是原始图像的最终加载。

此外,Next.js 11提供了一个选项,可以通过Image 标签提供一个自定义占位符,可以使用blurDataURL 道具显示。提供给该道具的值可以使用一个应用程序生成,如 blurha.sh.

Webpack 5默认支持

在10.2版本中宣布了对所有Next.js项目的Webpack 5支持,这些项目在其next.config.js 文件中没有定制Webpack配置。一个自定义的webpack配置看起来像下面的代码。

module.exports = {
  webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
    return config; // return the modified config
  },
}

从11版开始,webpack 5是所有Next.js应用程序的默认构建工具,与自定义配置无关。新构建的项目将可以使用webpack 5所带来的以下所有优化。

改进磁盘缓存

我们知道,我们可以使用命令next build 来触发构建。但如果在我们为项目触发的两次连续构建之间几乎没有什么变化呢?

Webpack 5允许有条件地只重新编译已经改变的文件。性能得到了改善,因为我们不需要重复处理没有被改变的块状文件。

改进的快速刷新

有了webpack 5,Next.js 11将快速刷新识别为一项特殊任务,并以更高的优先级执行,从而在每次保存任何代码变更时都能更快地刷新。

长期的资产缓存

随着webpack 5的实施,build 命令的构建过程是确定的。如果代码段没有变化,后续构建时产生的哈希值就不会改变,这意味着在浏览器中哈希的文件可以在更长时间内重复使用。

改进的树状摇动

Webpack 5提供了树状摇动commonJS 模块的能力,从捆绑中删除未使用的代码。

从Create React App迁移

由于社区的要求,Vercel团队推出了@next/codemod 工具,它支持React和Next.js项目之间的兼容。

我们可以运行该工具,提供给它一个使用Create React App脚本生成的项目,并将其转换为Next.js项目。让我们试试吧

首先,使用命令创建一个React应用。

npx create-react-app cra-demo

现在,我们已经初始化了一个新的React项目,我们可以使用命令运行我们的项目。

npm run start

你会看到熟悉的React屏幕。

React Loading Screen

接下来,运行脚本,从Create React App迁移到Next.js项目。

npx @next/codemod cra-to-next cra-demo

我们可以看到,该脚本对版本库做了几处改动,以将其移植到Next.js。这些改动包括。

  • 对脚本中的改动package.json
  • 增加了pages 文件夹,这是Next.js repo的一个主要特征
  • 改变了通过创建_app.js 文件导入CSS的方式
  • 创建一个next.config.js 文件并对其进行统计

Babel优化

Next.js 11采用了webpack的Babel加载器的全新实现其中包括内存中的配置缓存层,在10.1和10.2版本的改进中进一步减少了启动时间。

Next.js上线

Vercel的团队使用了一些下一代前端技术,如serviceWorker、WebAssembly和ES模块,以便在浏览器内提供一个协作环境。使用Next.js Live功能,开发者和设计师可以通过分享一个URL来进行协作。Live功能目前正在早期访问中运行

总结

很明显,这些升级构成了Next.js有史以来最突出的版本之一

对核心部分进行了修改,减少了启动时间,如Babel的优化,还有一致性建议,促使开发者采用成熟的解决方案。其他的改进是加载图片和脚本,使用户体验无缝。此外,我们现在有能力使用实时功能来改善协作。

由于这些原因和其他原因,Next.js 11版本看起来很有前途,值得升级。请试一试,并在评论中告诉我们你的想法

Next.js 11的新功能首次出现在LogRocket博客上。