Next.js 路由系統大揭秘: (folder)、[folder] 和 [[…folder]] 三兄弟的愛恨情仇


哈囉各位開發者朋友們!今天我們要來聊一個超級有趣又實用的話題 —— Next.js 的路由系統。沒錯,就是那個讓你又愛又恨的 (folder)、[folder] 和 [[…folder]]。這三兄弟看起來長得挺像的,但個性可大不相同呢!今天就讓我們一起來扒一扒他們的老底,看看誰才是你的真命天子!

路由三兄弟大亂鬥

首先,讓我們來個速成班,快速認識一下這三位"型男":

  1. (folder): 這是個乖寶寶,最普通的靜態路由
  2. [folder]: 帥氣多金的二哥,負責處理動態路由
  3. [[…folder]]: 老么中的戰鬥機,專門捕獲所有路由

看起來是不是很簡單?但別被表象騙了,每個兄弟都有自己的獨門絕技。讓我們繼續深入了解他們的特點和用法吧!

(folder): 靜態路由中的實力派

(folder) 是最基本的路由形式,就像是一個老實巴交的大哥。他負責處理那些固定不變的頁面路徑。

使用方法超級簡單,你只需要在 app 目錄下創建一個文件夾,Next.js 就會自動將其視為一個路由。例如:

app/
  ├── about/
  │   └── page.js
  └── contact/
      └── page.js

這樣,你就有了 /about/contact 兩個路由。簡單粗暴,就是這麼實在!

(folder) 的獨門絕技

  1. 簡單明瞭: 目錄結構就是路由結構,一目了然
  2. SEO 友好: 靜態路由更容易被搜索引擎收錄
  3. 性能優秀: 靜態路由可以預渲染,加快頁面加載速度

但是,這位大哥也有自己的小缺點。如果你的網站有成千上萬個頁面,難道要一個一個創建文件夾嗎?這時候,就需要請出我們的二哥 [folder] 登場了!

[folder]: 動態路由的魅力擔當

[folder] 是個多才多藝的帥哥,他可以處理那些有規律變化的路由。比如說,你有一個部落格,每篇文章的 URL 都是 /posts/文章id。難道要為每篇文章都創建一個文件夾嗎?太累人了吧!

這時候,[folder] 就派上用場了。你只需要在 app 目錄下創建一個 [id] 文件夾:

app/
  └── posts/
      └── [id]/
          └── page.js

這樣,無論是 /posts/1/posts/hello-world 還是 /posts/你好世界,都會被這個路由捕獲。酷吧?

[folder] 的獨門絕技

  1. 靈活多變: 可以處理各種動態內容
  2. 代碼覆用: 一個組件搞定多個類似的頁面
  3. 參數獲取: 可以輕鬆獲取 URL 中的參數

來看看如何在組件中獲取動態參數:

export default function Post({ params }) {
  return <h1>文章 ID: {params.id}</h1>
}

簡直不要太方便!

但是,如果你的需求更加複雜,比如說你想捕獲 /posts/2023/06/24 這樣的多層級路由,該怎麼辦呢?別擔心,我們還有壓軸的老么 [[…folder]] 呢!

[[…folder]]: 捕獲所有路由的終極武器

[[…folder]] 是個全能選手,他可以捕獲任意數量的路徑段。無論你的 URL 有多長,多複雜,他都能搞定!

使用方法也很簡單,在 app 目錄下創建一個 [[...slug]] 文件夾:

app/
  └── [...slug]/
      └── page.js

這樣,無論是 /a/a/b 還是 /a/b/c/d/e,都會被這個路由捕獲。簡直是神器啊!

[[…folder]] 的獨門絕技

  1. 全面覆蓋: 可以捕獲任意長度的路徑
  2. 靈活配置: 可以根據捕獲的路徑段動態生成頁面
  3. 後備方案: 可以作為 404 頁面的完美替代品

來看看如何在組件中使用捕獲的路徑段:

export default function CatchAll({ params }) {
  const { slug } = params
  return (
    <div>
      <h1>捕獲的路徑段:</h1>
      <ul>
        {slug.map((segment, index) => (
          <li key={index}>{segment}</li>
        ))}
      </ul>
    </div>
  )
}

是不是感覺無所不能?

路由三兄弟的終極比拼

好了,現在我們已經認識了這三兄弟,讓我們來個終極比拼,看看他們各自的優缺點吧!

特性(folder)[folder][[…folder]]
適用場景固定頁面動態內容複雜多層級路由
靈活性
配置難度簡單中等稍複雜
SEO 友好度
性能
代碼覆用極高

如何選擇你的真命天子?

看完了這麼多,你可能會問:“那我到底該用哪個啊?“別急,讓我來給你一些建議:

  1. 如果你的網站結構簡單,頁面數量有限,優先選擇 (folder)
  2. 如果你有大量類似結構的頁面(如部落格文章、產品詳情),選擇 [folder]
  3. 如果你的網站結構非常複雜,或者你想實現一些特殊的路由邏輯,選擇 [[…folder]]

其實,最理想的情況是三種方式結合使用。比如:

app/
  ├── about/              # 靜態路由
  │   └── page.js
  ├── posts/
  │   └── [id]/           # 動態路由
  │       └── page.js
  └── [...catchAll]/      # 捕獲所有路由
      └── page.js

這樣,你就可以充分發揮每種路由方式的優勢,打造一個靈活又強大的 Web 應用了!

結語

好啦,今天的 Next.js 路由系統大揭秘到此結束。希望通過這篇文章,你已經成功掌握了 (folder)、[folder] 和 [[…folder]] 這三兄弟的獨門絕技。記住,沒有最好的路由方式,只有最適合你項目的路由方式。

所以,大膽地去嘗試吧!相信你一定能夠打造出一個令人驚艷的 Next.js 應用。如果你有任何問題或者想法,歡迎在評論區留言討論。祝你編碼愉快,下次再見!