專案結構與組織

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

資料夾與檔案慣例

頂層資料夾

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

路由區段對應路徑區段
app應用路由 (App Router)
pages頁面路由 (Pages Router)
public靜態資源存放位置
src可選的應用程式原始碼資料夾

頂層檔案

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

Next.js
next.config.jsNext.js 設定檔
package.json專案依賴項與腳本
instrumentation.tsOpenTelemetry 與檢測檔案
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 .tsx找不到頁面 UI
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.ico網站圖示檔案
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
檔案慣例的元件層級

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

巢狀檔案慣例的元件層級

共置 (Colocation)

app 目錄中,巢狀資料夾定義了路由結構。每個資料夾代表一個路由區段,對應到 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.js 檔案將載入骨架應用到特定路由,可以建立一個新的路由群組(例如 /(overview)),然後將你的 loading.tsx 移動到該路由群組中。

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

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

建立多個根佈局

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

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

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