我正在使用Next。js的Static HTML Export
适用于我的站点,它有1000万个静态页面,但我在构建应用程序时遇到了内存问题。
甚至有可能在第一次构建时将其导出为100k页,然后在第二次构建时导出为100k页,以此类推吗?
我不想用Incremental Static Regeneration
或getServerSideProps
来削减成本。
本网站使用的MongoDB只有两个页面主页和帖子页面:
index.js
[postPage].js
在主页中,我使用了以下代码:
export async function getStaticProps() {
const { db } = await connectToDatabase();
const postsFeed = await db
.collection("myCollection")
.aggregate([{ $sample: { size: 100 } }])
.toArray();
return {
props: {
postsFeed: JSON.parse(JSON.stringify(postsFeed)),
},
};
}
在帖子页面中,我使用了以下代码:
export async function getStaticPaths() {
const { db } = await connectToDatabase();
const posts = await db
.collection("myCollection")
.find({})
.toArray();
const paths = posts.map((data) => {
return {
params: {
postPage: data.slug.toString(),
}
}
})
return {
paths,
fallback: 'blocking'
}
}
export async function getStaticProps(context) {
const postSlug = context.params.postPage;
const { db } = await connectToDatabase();
const posts = await db
.collection("myCollection")
.find({ slug: { $eq: postsSlug } })
.toArray();
const postsFeed = await db
.collection("myCollection")
.aggregate([{ $sample: { size: 100 } }])
.toArray();
return {
props: {
posts: JSON.parse(JSON.stringify(posts)),
postsFeed: JSON.parse(JSON.stringify(postsFeed)),
},
};
}
1条答案
按热度按时间3yhwsihp1#
似乎不是处理静态页面https://github.com/vercel/next.js/discussions/14929批的内置选项
我只能想到使用bash脚本来划分工作,在这个脚本中设置一个env变量,并在代码中使用它来获取数据以生成路径,然后根据需要分割数据的部分运行build命令,在每次迭代中,将生成的文件移到另一个目录,这将是您的合并输出。
在你得到
getStaticPaths
请注意,如果数据经常更改,您将看到不正确的结果,如重复的页面或跳过的页面,因为每次分页都会在运行脚本时的不同时刻发生。我相信您可以创建一个辅助节点(或另一种语言)脚本来更好地处理大量记录,可能是以streamlined的方式,并为每个数据块生成JSON文件,以在
getStaticPaths
中使用它们,而不是直接从DB中获取它们。