專案結構與組織

本頁面提供 Next.js 中所有資料夾與檔案慣例的概述,以及組織專案的建議。

資料夾與檔案慣例

頂層資料夾

頂層資料夾用於組織應用程式的程式碼與靜態資源。

Route segments to path segments
app應用路由 (App Router)
pages頁面路由 (Pages Router)
public靜態資源檔案
src可選的應用程式原始碼資料夾

頂層檔案

頂層檔案用於配置應用程式、管理依賴項、執行中介軟體、整合監控工具以及定義環境變數。

Next.js
next.config.jsNext.js 設定檔
package.json專案依賴項與腳本
instrumentation.tsOpenTelemetry 與 Instrumentation 檔案
middleware.tsNext.js 請求中介軟體
.env環境變數
.env.local本地環境變數
.env.production生產環境變數
.env.development開發環境變數
.eslintrc.jsonESLint 設定檔
.gitignoreGit 忽略檔案與資料夾
next-env.d.tsNext.js 的 TypeScript 宣告檔案
tsconfig.jsonTypeScript 設定檔
jsconfig.jsonJavaScript 設定檔

路由檔案

layout.js .jsx .tsx布局 (Layout)
page.js .jsx .tsx頁面 (Page)
loading.js .jsx .tsx載入 UI
not-found.js .jsx .tsx404 頁面
error.js .jsx .tsx錯誤 UI
global-error.js .jsx .tsx全域錯誤 UI
route.js .tsAPI 端點
template.js .jsx .tsx重新渲染的布局
default.js .jsx .tsx平行路由的後備頁面

巢狀路由

folder路由區段
folder/folder巢狀路由區段

動態路由

[folder]動態路由區段
[...folder]全捕捉路由區段
[[...folder]]可選全捕捉路由區段

路由群組與私有資料夾

(folder)不影響路由的分組
_folder將資料夾及其子區段排除在路由之外

平行與攔截路由

@folder命名插槽
(.)folder攔截同層級路由
(..)folder攔截上一層級路由
(..)(..)folder攔截上兩層級路由
(...)folder從根目錄攔截路由

元資料檔案慣例

應用圖示

favicon.icoFavicon 檔案
icon.ico .jpg .jpeg .png .svg應用圖示檔案
icon.js .ts .tsx生成的應用圖示
apple-icon.jpg .jpeg, .pngApple 應用圖示檔案
apple-icon.js .ts .tsx生成的 Apple 應用圖示

Open Graph 與 Twitter 圖片

opengraph-image.jpg .jpeg .png .gifOpen Graph 圖片檔案
opengraph-image.js .ts .tsx生成的 Open Graph 圖片
twitter-image.jpg .jpeg .png .gifTwitter 圖片檔案
twitter-image.js .ts .tsx生成的 Twitter 圖片

SEO

sitemap.xml網站地圖檔案
sitemap.js .ts生成的網站地圖
robots.txtRobots 檔案
robots.js .ts生成的 Robots 檔案

組織您的專案

Next.js 對於如何組織和共置專案檔案沒有強制規範。但它確實提供了幾項功能來幫助您組織專案。

元件層級結構

特殊檔案中定義的元件會按照特定層級結構渲染:

  • layout.js
  • template.js
  • error.js (React 錯誤邊界)
  • loading.js (React suspense 邊界)
  • not-found.js (React 錯誤邊界)
  • page.js 或巢狀 layout.js
Component Hierarchy for File Conventions

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

Nested File Conventions Component Hierarchy

檔案共置 (Colocation)

app 目錄中,巢狀資料夾定義了路由結構。每個資料夾代表一個路由區段 (route segment),對應到 URL 路徑中的相應區段。

然而,即使路由結構是透過資料夾定義的,除非在路由區段中添加 page.jsroute.js 檔案,否則該路由不會公開可存取

圖表顯示在路由區段添加 page.js 或 route.js 檔案前,路由不會公開可存取

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

圖表顯示 page.js 和 route.js 檔案如何讓路由公開可存取

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

圖表顯示共置的專案檔案即使區段包含 page.js 或 route.js 也不會變成可路由

須知事項:雖然你可以將專案檔案共置於 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 資料夾中。這將應用程式碼與主要位於專案根目錄的專案設定檔分開。

包含 `src` 資料夾的範例資料夾結構

範例

以下部分列出了一些常見策略的高階概述。最簡單的結論是選擇適合你和團隊的策略,並在整個專案中保持一致。

須知事項:在下面的範例中,我們使用 componentslib 資料夾作為通用佔位符,它們的命名沒有特殊的框架意義,你的專案可能會使用其他資料夾,如 uiutilshooksstyles 等。

將專案檔案儲存在 app

此策略將所有應用程式碼儲存在專案根目錄的共用資料夾中,並保持 app 目錄純粹用於路由目的。

專案檔案儲存在 app 外的範例資料夾結構

將專案檔案儲存在 app 內的頂層資料夾中

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

專案檔案儲存在 app 內的範例資料夾結構

按功能或路由拆分專案檔案

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

按功能或路由拆分專案檔案的範例資料夾結構

不影響 URL 路徑的組織路由

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

使用路由群組組織路由

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

具有多個佈局的路由群組

將特定區段加入佈局

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

具有選擇性加入佈局的路由群組

為特定路由選擇載入骨架 (loading skeleton)

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

顯示路由群組中包含 loading.tsx 和 page.tsx 的資料夾結構

現在,loading.tsx 檔案將僅應用於你的 dashboard → overview 頁面,而不是所有 dashboard 頁面,同時不影響 URL 路徑結構。

建立多個根佈局

要建立多個根佈局,請移除頂層的 layout.js 檔案,並在每個路由群組中添加一個 layout.js 檔案。這適用於將應用程式分割為具有完全不同 UI 或體驗的區塊。每個根佈局都需要添加 <html><body> 標籤。

具有多個根佈局的路由群組

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