跳到主要內容
返回部落格

2020年1月6日 星期一

Next.js 9.1.7

發布者

Next.js 9 在六 (6) 個月前發布,接著 Next.js 9.1 在三 (3) 個月前發布。

這兩個版本為 Next.js 新增了非常強大的新功能,而沒有增加我們的基準客戶端執行階段大小。

從那時起,我們一直專注於完善和改進整個框架:9.1.19.1.29.1.39.1.49.1.59.1.69.1.7

讓我們深入了解這些版本改進了哪些方面!

所有這些優點都是非破壞性的,並且完全向後相容。您只需執行以下命令即可更新

終端機
npm i next@latest react@latest react-dom@latest

客戶端 JavaScript 大小減少 3% - 8% 以上

與 Google Chrome 團隊合作,所有 Next.js 應用程式都將受益於 7.5kB 或更多 的大小縮減。

基本應用程式應該會看到 3-4% 的應用程式大小縮減,而更進階的應用程式可能會看到 6-8%(或更多!)的縮減!

9.0.x9.1.x差異
基本應用程式68.9kB66.1kB4.1% 更小

這些節省部分歸功於 替換 url 套件的客戶端版本,改用基於 URL API 構建的版本。

透過為常用套件提供內建的小型 polyfill,實現了更多的大小縮減。您可以在這裡閱讀更多關於這些 polyfill 的資訊

最後,我們優化了 JSX 輸出,這將直接關聯到您的應用程式中 JSX 的數量來引入節省。

重新設計的生產版本建置 CLI 輸出

CLI 的生產版本建置輸出已重新設計以提高清晰度。由於 Next.js 是一個混合應用程式框架,因此每個頁面可能具有不同的特性。

新的輸出將每個頁面分類為以下其中一種

  • 伺服器端渲染 (Server):頁面在執行階段進行伺服器端渲染,這表示它使用 getInitialPropsgetServerProps (提案)
  • 自動靜態優化 (Static):頁面在建置時渲染為靜態 HTML,並將作為靜態檔案提供 (不使用 initial props)
  • 使用計算資料靜態產生 (SSG):頁面在建置時產生為靜態 HTML/JSON,並將作為靜態檔案提供 (使用 getStaticProps (提案))

此外,新的輸出顯示每個頁面的 Gzipped 大小 — 這些大小不包含所有頁面共用的檔案 (單獨顯示)。

每個頁面的大小將根據其感知的使用者體驗進行顏色標示

  • 小於 130kB綠色 — 您的應用程式在大多數網路和裝置條件下應具有良好的效能。
  • 介於 130kB 和 170kB 之間黃色 — 您的應用程式在 全球基準裝置 + 網路條件 下,載入時間接近 5-6 秒。
  • 超過 170kB紅色 — 您的應用程式在 相同條件 下,可能需要超過 6 秒才能載入。
The New Next.js Production CLI Output
新的 Next.js 生產版本 CLI 輸出

我們很樂意聽到您對新版建置輸出的意見回饋。

在不久的將來,Next.js 還將具有大小預算,以幫助您確保頁面在特定的大小範圍內。

新的內建 Polyfill:fetch()、URL 和 Object.assign

在檢查許多使用者的應用程式和我們的範例時,我們發現大多數應用程式都附帶一組相似的 polyfill。在某些情況下,應用程式甚至針對相同的功能具有重複的 polyfill。

為了補救這個問題,我們與 Google Chrome 團隊合作,內建了我們觀察到的三個最常見 API 的 polyfill。

使用差異載入,這些 polyfill 不會為全球 83% 的網路流量載入。這表示您的大多數使用者將不會下載與這些 polyfill 相關聯的位元組 — 它們只會在必要時下載。

此外,我們現在內建的任何知名的 polyfill 都將從您的生產版本建置中完全移除。這表示您將不會為您的其中一個依賴項意外匯入其中一個 API 的 polyfill 而付出代價。

內建 API 及其使其過時的 polyfill 清單如下

如果您在伺服器上使用 fetch(),您仍然需要匯入 isomorphic-fetchisomorphic-unfetch

此變更完全是非破壞性的,並且所有 polyfill 都是使用最符合規範的版本製作的。結果是在現代瀏覽器上,您的生產套件中 減少了最多 18kB 的 JavaScript

優化的頁面載入:更好的 FCP 和 TTI

Next.js 優化了其預載實作,以減少 FCP 和整體 TTI。

透過解決瀏覽器錯誤,CSS (如果使用) 現在正確地優先於 JavaScript。這產生更快的首次內容繪製,為您的終端使用者帶來視覺上更完整的網站。

此外,我們還優化了頁面預先提取,以使用較低優先順序的網路請求。

此外,這些請求僅在瀏覽器閒置時間發生,從而縮短了互動時間。這是因為瀏覽器將優先處理使您的應用程式具有互動性,而不是樂觀的預先提取。

FCP/TTI Before and After Optimizations
FCP/TTI 優化前後比較

支援最新的 JavaScript 功能

Next.js 具有先進、高度優化的編譯管道,可讓您使用最新的 JavaScript 功能。我們最近引入的優化直接促成了應用程式大小的 3-8% 縮減

可以使用這些 JavaScript 功能,而無需擔心瀏覽器相容性,因為我們會自動編譯您的程式碼以支援所有瀏覽器 (不包括生命週期結束的版本)。這包括 ES6+ 功能,例如 async/await (ES2017)Object Rest/Spread Properties (ES2018)Dynamic import() (ES2020) 等等!

在此版本中,我們很高興宣布支援 可選鏈結 (Stage 4)Nullish Coalescing (Stage 4)

pages/index.js
function Page(props) {
  return (
    <p>{props?.deeply?.nested?.value}</p>
    /* ⬆ If deeply.nested.value is not available it won't render */
  );
}
 
export default Page;

可選鏈結運算子 (?.)

pages/index.js
function Page(props) {
  return (
    <p>{props.something ?? 'Default value'}</p>
    /* ⬆ results in "Default value" */
  );
}
 
export default Page;

Nullish Coalescing 運算子 (??)

未來,我們計劃透過自動 module / nomodule 建置 輸出更優化的套件。

next export 應用程式的零配置部署支援

Next.js 的 next export 命令現在可與 Vercel 的 零配置 開箱即用。在此變更之前,使用 next export 的使用者需要建立自訂的 now.json

Vercel 上使用 Next.js 的 export-mode,就像在 package.json 中加入以下 build 腳本一樣簡單

package.json
{
  "scripts": {
    "build": "next build && next export"
  }
}

然後,您可以僅使用一個命令將您的 Next.js 應用程式部署到 Vercel。如果您尚未安裝 Vercel,您可以透過安裝 Vercel CLI 來完成。

終端機
now

React 嚴格模式相容性和選擇加入

完整的 Next.js 執行階段現在與嚴格模式相容。這包括更新 Next.js 的 head manager (<Head>)、next/dynamic 和其他核心功能。這表示執行階段現在利用 hooks 或已消除已棄用的生命週期,並且正在使用 React 的新 Context API。

我們還新增了一個方便的選擇加入選項,供您為應用程式啟用嚴格模式。

若要執行此操作,請在您的 next.config.js 中設定以下選項

next.config.js
module.exports = {
  reactStrictMode: true,
};

如果您或您的團隊尚未準備好在整個應用程式中使用 Strict Mode,那也沒關係!您可以透過逐頁方式逐步遷移,使用 <React.StrictMode>

雖然非必要,Strict Mode 將在未來解鎖許多最佳化功能。 因此,我們建議您盡早研究它!

針對 React Nightly Build 進行自動化測試

透過與 React 核心團隊的密切合作,我們現在每 12 小時針對 React 的 next channel 測試 Next.js

這些測試有助於確保我們已準備好並與 React 未來的版本相容。 相容性是 Next.js 非常重視的事情,我們致力於 Next.js 的長期 API 穩定性。

React 核心團隊已記錄此流程,希望能有 React 生態系統中的其他專案能效法。

社群

我們對於即將到來的變更感到興奮,這些變更將改善所有 Next.js 應用程式的大小和效能。

此外,Next.js 社群仍在擴張

  • 我們已經有超過 865 位獨立貢獻者。
  • 在 GitHub 上,這個專案已被標註超過 43,700 次星號。
  • examples 目錄 有超過 220 個範例。

Next.js 社群現在有超過 13,600 名成員。 加入我們!

我們感謝我們的社群以及所有外部回饋和貢獻,這些都幫助塑造了這個版本。