CAFECA-IO / KnowledgeManagement

Creating, Sharing, Using and Managing the knowledge and information of CAFECA
https://mermer.com.tw/knowledge-management
MIT License
0 stars 1 forks source link

[KM] App Router vs Pages Router in Next.js (撰寫 part 4) #244

Closed godmmt closed 1 month ago

godmmt commented 1 month ago

文章位置: https://github.com/CAFECA-IO/KnowledgeManagement/blob/master/NextJs/app-router-vs-pages-router-in-next-js.md

此張 issue 待完成任務

godmmt commented 1 month ago

(更新) 文章架構

godmmt commented 1 month ago

草稿:Routing——路由差異

要理解 Next.js 中 App Router 和 Page Router 在 Routing 上的差異,我們可以根據「使用 App Router」部分的功能來進行比較。這有助於釐清哪些功能是各自獨有的,以及哪一方可能在某些方面更具優勢。

1. 定義路由(Defining Routes)

優勢App Router 提供了基於巢狀目錄和檔案的更靈活的路由結構,這有助於更好地控制複雜的路由需求。(但也有人覺得這樣做反而更複雜,並沒有比 Page Router 更直覺)

2. 佈局和模板(Layouts and Templates)

優勢App Router 擁有內建支援佈局和模板的優勢,減少程式碼的重複性和簡化佈局管理。(但如果頁面的佈局變化不大,這方面的優勢就不明顯)

3. 連結和導航(Linking and Navigating)

優勢:兩者在這方面的功能類似,但 App Router 可能因其巢狀結構而在先進路由功能的無縫整合方面佔據優勢。

4. 錯誤處理(Error Handling)

優勢App Router 提供更細粒度的錯誤處理,讓開發人員可以將錯誤隔離到特定的路由或元件。

5. 載入 UI 和串流(Loading UI and Streaming)

優勢App Router 更適合需要複雜載入策略和串流支援的應用程式。

6. 重新導向(Redirecting)

優勢App Router 提供更多重新導向的彈性和控制。

7. 路由分組(Route Groups)

優勢App Router 在將路由分組以便共享配置方面有明顯優勢。

8. 專案組織(Project Organization)

優勢App Router 更適合大型應用程式的組織。

9. 動態路由(Dynamic Routes)

優勢:兩者皆支援動態路由,但 App Router 可能在支援巢狀動態路由方面更具優勢。

10. 平行路由(Parallel Routes)

優勢App Router 原生支援平行路由,對需要同時渲染多個路由的複雜應用程式有利。

11. 攔截路由(Intercepting Routes)

優勢App Router 提供更多彈性,具有內建的路由攔截功能。

12. 路由處理程式(Route Handlers)

優勢App Router 提供更細粒度的控制,使用路由處理程式。

13. 中介軟體(Middleware)

優勢:兩者皆支援中介軟體,但 App Router 可能因其路由結構而更無縫整合。

14. 國際化(Internationalization)

優勢App Router 在國際化方面可能提供更整合的體驗。

在 Routing 上的差異兩種路由系統的主要差異與優勢總結

App Router 通常更強大且靈活,適合需要精細的路由控制和狀態管理的複雜現代應用程式。Page Router 則是適合簡單路由需求的專案。

godmmt commented 1 month ago

took 4.5 hours

remain 3.5

godmmt commented 1 month ago

《Routing——路由差異》要再定稿,補充與程式碼實作有關的詳細說明

godmmt commented 1 month ago
godmmt commented 1 month ago

補充我們團隊現有的資料夾結構慣例在「建立 Next.js 專案」章節

更新內容如下:

建立 Next.js 專案

首先在終端輸入指令 npx create-next-app 建立 Next.js 專案。

接著會依序出現下列幾個提問,分別如下:

What is your project named? my-app
// 專案名稱,格式需為英文小寫

Would you like to use TypeScript? No / Yes
// 是否支援 TypeScript

Would you like to use ESLint? No / Yes
// 是否使用 ESLint(用來規範 Coding Style 的套件)

Would you like to use Tailwind CSS? No / Yes
// 是否使用 Tailwind CSS

Would you like to use `src/` directory? No / Yes
// 是否外加一層 src 資料夾 (會新增一個 src 資料夾,除了 public 資料夾外,所有檔案都會放在 src 資料夾底下)

Would you like to use App Router? (recommended) No / Yes
// 是否使用 App Router

Would you like to customize the default import alias (@/*)? No / Yes
// 是否自訂 alias 調整預設的 baseURL 匯入路徑

What import alias would you like configured? @/*
// alias 預設使用 @ 是否修改

Would you like to use App Router? (recommended) No / Yes 這個步驟選擇 Yes,即可選擇 App Router 路由系統;若選擇 No 則會選擇 Page Router 路由系統。

初始專案架構主要分成以下三大類:(選擇使用 App Router 的情況)

注意:如果是選擇使用 App Router 來建立專案的話,就會預設出現一個 app 資料夾;而如果使用 Page Router 就會預設出現一個 pages 資料夾。

所以如果是選擇使用 Page Router 的話,也是會出現類似上述的資料夾結構。只是就不會有 app 資料夾,而是會出現 pages 資料夾。

pages 資料夾內會用來放置所有頁面元件(每個檔案會成為一個路由),同時我們會特別建立一個 components 資料夾專門用來放置非頁面元件。這個 components 資料夾是我們自己建立的,並不是 Next.js 預設的資料夾,我們通常會放在 /src 資料夾底下。

這裡提供我們團隊的資料夾結構慣例:

└── public
└── src
    ├── components
    ├── constants
    ├── contexts
    ├── interfaces
    ├── lib
    ├── locales
    ├── pages
    ├── styles
    └── ... other folders
└── config files

接下來會介紹兩個路由系統所提供的資料夾 apppages 各別所對應的路由定義規則。

godmmt commented 1 month ago

更新: 將「Next.js Router System 路由系統」改為「初步認識 Next.js 路由架構——App Router 與 Pages Router」

內容已經重構,更新如下:


初步認識 Next.js 路由架構——App Router 與 Pages Router

Next.js 使用基於檔案系統的路由(file-system based router),意思是路由會根據專案的檔案結構自動被定義,不需額外去做設定。

究竟什麼是 App Router 跟 Pages Router 呢?簡單來說,它們是  Next 開發的兩套路由架構

根據版本不同,Next.js 提供兩種管理頁面路由的方式,分別是舊版本適用的 Pages Router 以及 v13 後推出的 App Router,兩者最明顯的差異在於:

Pages Router :

  1. 定義頁面層級的路由
  2. 所有元件為 React Client Component(客戶端元件)

App Router :

  1. 定義應用程式層級的路由
  2. 所有元件預設為 React Server Component(伺服器端元件)

定義路由分為頁面層級和應用程式層級,簡單來說 Pages Router 是在 /pages 目錄中定義的,此目錄中的每個檔案自動成為一個路由;App Router 的路由則是透過 /app 目錄中的資料夾結構定義的。

另外,在 App Router 中所有元件預設為 React Server Component(RSC),意思是由伺服器將 React Component 準備好,再傳給 Client 顯示在畫面上。

而 RSC 的優缺點如下:

優點:

  1. 整合後端操作,如存取資料庫(DB)、讀取檔案(File System)
  2. 降低資料間的依賴關係,改善請求瀑布流(Waterfall)導致的效能問題
  3. 降低 JS Bundle Size 以提升頁面效能

缺點:

  1. 無法使用 React Hooks
  2. 無法使用瀏覽器 API
  3. 無法操作 DOM 事件監聽

面對上述缺點,Next.js 可依照使用情境不同,將元件定義為 Server Component 或 Client Component。舉例來說,當某個元件需要使用 Hooks 管理時,可透過在程式碼開頭加上 'use client' 來標示元件類型,該元件底下的子元件也會自動視為 Client Component。

但也因為如此,相較於 Page Router,新版的 App Router 學習曲線會較高,需瞭解 Server 如何運作,以及判斷哪些元件適合放在 Server 或 Client 端,在使用時須特別注意。

另外,App Router 與 Page Router 是可以並存的,但也是有一些基本的限制,像是兩個目錄不能同時定義一個 router,否則會報錯。官網有提供如何從 Page Router migrate App Router 的教學文章,可以參考如何轉換。

以下章節將會針對 App Router 與 Page Router 的差異進行比較,並介紹 App Router 的幾個重要功能。

godmmt commented 1 month ago

更新: 文章架構

文章架構 (點擊展開)

- 前言 - 初步認識 Next.js - 1.React vs Next.js:函式庫與框架 - 2.為什麼選擇 Next.js - 3.Next.js 特色 - 初步認識 Next.js 路由架構——App Router 與 Pages Router - 專案建立——資料夾結構差異 - 建立 Next.js 專案 - Page Router 資料夾結構 - App Router 資料夾結構 - Rendering——渲染的四種方式、路由系統對四種渲染的應用差異 - 了解 Next.js 中的渲染方法:CSR vs SSR vs SSG vs ISR - 1. 客戶端渲染 (Client-side Rendering, CSR) - 2. 伺服器端渲染 (Server-side Rendering, SSR) - 3. 靜態網站生成 (Static Site Generation, SSG) - 4. 增量靜態再生 (Incremental Static Regeneration, ISR) - Page Router 處理 4 種渲染的方式 - 1. 客戶端渲染 (CSR) - 2. 伺服器端渲染 (SSR) - 3. 靜態網站生成 (SSG) - 4. 增量靜態再生 (ISR) - Page Router 處理 4 種渲染的方式總結 - App Router 處理 4 種渲染的方式 - 1. 客戶端渲染 (CSR) - 2. 伺服器端渲染 (SSR) - 3. 靜態網站生成 (SSG) - 4. 增量靜態再生 (ISR) - App Router 處理 4 種渲染的方式總結 - Rendering—— App Router 渲染概念 - 1. 伺服器元件(React Server Component, RSC) - 伺服器渲染的好處 - 在 Next.js 中使用伺服器元件 - 伺服器元件如何渲染? - 伺服器渲染策略—— 1. 靜態渲染(預設) - 伺服器渲染策略—— 2. 動態渲染 - 伺服器渲染策略—— 3. 串流 - 2. 客戶端元件(Client Component) - 客戶端渲染的好處 - 在 Next.js 中使用客戶端元件 - 客戶端元件如何渲染? - Routing——路由使用差異 - 1. 定義路由(Defining Routes) - 2. 佈局和模板(Layouts and Templates) - 3. 連結和導航(Linking and Navigating) - 4. 錯誤處理(Error Handling) - 5. 載入 UI 和串流(Loading UI and Streaming) - 6. 重新導向(Redirecting) - 7. 路由分組(Route Groups) - 8. 專案組織(Project Organization) - 9. 動態路由(Dynamic Routes) - 10. 平行路由(Parallel Routes) - 11. 攔截路由(Intercepting Routes) - 12. 路由處理程式(Route Handlers) - 13. 中介軟體(Middleware) - 14. 國際化(Internationalization) - Data Fetching——資料獲取差異 - 逐步遷移的方式 - 實作——App Router - 結論 - 條列式整理差異 - 適用情境 - 對於專案的建議 - 參考資料

godmmt commented 1 month ago

新增:「Routing——路由差異」之兩版本路由系統的路由詳細說明 (部分完成)

完成的部分:

godmmt commented 1 month ago

took 3.5 hours

Total time: 8

done.

(今天因為 pre-commit 環境有問題,幾乎都在花時間排查錯誤、修復環境,所以處理 KM 的時間就不多了。)