Next.js 9.3+ и универсальные маршруты
Next.js здесь новичок, надеясь на указатели по использованию getStaticPaths
а также getStaticProps
с комплексными маршрутами. Большинство авторов блогов Next.js 9.3+, похоже, основаны только на одном уровне сообщений в блогах (например,/posts/post-1.md
, /posts/post-2.md
и т. д.), но то, что я тщетно пытался найти, это стартер - или просто набор инструкций, - которые касаются обработки, скажем, /posts/yyyy/mm/postname.md
через /pages/posts/[...post].js
.
Я, конечно, читал документацию Next.js по этим вопросам, но я считаю, что они немного полезны, по крайней мере, в этом конкретном случае. Я понимаю, что они написаны для более опытных разработчиков Next.js. Этот элемент из https://nextjs.org/docs/routing/dynamic-routes приближает меня настолько близко, насколько я могу в данный момент, но не достаточно далеко:
Если в названии страницы используются маршруты для приема всей почты домена, например
pages/[...slug]
, тогдаparams
должен содержатьslug
который представляет собой массив. Например, если этот массив['foo', 'bar']
, то Next.js статически сгенерирует страницу по адресу/foo/bar
.
Я пробовал использовать fs-readdir-recursive
читать /posts/
различных уровней каталога, и это работает, но то, что он дает мне, не создает массив, который getStaticPaths
хочет. Я уверен, что мне просто нужно массировать результат, но я не могу найти никаких примеров, которые помогли бы мне это понять. (Большинство примеров, которые идут дальше одноуровневого сценария, похоже, имеют дело с выборкой из БД, возможно, потому, что сценарий, который я пытаюсь найти, считается слишком простым. Возможно, для не новичков, но...)
1 ответ
Если все ваши сообщения следуют одним и тем же шаблонам URL, я бы предпочел использовать следующую структуру:
pages/
└── posts/
└── [year]/
└── [month]/
└── [slug].js
В зависимости от того, как вы храните свои сообщения, ваш getStaticPaths
останется только перечислить сообщения и выставить year
, month
а также slug
за каждый пост.
export async function getStaticPaths() {
const posts = await getAllPosts()
return {
fallback: false,
paths: posts.map(post => ({
params: {
year: post.year,
month: post.month,
slug: post.slug
}
})
}
}
Тогда у вас будет доступ ко всем year
, month
а также slug
параметры в getStaticProps
.
export async function getStaticProps({params}) {
// Retrieve blog post from year, month and slug
const post = await getBlogPost({
year: params.year,
month: params.month,
slug: params.slug
})
return {
props: {
post
}
}
}