Next-js 12 發佈!迄今以來最大更新!

就在剛剛過去的 10 月 27 日,Next.js 團隊官宣了 12 版本發佈。

就像在 Next.js Conf 上宣佈的那樣,Next.js 12Next.js 有史以來最大的版本,更新概覽如下:

我們可以通過 npm i next@latest 安裝最新版的 Next.js

Rust 編譯器

Next.js 12 現在默認啓用了 Rust 編譯器,這使它大概提高了 3 倍的刷新速度和 5 倍的構建速度。

這其實也是 Rust 邁出的一大步,因爲它的穩定性現在在世界上最大的代碼庫之一上面得到的驗證。

在編譯方便,使用 Rust 進行編譯比 Babel 快了 17 倍,另外他們對 webpack 進行了大量的改進,包括優化快速刷新和按需引入。

Next.js 團隊爲了從 Babel 遷移到 Rust 費了不小的功夫,比如他們實現了一個新的 Rust CSS 解析器 styled-jsx

在壓縮方面,Rust 編譯器比 Terser 壓縮的速度要快 7 倍,壓縮是可選的:

// next.config.js

module.exports = {
  swcMinify: true
}

值得注意的是,Next.jsRust 編譯器是基於 SWC 實現的。

swc 是一個用 Rust 寫的高性能 TypeScript / JavaScript 轉譯器,類似於 babel。

爲此,Next.js 還專門把 SWC 作者 DongYoon KangParcel 的核心貢獻者 Maia Teegarden 挖過去了。

Middleware

Next.js 12 在這個版本引入了中間件的概念,這就類似於 Koa 框架裏面的中間件,它能讓你通過代碼來實現更靈活的操作,而不只是通過那些煩人的配置。

在中間件裏,你可以拿到用戶的完整請求,然後你就可以對請求進行重寫、重定向、添加 Header 等操作。

中間件裏也支持例如 fetch 這樣的標準運行時 Web API

如果想要在 Next.js 中使用中間件,你可以創建一個 pages/_middleware.js 文件:

// pages/_middleware.js

export function middleware(req, ev) {
  return new Response('Hello, world!')
}

React 18 支持

Next.js 團隊一直在和 Facebook 團隊保持着緊密的合作, 雖然現在 React 18 只發布了 alpha 版本,在 Next.js 12 中依然爲它提供了支持。

npm install react@alpha react-dom@alpha

你只需要開啓一些實驗配置就可以使用 React 18 中的 Suspense、全自動批處理、startTransition 這些 API。

流式服務端渲染

React 18 中的併發渲染包括對服務器端 SuspenseSSR 流式渲染的支持,你可以通過開啓下面的配置啓用:

// next.config.js
module.exports = {
  experimental: {
    concurrentFeatures: true
  }
}

React Server Component

React Server Component 就是讓組件擁有在服務端渲染的能力,從而解決 用戶體驗、可維護性、性能 這個不可能的三角問題。

Server Component 的主要兩點如下:

你可以通過下面的配置開啓:

// next.config.js
module.exports = {
  experimental: {
    concurrentFeatures: true,
    serverComponents: true
  }
}

ES Modules

ES ModulesJavaScript 帶來了官方的、標準化的模塊系統。目前所有主流瀏覽器以及Node.js 都對它提供了支持。

使用 ES Modules 可以大大的減少模塊依賴解析的時間,並且可以減小包體積。

Next.js 11.1 開始,Next 添加了對 ES Modules 優先於 CommonJS 模塊的實驗性支持。在 Next.js 12 中,默認開啓,但是現在也仍然支持導入僅提供 CommonJSNPM 包。

URL imports

Next.js 12 開始,我們可以直接通過 URL 導入任何一個包,Next.js 能夠像處理本地依賴一樣處理遠程 HTTP(S) 資源。

import confetti from 'https://cdn.skypack.dev/canvas-confetti'

如果檢測到 URL importsNext.js 會生成一個 next.lock 文件來跟蹤遠程資源。URL imports 導入的包會在本地緩存一份,所以我們也不用擔心沒有網不能用。

我們只需要將允許導入的 url 前綴添加到配置文件中就可以了:

module.exports = {
  experimental: {
    urlImports: ['https://cdn.skypack.dev']
  }
}

支持 AVIF 圖片

內置的圖像優化 API 現在支持 AVIF 格式了,與 WebP 相比,圖像會小 20%

WebP 相比,AVIF 格式可能需要更長的時間來優化,所以我們可以通過配置 next.config.jsimages.formats 屬性來進行選擇性啓用。

module.exports = {
  images: {
    formats: ['image/avif''image/webp']
  }
}

另外,對於不同瀏覽器的兼容情況,Next.js 會根據瀏覽器的嗅探情況,自動選擇用 AVIFWebp

更多詳情請關注 Next.js 官方博客:https://z.org/blog/next-12

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/iZzGBqPyU8PsF3Z8CBa72Q