Реализация getStaticPaths
Сначала настроим файлы:
- Создайте файл
[id].js
в директорииpages/posts
. - Также удалите
first-post.js
из директорииpages/posts
— он больше не понадобится.
Затем откройте pages/posts/[id].js
в редакторе и вставьте следующий код. Позже мы заполним ...
:
import Layout from '../../components/layout';
export default function Post() {
return <Layout>...</Layout>;
}
Далее откройте lib/posts.js
и добавьте следующую функцию getAllPostIds
в конце файла. Она возвращает список имен файлов (без расширения .md
) из директории posts
:
export function getAllPostIds() {
const fileNames = fs.readdirSync(postsDirectory);
// Возвращает массив вида:
// [
// {
// params: {
// id: 'ssg-ssr'
// }
// },
// {
// params: {
// id: 'pre-rendering'
// }
// }
// ]
return fileNames.map((fileName) => {
return {
params: {
id: fileName.replace(/\.md$/, ''),
},
};
});
}
Важно: Возвращаемый список — это не просто массив строк. Он должен быть массивом объектов, как показано в комментарии выше. Каждый объект должен содержать ключ params
с вложенным объектом, имеющим ключ id
(поскольку мы используем [id]
в имени файла). В противном случае функция getStaticPaths
завершится ошибкой.
Наконец, импортируем функцию getAllPostIds
и используем её внутри getStaticPaths
. Откройте pages/posts/[id].js
и скопируйте следующий код перед экспортируемым компонентом Post
:
import { getAllPostIds } from '../../lib/posts';
export async function getStaticPaths() {
const paths = getAllPostIds();
return {
paths,
fallback: false,
};
}
paths
содержит массив известных путей, возвращаемыхgetAllPostIds()
, включая параметры, определенные вpages/posts/[id].js
. Подробнее в документации по ключуpaths
- Пока не обращайте внимания на
fallback: false
— мы объясним это позже.
Мы почти закончили — осталось только реализовать getStaticProps
. Займёмся этим на следующей странице!