跳至內容
返回部落格

2023 年 6 月 22 日,星期四

Next.js App Router 更新

作者:

App Router 代表了 Next.js 未來的全新基礎,但我們也意識到,仍有機會使其體驗更佳。我們想提供關於我們目前優先事項的最新消息。

對於即將發布的 Next.js 版本,我們將重點放在以下幾個方面:

  • 提升效能
  • 提升穩定性
  • 加強開發者教學

應用程式路由器

首先,說明應用程式路由器的設計理念會有所幫助。

透過與 React 對齊,超越頁面路由器的限制

隨著 Next.js 的採用率提高,以及越來越多大型應用程式的建構,我們收到了來自社群的回饋,並發現了一些我們開始達到頁面路由器限制的領域。

最值得注意的是,Next.js 頁面路由器並非為串流設計,而串流是現代 React 中的基石,它有助於我們解決面臨的限制,並實現我們對 Next.js 的長期願景。

為了製作串流友好的框架 API,以進行資料提取、資源載入和頁面詮釋資料,以及利用 React 更新的基元,需要對 Next.js 的核心架構進行大幅度的更改。

我們藉此機會以最新的 React 並行功能(例如伺服器元件、Suspense 等等)為基礎進行建構,這些功能已針對串流架構進行設計

漸進式採用是不可妥協的

我們不希望社群為了更新到最新版本的 Next.js 而必須從頭重建整個應用程式。我們相信漸進式採用是隨著時間推移發展應用程式的最佳策略。

  • 逐步遷移路由:您無需大幅改寫應用程式,即可將單一路由遷移至 App Router,並按照自己的步調開始利用新功能。請參閱我們的逐步採用指南觀看教學影片
  • 輕鬆回退:如果您對 App Router 的效能或開發體驗不滿意,可以輕鬆地將特定路由回退至 Pages Router。

我們正在探索更多機會,讓逐步採用更加輕鬆。

邁向穩定

我們在一年多前開始建構 Next.js App Router,並從那時起持續發布新功能和改進。

  • 初步公告:同年五月,我們發布了一份 RFC,概述我們讓路由和佈局更具彈性的計畫。
  • 早期 Beta 版:在 Next.js 13 中,我們發布了 App Router 的第一個版本,讓社群可以試用並提供早期回饋。
  • 穩定 API:為了回應回饋,我們將工作重點放在最終確定核心 API 上。在 13.4 版中,我們將 App Router 的核心 API 標記為穩定版,可供更廣泛地採用。

我們目前的重點

將其標記為穩定版,向社群發出訊號,表示核心 API 已確定,不會再進行需要重寫的主要重大變更。

從那時起,我們收到了許多寶貴的回饋,而使用率的提高也無可避免地暴露出一些錯誤和進一步改進的機會。

我們想讓您知道,我們尚未滿意 App Router 的使用體驗,而這是我們今後的首要任務。因此,讓我們來談談我們正在做的工作,以改善這種體驗。

提升效能

未來幾個月,我們將著重於效能的三個方面:本地迭代速度、生產構建時間和無伺服器效能。

本地開發效能

隨著 Next.js 的成熟以及使用它構建的應用程式規模的增長,我們一直在緩慢且逐步地將其底層架構的組件替換為更快、更具擴展性的工具。

  • 遷移進度:我們首先將 Babel (編譯) 和 Terser (壓縮) 替換為 SWC。這有助於提高本地迭代速度和生產構建時間。

  • 長期投資:無論應用程式規模大小,保持出色的快速重新整理效能意味著讓 Next.js 在本地開發過程中盡可能以增量方式運作,僅在需要時才打包和編譯程式碼。

    這就是我們目前正在努力將 webpack (打包) 替換為 Turbopack 的原因,它建立在一個低階增量計算引擎之上,可以將快取精細到個別函式的級別。

    遷移到 Turbopack 的 Next.js 應用程式即使規模增長,快速重新整理速度也會持續提升。

    在過去幾個月中,Turbo 團隊一直專注於提升 Turbopack 的效能,並支援所有 Next.js 功能和應用程式路由器 API。

    Turbopack 目前 處於測試階段 (next dev --turbo)。

  • 改進現有架構:除了投資未來之外,我們也在持續改進現有 webpack 架構的效能。

    對於某些 Next.js 應用程式,尤其是那些重新整理數千個模組的應用程式,我們已經看到一些關於本地開發和快速重新整理不穩定的報告。我們正在努力提升這方面的效能和可靠性。例如,我們最近新增了預先配置的設定 (modularizeImports) 來處理 大型圖示庫,這些圖示庫可能會意外地強制數千個模組在每次請求時重新載入。

建置時間效能

我們也正在使用 Turbopack (next build --turbo) 進行生產構建,並且已經 開始實作 這項工作的首批內容。預計在未來的版本中會有更多相關更新。

生產效能

最後,在 Vercel 上,我們正努力最佳化 Vercel 函式的效能和記憶體使用量,這些函式透過 Next.js 應用程式碼定義,確保在維持可擴展無伺服器架構優勢的同時,盡可能減少冷啟動。這項工作促成了 Next.js 中新的追蹤功能(實驗性),並開始探索伺服器端開發工具。

提升穩定性

頁面路由器已經存在六年了。應用程式路由器的發佈意味著引入了新的 API,這些 API 仍然很新,只有六個月的使用時間。我們在短時間內取得了很大的進展,但隨著我們從社群以及他們如何使用它中學到更多,仍然有改進的機會。

我們感謝社群積極採用應用程式路由器並提供回饋。我們正在調查許多錯誤報告,感謝您建立的最小重現範例,以幫助隔離問題並驗證修復。

自 13.4 以來,我們已經修補了許多關於穩定性的高影響錯誤,這些錯誤在最新的修補程式版本 (13.4.7) 中可用。我們將繼續高度重視效能和穩定性。

改善開發者教育 Next.js 功能

過去一年,我們一直致力於從頭開始重寫 Next.js 文件。這項工作現在已在 nextjs.org/docs 上線。我們想重點介紹一些重要的部分

  • 頁面路由器和應用程式路由器切換:您可以使用文件左側的按鈕,在頁面路由器 (Pages Router) 或應用程式路由器 (App Router) 文件之間切換。此外,您還可以根據您選擇的路由器來篩選搜尋結果。
  • 改進的內容和資訊架構:應用程式路由器文件的幾乎每一頁都已更新,包括更清晰的結構和頁面之間的連貫性,以及數百個新的插圖,以視覺方式解釋 Next.js 的運作方式。
  • 更多內容即將推出:我們還有更多工作要做。Vercel 的開發者體驗團隊正在努力提供額外的學習資源(包括更新的 /learn 課程,教授應用程式路由器)和真實世界的程式碼範例(包括重寫 Next.js Commerce)。

我們將在文件中TwitterYouTube 等平台發佈新的內容。

新的 React 功能

我們也聽到了您關於 Next.js 應用程式路由器中新增的 React 功能教學的意見回饋。

  • 伺服器元件:需要注意的是,像伺服器元件和諸如 "use client" 指令 這樣的約定並非 Next.js 特有的,而是 React 生態系統中更廣泛的一部分。

    我們的團隊、Meta 的合作夥伴以及其他獨立貢獻者正致力於提供更多關於這些主題的教學資源。這些概念仍處於早期階段,但我們對 React 生態系統和持續的教學充滿信心。

  • 客戶端元件:隨著近期圍繞伺服器元件的討論,務必注意客戶端元件並非效能的降低。客戶端是 React 模型中有效的一部分,並且不會消失。

    您可以將客戶端元件視為現有的 Next.js 生態系統,您喜愛的函式庫和工具仍可繼續運作。例如,我們經常看到的一個問題是是否需要在每個檔案中都加入 "use client" 才能使其成為客戶端元件。這並非必要,但我們理解這些概念是新的,需要時間學習。您只需要標記程式碼從伺服器轉移到客戶端的頂層邊界。這種架構允許您將伺服器和客戶端元件交織在一起

  • 不斷成長的第三方生態系統:除了教學資源外,圍繞 React 新功能的生態系統仍在不斷成長。例如,由 Chakra UI 的開發者所創建的 CSS-in-JS 函式庫 Panda CSS,最近宣布支援 React 伺服器元件。

  • 伺服器動作 (Alpha 版)伺服器動作 可啟用伺服器端資料異動、減少客戶端 JavaScript 以及漸進式增強的表單。我們目前不建議在正式環境中使用伺服器動作。我們感謝 Alpha 測試者的早期回饋,幫助我們塑造此功能的未來。

謝謝您

我們很感謝許多人選擇學習和使用 Next.js 進行開發。

我們將持續專注於效能、穩定性和開發者體驗,這些都會反映在接下來的 Next.js 版本中。我們希望使用 Next.js 是一種愉快的體驗,並讓您(和您的團隊)更有效率。

一如既往,我們非常感謝您的回饋。如果您在使用 Next.js 時遇到任何問題,請提交 issue,或開啟新的討論,我們會進行調查。