# 【Next.js】專案結構與檔案說明

以下是根據你提供的 Next.js 專案結構，整理出各資料夾與檔案的用途與說明：

---

### 📁 專案結構與說明表格

<table id="bkmrk-%E8%B7%AF%E5%BE%91-%2F-%E6%AA%94%E6%A1%88-%E9%A1%9E%E5%9E%8B-%E8%AA%AA%E6%98%8E-.next%2F"><thead><tr><th>路徑 / 檔案</th><th>類型</th><th>說明</th></tr></thead><tbody><tr><td>`.next/`</td><td>資料夾</td><td>Next.js **build 輸出資料夾**，會在 `next build` 時產生。內含編譯後的 server 與靜態資源。可部署至伺服器。</td></tr><tr><td>├── `server/`</td><td>資料夾</td><td>Server-side compiled files（如 SSR 頁面、API Routes）。</td></tr><tr><td>├── `static/`</td><td>資料夾</td><td>靜態產出資源（例如圖片、CSS、JS 等）。</td></tr><tr><td>├── `cache/`</td><td>資料夾</td><td>編譯過程中的 cache，提高二次編譯速度。</td></tr><tr><td>├── `build-manifest.json`</td><td>JSON 檔案</td><td>描述每個頁面對應的 JS chunk，供 runtime 載入使用。</td></tr><tr><td>├── `routes-manifest.json`</td><td>JSON 檔案</td><td>儲存頁面與路由資訊的映射表。</td></tr><tr><td>├── `prerender-manifest.json`</td><td>JSON 檔案</td><td>與預先產生的頁面（SSG）有關，例如 `getStaticProps` 結果。</td></tr><tr><td>`node_modules/`</td><td>資料夾</td><td>安裝的 npm 套件。</td></tr><tr><td>`public/`</td><td>資料夾</td><td>放置**靜態資源**（如圖片、SVG），透過 `/` 路徑對外公開，例如：`public/globe.svg` → `/globe.svg`。</td></tr><tr><td>`src/app/`</td><td>資料夾</td><td>使用 **App Router 架構** 的主要入口，代表新架構（取代 `pages/` 目錄）。</td></tr><tr><td>├── `layout.tsx`</td><td>React 元件</td><td>每個 route 的共同 Layout 元件。App Router 中不可或缺。</td></tr><tr><td>├── `page.tsx`</td><td>React 元件</td><td>對應 `/` 路由的頁面內容（Home）。</td></tr><tr><td>├── `globals.css`</td><td>CSS 檔案</td><td>全域 CSS，需在 `layout.tsx` 中引入。</td></tr><tr><td>`favicon.ico`</td><td>圖示檔案</td><td>網站 favicon，會自動用在 `<head>` 中。</td></tr><tr><td>`.gitignore`</td><td>設定檔</td><td>Git 忽略檔案清單。通常會包含 `.next/`、`node_modules/`。</td></tr><tr><td>`next-env.d.ts`</td><td>TS 宣告</td><td>Next.js 產生的 type 設定檔，自動加入必要的 TypeScript 型別。</td></tr><tr><td>`next.config.ts`</td><td>設定檔</td><td>Next.js 專案設定檔，支援自訂建置、路徑、Plugin 等功能。</td></tr><tr><td>`package.json` / `package-lock.json`</td><td>設定檔</td><td>npm 套件定義與鎖定檔。記錄所有依賴與版本。</td></tr><tr><td>`postcss.config.mjs`</td><td>設定檔</td><td>PostCSS 設定，通常與 TailwindCSS 搭配使用。</td></tr><tr><td>`README.md`</td><td>說明檔</td><td>專案說明、安裝方式、開發資訊等。</td></tr><tr><td>`tsconfig.json`</td><td>設定檔</td><td>TypeScript 專案設定，例如路徑 alias、編譯選項等。</td></tr></tbody></table>

---

### 📌 重點說明

<table id="bkmrk-%E5%88%86%E9%A1%9E-%E9%87%8D%E9%BB%9E-%E9%87%8D%E8%A6%81%E7%9B%AE%E9%8C%84-src%2Fapp%2F%EF%BC%88"><thead><tr><th>分類</th><th>重點</th></tr></thead><tbody><tr><td>**重要目錄**</td><td>`src/app/`（使用 App Router 架構）、`public/`（靜態資源）、`.next/`（build 輸出）</td></tr><tr><td>**重要設定檔**</td><td>`next.config.ts`、`tsconfig.json`、`postcss.config.mjs`</td></tr><tr><td>**App Router 必備**</td><td>`layout.tsx` 是必要頁面組件，類似傳統 `_app.tsx + _document.tsx`</td></tr><tr><td>**部署時可忽略**</td><td>`node_modules/`、`.next/cache`、`.gitignore`</td></tr></tbody></table>

---

## 說明layout.tsx 與 page.tsx 關係

`layout.tsx` 與 `page.tsx` 是 Next.js 13+（App Router 架構）中，兩個**核心檔案**，分別扮演不同但互補的角色。

---

## 🧱 簡單說明

<table id="bkmrk-%E6%AA%94%E6%A1%88-%E7%94%A8%E9%80%94-%E8%BC%89%E5%85%A5%E9%A0%BB%E7%8E%87-%E6%AF%94%E5%96%BB-layout"><thead><tr><th>檔案</th><th>用途</th><th>載入頻率</th><th>比喻</th></tr></thead><tbody><tr><td>`layout.tsx`</td><td>定義頁面結構與共用 UI（像是外框）</td><td>只載入一次（不會重複重建）</td><td>「建築物的骨架」</td></tr><tr><td>`page.tsx`</td><td>定義實際頁面內容</td><td>每個頁面都會重新載入</td><td>「房間的內容、家具、住戶」</td></tr></tbody></table>

---

## 🧭 目錄架構範例

```bash
app/
├── layout.tsx         # 所有頁面的共用 Layout
├── page.tsx           # / 路徑的首頁內容
├── about/
│   ├── layout.tsx     # 僅 /about 使用的 layout
│   └── page.tsx       # /about 的內容

```

---

## 🧩 關係與行為

1. **一個 layout 對應多個 page**
    
    
    - 例如 `app/layout.tsx` 包住所有頁面：`/`, `/about`, `/contact`
2. **嵌套 layout**
    
    
    - 子資料夾可有自己的 `layout.tsx`，會**包在上層 layout 裡**
3. **layout 不會因為切換 page 被卸載**
    
    
    - 可以放在 `Header`, `Sidebar`, `Footer` 等共用 UI 元件，效能更佳
4. **page.tsx 是實際的頁面入口**
    
    
    - 每個 URL 都需要一個 `page.tsx` 來當作入口點

---

## 📦 實際範例

### `app/layout.tsx`

```tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        <header>共用導覽列</header>
        <main>{children}</main>
        <footer>共用頁尾</footer>
      </body>
    </html>
  )
}

```

### `app/page.tsx`

```tsx
export default function HomePage() {
  return <h1>這是首頁內容</h1>
}

```

👉 此時 `HomePage` 內容會被注入進 `layout.tsx` 的 `{children}` 中。

---

## 🔁 一圖總結

```
layout.tsx
├── Header
├── <main>
│   └── page.tsx 的內容
└── Footer

```

---

## ✅ 補充：layout.tsx 特性

<table id="bkmrk-%E7%89%B9%E6%80%A7-%E6%98%AF%E5%90%A6%E6%94%AF%E6%8F%B4-%E5%82%99%E8%A8%BB-%E6%94%AF%E6%8F%B4-loadin"><thead><tr><th>特性</th><th>是否支援</th><th>備註</th></tr></thead><tbody><tr><td>支援 `loading.tsx`</td><td>✅</td><td>當子頁面在載入時顯示 loading UI</td></tr><tr><td>支援 `error.tsx`</td><td>✅</td><td>包裹此 layout 的錯誤畫面</td></tr><tr><td>支援 `metadata` 設定</td><td>✅</td><td>可以定義 title、description 等</td></tr><tr><td>自動 caching</td><td>✅</td><td>layout 有自動快取，非動態頁效能極佳</td></tr></tbody></table>

---

需要我幫你畫出 layout/page 的巢狀結構流程圖或建立範本專案也可以說一聲。

</body></html>