什麼是 Next.js?給 App 製作者的白話指南
Next.js 是一個用 React 來建立網站與網路應用程式的框架。React 提供介面的基本組件,例如按鈕、表單與清單。Next.js 則補上圍繞它們的其他網站部分:頁面與網址、在伺服器上渲染頁面讓它們到達時就能直接閱讀、載入資料,以及在同一個專案中執行後端程式碼。它是開放原始碼,由 Vercel 公司開發,也是最廣泛使用的 React 網站建置方式之一。
用 AI 製作 App 時為什麼 Next.js 很重要
當你向 AI 製作工具描述一個 App 時,它必須選定一個技術基礎。這個選擇會影響你之後在意的許多事情:
- 搜尋能見度。 需要在 Google 上排名的公開網站,會受益於發送真正的 HTML,而 Next.js 在這方面做得很好。
- 後端放在哪裡。 Next.js 讓前端頁面與伺服器端程式碼(例如「儲存這個表單」或「呼叫金流 API」)能放在同一個專案中。
- 託管。 具有伺服器功能的 Next.js 應用程式需要一台伺服器來運行,而單純的 Vite 應用程式只需要以靜態檔案的方式提供即可。
Mythex 預設為新專案使用 Vite + React + TypeScript + Tailwind;當你要求時,則會改用 Next.js。在第一則提示詞中寫上「使用 Next.js」就已足夠(技術如何選擇)。因此,了解什麼時候值得提出這個要求,會很有幫助。
日常比喻
如果 React 是一盒高品質的樂高積木,那麼 Next.js 就是附上說明書、底板,以及門窗與水管零件的完整樂高套組。
你當然可以用散裝積木搭出同樣的房子,只是得自己決定房間如何相連、前門放哪裡,以及水管怎麼接。Next.js 則以標準的方式替你做好這些決定,因此每個 Next.js 專案的結構都相似,新的開發者(或 AI)也能很快找到方向。
Next.js 為 React 加上了什麼
| 功能 | 對你的意義 |
|---|---|
| 以檔案為基礎的路由 | 每個頁面就是一個檔案。app/pricing/page.tsx 這個檔案就會成為 /pricing 頁面,無需額外設定。 |
| 伺服器端渲染 | 頁面可以在伺服器上針對每個請求建成 HTML,因此能快速顯示,搜尋引擎也能讀取。 |
| 靜態生成 | 很少變動的頁面可以事先建置一次,然後以非常快的速度提供。 |
| 伺服器元件(Server Components) | 頁面的部分內容只在伺服器上運行,例如直接讀取資料庫,然後把完成的 HTML(而不是程式碼)送到瀏覽器。 |
| 路由處理器與伺服器動作 | 後端程式碼,例如 API 端點或表單處理器,與頁面位於同一個專案中。 |
| 內建的最佳化 | 圖片縮放、字型載入與程式碼分割都會替你處理。 |
Next.js 有兩種組織頁面的方式。App Router(app/ 資料夾)是較新的方式,支援伺服器元件。Pages Router(pages/ 資料夾)是最初的方式,目前仍然受支援。新專案一般使用 App Router。如果 AI 製作工具產生的程式碼或教學看起來陌生,通常就是這個原因。
實際範例:公開的咖啡廳目錄
想像你要做一個列出城市中咖啡廳的網站,每間咖啡廳一個頁面,並希望它能在搜尋結果中出現。
一間咖啡廳的 Next.js 頁面大致會像這樣:
// app/cafes/[slug]/page.tsx → /cafes/blue-door, /cafes/hilltop ...
export default async function CafePage({ params }) {
const { slug } = await params;
const cafe = await db.cafe.findUnique({ where: { slug } });
return (
<main>
<h1>{cafe.name}</h1>
<p>{cafe.address}</p>
</main>
);
}
當有人(或 Google)造訪 /cafes/blue-door 時會發生以下事情:
- Next.js 把網址對應到該檔案。資料夾名稱
[slug]代表「任何一間咖啡廳」。 - 這個元件在伺服器上運行,從資料庫讀取咖啡廳資料並建立 HTML。
- 瀏覽器收到的是一個完整的頁面,咖啡廳的名稱與地址已經在裡面,不需要等待 JavaScript 去抓取資料。
如果是一個純客戶端的 React 應用程式,瀏覽器會先收到幾乎空白的頁面,接著下載 JavaScript,再抓取咖啡廳資料,最後才顯示出來。搜尋引擎通常也能處理這種情況,但完整的頁面會更可靠。請參閱 AI 製作網站的 SEO。
相對地,一個需要登入、只供員工使用的儀表板,搜尋引擎本來就看不到,因此伺服器端渲染的好處較少,較簡單的 Vite 應用程式往往才是更合適的選擇。
關鍵術語
| 術語 | 意義 |
|---|---|
| 框架(Framework) | 一套帶有慣例的結構,決定應用程式如何組織。Next.js 是框架;React 是函式庫。 |
| SSR(伺服器端渲染) | 每次造訪時在伺服器上建立頁面的 HTML。 |
| SSG(靜態網站生成) | 在部署時預先把頁面建成 HTML。 |
| CSR(客戶端渲染) | 瀏覽器在載入後以 JavaScript 建立頁面。典型的 Vite + React 應用程式就是這樣運作。 |
| SPA(單頁應用程式) | 只載入一次,之後在瀏覽器中切換畫面、不需整頁重新載入的應用程式。 |
| 水合(Hydration) | 瀏覽器把伺服器送來的 HTML「啟動」,讓按鈕與表單變得可以互動。 |
| 路由(Route) | 像 /pricing 這樣的網址路徑,以及負責回應它的程式碼。 |
常見迷思
- 「Next.js 取代了 React。」 並不是。它使用 React。你的元件仍然是 React 元件。
- 「Next.js 永遠是比較好的選擇。」 它的功能更強大,但也需要理解更多。伺服器端渲染、快取,以及伺服器端與客戶端程式碼之間的差別,都是造成令人困惑的錯誤的常見來源。對於大多數內容位於登入之後的 App,一般的 React 應用程式通常更簡單。
- 「Next.js 只能在 Vercel 上運行。」 它是開放原始碼,可以在任何 Node.js 伺服器或 Docker 容器中運行。如果不使用伺服器功能,也可以完全靜態匯出。
- 「使用 Next.js 就保證 SEO 良好。」 它讓可讀的頁面更容易被理解,但排名仍取決於標題、內容、速度與連結。
- 「Next.js 的伺服器程式碼會自動保持私密。」 標記為客戶端使用的程式碼最終會送到瀏覽器中。機密必須留在僅限伺服器的程式碼與環境變數中。
可以向 AI 製作工具提出的要求
- 「使用 Next.js 與 App Router」——如果你想要的話,請寫在第一則提示詞中。
- 「哪些頁面在伺服器上渲染、哪些是靜態的、哪些在瀏覽器中運行?請說明原因。」
- 「讓公開的行銷頁面與列表頁面採用伺服器端渲染或靜態方式,並設定好正確的標題與描述。」
- 「把 API 金鑰保存在僅限伺服器的程式碼與環境變數中。告訴我每一個金鑰是在哪裡讀取的。」
- 「這個 App 需要 Next.js 嗎?還是對我們要做的內容來說,Vite + React 會更簡單?」
Mythex 中的 Next.js
Mythex 預設使用 Vite + React + TypeScript + Tailwind,並在你於提示詞中要求時切換為 Next.js;及早說明這個需求,比之後再更改能節省點數。你可以在即時預覽中查看 App,而發佈會把它部署到一個線上網址,無需自己設定託管。Mythex 的文件指出,客戶端渲染的單頁應用程式在 SEO 方面較弱,相較於伺服器端渲染或靜態 HTML;因此,如果你的行銷網站很重視搜尋,最好一開始就說明(App 的 SEO)。
常見問題
用簡單的話來說,什麼是 Next.js?
Next.js 是建立在 React 之上的框架。React 負責製作使用者介面的各個元件;Next.js 則補上圍繞它們的網站其他部分,包括頁面與網址、伺服器端渲染、資料載入與後端程式碼,讓你能在同一個專案中完成一個完整的網路應用程式。
React 和 Next.js 有什麼差別?
React 是用來建立介面元件的函式庫。Next.js 是一個使用 React 的框架,並加入路由、伺服器端渲染、靜態頁面與伺服器端程式碼。每個 Next.js 應用程式都是 React 應用程式,但不是每個 React 應用程式都使用 Next.js。
Next.js 對 SEO 比較好嗎?
有可能。Next.js 能從伺服器或預先建置好的靜態頁面,把完整的 HTML 送給搜尋引擎與訪客;而純客戶端的 React 應用程式送出的,大多是空白頁面,之後才由 JavaScript 填入內容。不過,好的標題、描述與內容仍然比框架本身更重要。
使用 Next.js 一定要用 Vercel 嗎?
不一定。Next.js 是開放原始碼,由 Vercel 開發,但它可以在任何能運行 Node.js 的伺服器、Docker 容器上運行,或作為靜態匯出用於不需要伺服器功能的網站。部分功能在 Vercel 上比較容易設定。
我的 App 應該用 Next.js 還是 Vite?
對於需要登入的 App,例如儀表板或內部工具,Vite + React 更簡單,也運作良好。當你需要搜尋引擎容易讀取的內容、有大量公開頁面,或希望伺服器端渲染的頁面與後端程式碼位於同一個專案時,Next.js 才值得選擇。