# Next.js app router vs page router
## 前言
大多數人對於 Next.js 這套框架都應該不陌生,基於 React 的 SSR 框架,但在版本 v13 前後上卻有不同路由系統變更,本文章想簡單探討 app router 與 page router 差異。
## Start
```
What is your project named? my-app
Would you like to use TypeScript? No / Yes
Would you like to use ESLint? No / Yes
Would you like to use Tailwind CSS? No / Yes
Would you like to use `src/` directory? No / Yes
Would you like to use App Router? (recommended) No / Yes
Would you like to customize the default import alias (@/*)? No / Yes
What import alias would you like configured? @/*
```
跟著[官方文件](https://nextjs.org/docs/getting-started/installation) 試著啟專案使用 v14 版本(僅支援 Node.js v18.17 以上的版本),發現路由選項上default 建議為 app router。
### 專案結構
建置完後,可以看到主要 app 目錄結構如下:
```
└── app
├── about
└── page.tax
├── globals.css
├── layout.tsx
└── page.tsx
```
* app - page / component / api 都會收納在底下
* globals.css: 全域樣式定義檔案
* layout.tsx: 主要用來管理 UI 介面,root layout用來定義標籤`<html> <body>`以及其他全域共享的 UI 如:`<nav>`
* page.tsx: 主要用來使用 router 的功能如同 Page router。每個資料夾都對應一個 route 路徑,底下都會需要有 page.tsx 才能成為 route segment
## Next Router
Next.js 使用基於檔案系統的路由器(file-system based router),自動使用資料夾來定義路由,相較 React 專案中使用`react-router-dom` 來定義路由方便許多。隨著版本跟進 Next.js 也發展出兩種路由管理方式,比較如下:
App router
* 元件為 React Server Component(伺服端元件)
* 基於目錄的路由系統
Page router
* 元件為 React Client Component(客戶端元件)
* 基於檔案的路由系統
在研究過程中發現最大的改變其實在於 RSC 的推進,而在 app router 中可以透過 `'use client'` 標示元件類型切換成 RCC 但預設的元件皆為 RSC。
簡單區分這兩者元件之間的差別在於,渲染元件的時機與功用。
#### React Server Component
* 在 Server Side render
* 整合後端操作,具有訪問 DB、file system 的能力
* 無法使用 React Hooks 以及事件綁定操作,故無法操作瀏覽器
#### React Client Component:
* 在 Client Side render
* 可綁定事件能力擁有互動性。
## App router
## Page router