這裡是有關動態路由的重要細節。
如同 getStaticProps,getStaticPaths 能夠對資料來源請求資料。在我們的例子中,getAllPostIds(在 getStaticPaths 中使用)可以對外部 API 進行資料請求:
export async function getAllPostIds() { // Instead of the file system, // fetch post data from an external API endpoint const res = await fetch('..'); const posts = await res.json(); return posts.map((post) => { return { params: { id: post.id, }, }; }); }
npm run dev 或 yarn dev), getStaticPaths 在每次請求發生時執行。getStaticPaths 在打包階段執行。試著回憶一下我們在 getStaticPaths 返回的 fallback: false 部分。這個用意是什麼?
如果 fallback 為 false,那麼任何路徑都不會被 getStaticPaths 返回,這將會導致 404 頁面 的結果。
如果 fallback 為 true,那麼 getStaticPaths 的行為會變成:
getStaticPaths 返回的路徑會在打包階段渲染成 HTML。如果 fallback 為 blocking,新的路徑將會利用 getStaticProps 進行伺服器端的渲染,且為了之後的請求進行快取,所以每個路徑知會發生一次這樣的過程。
這已經超出這堂課要談的內容了,但是如果想了解更多有關 fallback: true 和 fallback: 'blocking 細節的話請參考 fallback 文件。
動態路由可以藉由在 [] 新增(...)的方式來取得所有的路徑。比方說:
pages/posts/[...id].js 可以匹配 /posts/a, 及 /posts/a/b,/posts/a/b/c 以此類推。不過如果你這麼做的話,在 getStaticPaths 中,你必須回傳一個陣列作為 id 鍵的值,像是這樣:
return [ { params: { // Statically Generates /posts/a/b/c id: ['a', 'b', 'c'], }, }, //... ];
且 params.id 在 getStaticProps 中將會是陣列的形式:
export async function getStaticProps({ params }) { // params.id will be like ['a', 'b', 'c'] }
查看取得所有路徑的文件說明來了解更多。
如果你想操作 Next.js 路由的話,可以藉由引入 next/router 中的 useRouter 來使用。
為了建立一個客製化的 404 頁面,請建立一支 pages/404.js 的檔案。這隻檔案在打包階段會被靜態產生出來。
// pages/404.js export default function Custom404() { return <h1>404 - Page Not Found</h1>; }
前往錯誤頁面文件了解更多。
我們目前為止建立了許多範例來闡述 getStaticProps 及 getStaticPaths— 查看原始碼來了解更多:
在下一堂課,我們將會探討 Next.js 的 API 路由。
你想要利用 pages/products/[id].js([id]指的是產品的具體 ID) 的路徑來動態產生各個產品的頁面,以下哪個是正確的做法?