如何导出大型Next,js部分静态站点?

relj7zay  于 2022-10-22  发布在  Java
关注(0)|答案(1)|浏览(109)

我正在使用Next。js的Static HTML Export适用于我的站点,它有1000万个静态页面,但我在构建应用程序时遇到了内存问题。
甚至有可能在第一次构建时将其导出为100k页,然后在第二次构建时导出为100k页,以此类推吗?
我不想用Incremental Static RegenerationgetServerSideProps来削减成本。
本网站使用的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)),
    },
  };
}
3yhwsihp

3yhwsihp1#

似乎不是处理静态页面https://github.com/vercel/next.js/discussions/14929批的内置选项
我只能想到使用bash脚本来划分工作,在这个脚本中设置一个env变量,并在代码中使用它来获取数据以生成路径,然后根据需要分割数据的部分运行build命令,在每次迭代中,将生成的文件移到另一个目录,这将是您的合并输出。

COUNTER=1
PARTS=100 # change it to control number of parts
while [ $COUNTER -lt $PARTS ]; do
    let COUNTER=COUNTER+1
     CURRENT=$COUNTER PARTS=$PARTS next build
    # move generated files to another directory
done

在你得到getStaticPaths

export async function getStaticPaths() {
  const currentPercentage = process.env.CURRENT/process.env.PARTS
  // logic to fetch the corresponding current percentage of the data
  // 1% when there are 100 parts, 0.5% when 200 parts, etc.
}

请注意,如果数据经常更改,您将看到不正确的结果,如重复的页面或跳过的页面,因为每次分页都会在运行脚本时的不同时刻发生。我相信您可以创建一个辅助节点(或另一种语言)脚本来更好地处理大量记录,可能是以streamlined的方式,并为每个数据块生成JSON文件,以在getStaticPaths中使用它们,而不是直接从DB中获取它们。

相关问题