First, let’s set up the files:
[id].js inside the pages/posts directory.first-post.js inside the pages/posts directory — we’ll no longer use this.Then, add this to pages/posts/[id].js. We’ll fill in ... later.
import Layout from '../../components/layout' export default function Post() { return <Layout>...</Layout> }
Then, open lib/posts.js and add this function. This will return the list of file names (excluding .md) in the posts directory:
export function getAllPostIds() { const fileNames = fs.readdirSync(postsDirectory) // Returns an array that looks like this: // [ // { // params: { // id: 'ssg-ssr' // } // }, // { // params: { // id: 'pre-rendering' // } // } // ] return fileNames.map(fileName => { return { params: { id: fileName.replace(/\.md$/, '') } } }) }
Important: The returned list is not just an array of strings — it must be an array of objects that look like the comment above. Each object must have the params key and contain an object with the id key (because we’re using [id] in the file name). Otherwise, getStaticPaths will fail.
Finally, in pages/posts/[id].js, we’ll import this function:
import { getAllPostIds } from '../../lib/posts'
And create getStaticPaths which calls this function:
export async function getStaticPaths() { const paths = getAllPostIds() return { paths, fallback: false } }
id must be the value of the paths key of the returned object. This is exactly what getAllPostIds() returns.fallback: false for now — we’ll explain that later.We’re almost done — but we still need to implement getStaticProps. Let’s do that on the next page!