專案結構與組織
本頁面提供 Next.js 中所有資料夾與檔案慣例的概述,以及組織專案的建議。
資料夾與檔案慣例
頂層資料夾
頂層資料夾用於組織應用程式的程式碼與靜態資源。

頂層檔案
頂層檔案用於配置應用程式、管理依賴項、執行中介軟體、整合監控工具以及定義環境變數。
Next.js | |
next.config.js | Next.js 設定檔 |
package.json | 專案依賴項與腳本 |
instrumentation.ts | OpenTelemetry 與 Instrumentation 檔案 |
middleware.ts | Next.js 請求中介軟體 |
.env | 環境變數 |
.env.local | 本地環境變數 |
.env.production | 生產環境變數 |
.env.development | 開發環境變數 |
.eslintrc.json | ESLint 設定檔 |
.gitignore | Git 忽略檔案與資料夾 |
next-env.d.ts | Next.js 的 TypeScript 宣告檔案 |
tsconfig.json | TypeScript 設定檔 |
jsconfig.json | JavaScript 設定檔 |
路由檔案
layout | .js .jsx .tsx | 布局 (Layout) |
page | .js .jsx .tsx | 頁面 (Page) |
loading | .js .jsx .tsx | 載入 UI |
not-found | .js .jsx .tsx | 404 頁面 |
error | .js .jsx .tsx | 錯誤 UI |
global-error | .js .jsx .tsx | 全域錯誤 UI |
route | .js .ts | API 端點 |
template | .js .jsx .tsx | 重新渲染的布局 |
default | .js .jsx .tsx | 平行路由的後備頁面 |
巢狀路由
folder | 路由區段 |
folder/folder | 巢狀路由區段 |
動態路由
[folder] | 動態路由區段 |
[...folder] | 全捕捉路由區段 |
[[...folder]] | 可選全捕捉路由區段 |
路由群組與私有資料夾
平行與攔截路由
@folder | 命名插槽 |
(.)folder | 攔截同層級路由 |
(..)folder | 攔截上一層級路由 |
(..)(..)folder | 攔截上兩層級路由 |
(...)folder | 從根目錄攔截路由 |
元資料檔案慣例
應用圖示
favicon | .ico | Favicon 檔案 |
icon | .ico .jpg .jpeg .png .svg | 應用圖示檔案 |
icon | .js .ts .tsx | 生成的應用圖示 |
apple-icon | .jpg .jpeg , .png | Apple 應用圖示檔案 |
apple-icon | .js .ts .tsx | 生成的 Apple 應用圖示 |
Open Graph 與 Twitter 圖片
opengraph-image | .jpg .jpeg .png .gif | Open Graph 圖片檔案 |
opengraph-image | .js .ts .tsx | 生成的 Open Graph 圖片 |
twitter-image | .jpg .jpeg .png .gif | Twitter 圖片檔案 |
twitter-image | .js .ts .tsx | 生成的 Twitter 圖片 |
SEO
組織您的專案
Next.js 對於如何組織和共置專案檔案沒有強制規範。但它確實提供了幾項功能來幫助您組織專案。
元件層級結構
特殊檔案中定義的元件會按照特定層級結構渲染:
layout.js
template.js
error.js
(React 錯誤邊界)loading.js
(React suspense 邊界)not-found.js
(React 錯誤邊界)page.js
或巢狀layout.js

這些元件會在巢狀路由中遞迴渲染,意味著路由區段的元件會嵌套在其父區段的元件內部。

檔案共置 (Colocation)
在 app
目錄中,巢狀資料夾定義了路由結構。每個資料夾代表一個路由區段 (route segment),對應到 URL 路徑中的相應區段。
然而,即使路由結構是透過資料夾定義的,除非在路由區段中添加 page.js
或 route.js
檔案,否則該路由不會公開可存取。

而且,即使路由已公開可存取,只有 page.js
或 route.js
回傳的內容會傳送到客戶端。

這意味著專案檔案可以安全地共置於 app
目錄的路由區段中,而不會意外變成可路由的。

須知事項:雖然你可以將專案檔案共置於
app
目錄中,但這並非必要。如果你偏好,也可以將它們保留在app
目錄外。
私有資料夾 (Private folders)
可以透過在資料夾名稱前加上底線來建立私有資料夾:_folderName
這表示該資料夾是私有實作細節,不應被路由系統考慮,從而將該資料夾及其所有子資料夾排除在路由之外。

由於 app
目錄中的檔案預設可以安全共置,私有資料夾並非共置的必要條件。但它們在以下情況很有用:
- 將 UI 邏輯與路由邏輯分離。
- 在專案和 Next.js 生態系統中一致地組織內部檔案。
- 在程式碼編輯器中排序和分組檔案。
- 避免與未來 Next.js 檔案慣例的潛在命名衝突。
須知事項:
- 雖然這不是框架慣例,但你可能也會考慮使用相同的底線模式來標記私有資料夾外的檔案為「私有」。
- 可以透過在資料夾名稱前加上
%5F
(底線的 URL 編碼形式)來建立以底線開頭的 URL 區段:%5FfolderName
。- 如果不使用私有資料夾,了解 Next.js 的特殊檔案慣例有助於避免意外的命名衝突。
路由群組 (Route groups)
可以透過將資料夾用括號包起來來建立路由群組:(folderName)
這表示該資料夾僅用於組織目的,不應包含在路由的 URL 路徑中。

路由群組適用於:
- 按網站區塊、意圖或團隊組織路由。例如行銷頁面、管理頁面等。
- 在同一路由區段層級啟用巢狀佈局:
src
資料夾
Next.js 支援將應用程式碼(包括 app
)儲存在可選的 src
資料夾中。這將應用程式碼與主要位於專案根目錄的專案設定檔分開。

範例
以下部分列出了一些常見策略的高階概述。最簡單的結論是選擇適合你和團隊的策略,並在整個專案中保持一致。
須知事項:在下面的範例中,我們使用
components
和lib
資料夾作為通用佔位符,它們的命名沒有特殊的框架意義,你的專案可能會使用其他資料夾,如ui
、utils
、hooks
、styles
等。
將專案檔案儲存在 app
外
此策略將所有應用程式碼儲存在專案根目錄的共用資料夾中,並保持 app
目錄純粹用於路由目的。

將專案檔案儲存在 app
內的頂層資料夾中
此策略將所有應用程式碼儲存在 app
目錄根目錄的共用資料夾中。

按功能或路由拆分專案檔案
此策略將全域共用的應用程式碼儲存在 app
根目錄中,並將更具體的應用程式碼拆分到使用它們的路由區段中。

不影響 URL 路徑的組織路由
為了在不影響 URL 的情況下組織路由,可以建立一個群組來將相關路由放在一起。括號中的資料夾將從 URL 中省略(例如 (marketing)
或 (shop)
)。

即使 (marketing)
和 (shop)
內的路由共用相同的 URL 層次結構,你也可以透過在它們的資料夾中添加 layout.js
檔案來為每個群組建立不同的佈局。

將特定區段加入佈局
要將特定路由加入佈局,可以建立一個新的路由群組(例如 (shop)
)並將共用相同佈局的路由移動到該群組中(例如 account
和 cart
)。群組外的路由不會共用該佈局(例如 checkout
)。

為特定路由選擇載入骨架 (loading skeleton)
要透過 loading.js
檔案將載入骨架應用到特定路由,可以建立一個新的路由群組(例如 /(overview)
),然後將你的 loading.tsx
移動到該路由群組中。

現在,loading.tsx
檔案將僅應用於你的 dashboard → overview 頁面,而不是所有 dashboard 頁面,同時不影響 URL 路徑結構。
建立多個根佈局
要建立多個根佈局,請移除頂層的 layout.js
檔案,並在每個路由群組中添加一個 layout.js
檔案。這適用於將應用程式分割為具有完全不同 UI 或體驗的區塊。每個根佈局都需要添加 <html>
和 <body>
標籤。

在上面的範例中,(marketing)
和 (shop)
都有各自的根佈局。