防止特定语言环境的 getStaticPaths 运行
Prevent getStaticPaths running for specific locale
是否可以阻止 Next.js getStaticPaths
为特定语言环境生成静态页面?
在我的下一个配置中:
i18n: {
locales: ['default', 'en', 'hu', 'de', 'cz', 'eu', 'sl'],
defaultLocale: 'default',
localeDetection: true,
},
那是因为我们一直需要语言环境,默认情况下 Next.js 不支持它,所以我们必须使用官方 Next.js 文档后面的中间件技巧: https://github.com/vercel/next.js/discussions/18419
但是现在当我想生成站点时,我不想生成像
这样的页面
- /default/products/id1
- /default/products/id2
如何防止 Next.js 这样做?因为这不起作用:
对于我的常见问题解答页面,其中 /help/[maincategory]/[subcategory]/[help]
.
使用slice
(我将跳过默认语言环境):
locales.slice(1).map((locale) => {
pages.map((item) => {
item.data.mainTabList?.[locale]?.map((main, mainidx) => {
main.subTabList?.map((sub, subidx) => {
questions.map((help) => {
help.data.helplist?.[locale]?.map((title) => {
const urllink = {
maincategory: urlConverter(main.tab),
subcategory: urlConverter(sub.tab),
help: title.url
}
routes.push(urllink)
})
})
})
})
})
})
const paths = routes.map((doc) => ({
params: {
maincategory: `${doc.maincategory}`,
subcategory: `${doc.subcategory}`,
help: doc.help?.toLowerCase(),
},
}))
谁能帮我解决这个问题,/default
页面不会生成,因为这只是我的语言环境前缀的一种 hacky 方式,我们不会在任何地方使用它。
可以通过在 paths
数组中返回所需的语言环境来控制 getStaticPaths
将为哪些语言环境生成路径。
来自 i18n Dynamic Routing 文档:
For pages using getStaticProps
with Dynamic Routes, all locale
variants of the page desired to be prerendered need to be returned
from getStaticPaths
. Along with the params
object returned for paths
,
you can also return a locale
field specifying which locale you want to
render.
在您的情况下,您的 getStaticPaths
函数应大致如下所示。
export const getStaticPaths = ({ locales }) => {
// Your own logic
// Filter out the `default` locale, and map through the remaining locales
locales.filter((locale) => locale !== 'default').map((locale) => {
pages.map((item) => {
item.data.mainTabList?.[locale]?.map((main, mainidx) => {
main.subTabList?.map((sub, subidx) => {
questions.map((help) => {
help.data.helplist?.[locale]?.map((title) => {
const urlLink = {
maincategory: urlConverter(main.tab),
subcategory: urlConverter(sub.tab),
help: title.url,
locale // Also push current `locale` value to be used in `paths` array
}
routes.push(urlLink)
})
})
})
})
})
})
const paths = routes.map((doc) => ({
params: {
maincategory: `${doc.maincategory}`,
subcategory: `${doc.subcategory}`,
help: doc.help?.toLowerCase(),
},
locale: doc.locale // Pass `locale` value here
}))
return {
paths,
fallback: false
}
}
是否可以阻止 Next.js getStaticPaths
为特定语言环境生成静态页面?
在我的下一个配置中:
i18n: {
locales: ['default', 'en', 'hu', 'de', 'cz', 'eu', 'sl'],
defaultLocale: 'default',
localeDetection: true,
},
那是因为我们一直需要语言环境,默认情况下 Next.js 不支持它,所以我们必须使用官方 Next.js 文档后面的中间件技巧: https://github.com/vercel/next.js/discussions/18419
但是现在当我想生成站点时,我不想生成像
这样的页面- /default/products/id1
- /default/products/id2
如何防止 Next.js 这样做?因为这不起作用:
对于我的常见问题解答页面,其中 /help/[maincategory]/[subcategory]/[help]
.
使用slice
(我将跳过默认语言环境):
locales.slice(1).map((locale) => {
pages.map((item) => {
item.data.mainTabList?.[locale]?.map((main, mainidx) => {
main.subTabList?.map((sub, subidx) => {
questions.map((help) => {
help.data.helplist?.[locale]?.map((title) => {
const urllink = {
maincategory: urlConverter(main.tab),
subcategory: urlConverter(sub.tab),
help: title.url
}
routes.push(urllink)
})
})
})
})
})
})
const paths = routes.map((doc) => ({
params: {
maincategory: `${doc.maincategory}`,
subcategory: `${doc.subcategory}`,
help: doc.help?.toLowerCase(),
},
}))
谁能帮我解决这个问题,/default
页面不会生成,因为这只是我的语言环境前缀的一种 hacky 方式,我们不会在任何地方使用它。
可以通过在 paths
数组中返回所需的语言环境来控制 getStaticPaths
将为哪些语言环境生成路径。
来自 i18n Dynamic Routing 文档:
For pages using
getStaticProps
with Dynamic Routes, all locale variants of the page desired to be prerendered need to be returned fromgetStaticPaths
. Along with theparams
object returned forpaths
, you can also return alocale
field specifying which locale you want to render.
在您的情况下,您的 getStaticPaths
函数应大致如下所示。
export const getStaticPaths = ({ locales }) => {
// Your own logic
// Filter out the `default` locale, and map through the remaining locales
locales.filter((locale) => locale !== 'default').map((locale) => {
pages.map((item) => {
item.data.mainTabList?.[locale]?.map((main, mainidx) => {
main.subTabList?.map((sub, subidx) => {
questions.map((help) => {
help.data.helplist?.[locale]?.map((title) => {
const urlLink = {
maincategory: urlConverter(main.tab),
subcategory: urlConverter(sub.tab),
help: title.url,
locale // Also push current `locale` value to be used in `paths` array
}
routes.push(urlLink)
})
})
})
})
})
})
const paths = routes.map((doc) => ({
params: {
maincategory: `${doc.maincategory}`,
subcategory: `${doc.subcategory}`,
help: doc.help?.toLowerCase(),
},
locale: doc.locale // Pass `locale` value here
}))
return {
paths,
fallback: false
}
}