Back返回部落格

Next.js 6.1

Next.js 6.1 版本提升了開發階段的可靠性和一致性

我們今天很榮幸推出正式版的 Next.js 6.1,主要特性包括:

  • 提升熱重載 (hot reloading) 可靠性
  • 程式碼庫改進
  • Next.js 代碼轉換工具 (codemods)

除了 Next.js 6.1 版本發布外,我們也興奮地宣布 nextjs.org 網站現已開源

提升熱重載可靠性

在 Next.js 6.1 之前的版本中,Next.js 會自動為使用者實作 react-hot-loader。這個函式庫能在熱重載時保持 React 的狀態。

react-hot-loader 會為 React 添加一些非標準的行為,例如它會忽略 shouldComponentUpdate,且元素 type 最終會變成代理元件而非實際的 React 元件。

為了確保 Next.js 的行為盡可能接近標準 React,我們移除了 react-hot-loader 作為依賴項,這使得開發模式與生產模式的行為更加一致。請注意 Next.js 的熱重載功能並未被移除,熱重載一直都是由 Next.js 內部處理的。

支援 TypeScript 及其他自訂擴展名的熱重載

預設情況下,Next.js 會自動尋找 pages 目錄下的 .js.jsx 檔案來定義路由。

隨著 Next.js 5 引入通用 webpack 配置,現在可以支援編譯成 JavaScript 的頂層頁面檔案。TypeScript 就是一個很好的例子,它使用 .ts.tsx 副檔名。

pageExtensionsnext.config.js 中的一個配置鍵,旨在讓 Next.js 插件能定義應被視為頁面的副檔名。例如 @zeit/next-typescript 定義了 .ts.tsx,或是 @zeit/next-mdx 這個插件說明文件中提到的頂層 .mdx 頁面。

以往在實作 pageExtensions 時,Next.js 插件需要自行實作用於熱重載的 hot-self-accept-loader。現在這已不再是必要條件,當在 pageExtensions 中添加副檔名時,hot-self-accept-loader 會自動套用。

程式碼庫改進

最近我們一直在為即將推出的功能鋪路,這涉及一些底層變更,從長遠來看將提升程式碼品質。

其中一項變更是將 server/build 目錄移至頂層的 build。這使得新貢獻者能更容易找到 webpack 和 babel 的配置。

我們也專注於在整個程式碼庫中添加 Flow 型別檢查。

對使用者來說更明顯的變更是 .next/dist 已被重新命名為 .next/server.next 目錄存放建置輸出結果,例如當你執行 next build 時,結果會儲存在 .next 中。

預渲染檔案現在存放在 server 目錄中

相同的常數值已被移至共用檔案:constants.js

Next.js 代碼轉換工具

當 Next.js 6.0 發布時,頁面元件中自動注入的 url 屬性被標記為棄用。移除 url 屬性的原因是我們希望讓一切行為更加可預測和明確。憑空出現一個神奇的 url 屬性並不符合這個目標。

推薦的替代方式是使用 withRouter 來獲取原本 url 屬性提供的相同屬性:

page.js
// 舊版寫法
class Page extends React.Component {
  render() {
    const { url } = this.props;
    return <div>{url.pathname}</div>;
  }
}
export default Page;

在 Next.js 6 之前的版本中,使用 url 取得路徑名稱的方式

page.js
// 新版寫法
import { withRouter } from 'next/router';
class Page extends React.Component {
  render() {
    const { router } = this.props;
    return <div>{router.pathname}</div>;
  }
}
export default withRouter(Page);

在 Next.js 6 之後的版本中,應使用 withRouter 注入的 router 來取得路徑名稱

我們致力於保持 Next.js 應用程式的升級路徑簡單,因此我們著手創建一個簡便的方法來將 url 的使用升級為 withRouter

這項努力的成果就是 next-codemod,這是一個代碼轉換工具庫,能讓升級特定棄用功能到新用法變得像執行一個命令那麼簡單。

我們提供的第一個代碼轉換工具是 url-to-withrouter,它能自動將許多使用 url 的情況轉換為 withRouter

Terminal
  jscodeshift -t ./url-to-withrouter.js pages/**/*.js

這會將 url 的使用轉換為 withRouter

了解更多

貢獻 Next.js

Next.js 社群正在成長,已有超過 450 位貢獻者向 Next.js 核心或範例程式碼提交了至少一次提交。

有多種方式可以回饋 Next.js:

nextjs.org 開源

我們興奮地宣布 nextjs.org 網站現已開源,這將使其成為 Next.js 的參考實作,並且問題回報與改進可以直接提交到專案中。

未來展望

我們一直在開發一些新功能來提升可靠性和效能,以下是幾個重點:

Webpack 4

Webpack 4 帶來許多改進:更好的程式碼分割 (code-splitting)、預設需要更少的配置,最重要的是更快的建置時間。在我們對一個超過 200 個頁面的應用程式進行的初步測試中,next build 的平均時間從 100 秒降低到 70 秒。在第二次執行(使用快取)時,next build 平均只需 21 秒。

無伺服器 Next.js

我們正在逐步進行變更,準備將 next start 移出到獨立的套件:next-server。這個套件將針對安裝大小和啟動時間進行高度優化。這些優化對於「無伺服器」(serverless) 使用情境是必要的,在這種情境下,每個請求或每幾個請求就會執行一個新的應用程式實例。這意味著應用程式的「冷啟動」(cold start) 必須優化到盡可能快。