nextjs13服务器组件中昂贵的API调用

sbdsn5lh  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(130)

我有这个服务器组件

const ContentSubmissions = async () => {
  const blogsData: any = await getBlogsData();
  const galleryData: any = await getGalleryData();
  const questionsData: any = await getQuestionsData();

  const fullData = [ 
    ...blogsData,
    ...galleryData,
    ...questionsData,
  ];

  return (
    <p className="text-lg md:text-2xl font-bold text-white">
      {fullData ? fullData.length : 0}
    </p>
  );
};

字符串
它被用来

<Suspense fallback={<Loading />}>
          <ContentSubmissions />
        </Suspense>


在客户端组件中。
问题是这是一个昂贵的调用,并且每次用户重新访问页面时它重新获取所有数据,
有没有办法处理它?像缓存?限制调用?或者什么是最好的方法来避免多个调用
类似getBlogsData的函数是fire base中的一个get docs from collection:

export async function getBlogsData() {
  const blogsData: any[] = [];
  const blogRef = query(collection(db, "blogs"));

  const snapshot = await getDocs(blogRef);
  if (snapshot.empty) {
    console.log("No matching documents.");
    return [];
  }
  snapshot.forEach((doc: any) => {
    blogsData.push({ id: doc.id, ...doc.data() });
  });
  return blogsData;
}

mum43rcc

mum43rcc1#

你可以使用revalidateTag,每当博客、问题或图库被更改、更新或删除时,你都可以重新验证与该获取相关联的标签。
范例:

fetch('.../id/123', {
  next: {
    revalidate: 3600 * 2,
    tags:['blog:id:123']
  },
});

// when the blog is updated
const db.updateBlogId("123")
revalidateTag('blog:id:123')

字符串
阅读更多:https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating
您还可以通过执行Promise.all([.])来优化三个独立API调用的速度

相关问题