返回

Next.js App Router 数据库调用优化:单次调用获取所需数据

javascript

优化 Next.js App Router 中的数据库调用:单次调用实现数据获取

简介

在使用 Next.js App Router 构建应用程序时,我们经常需要从数据库获取数据以生成元数据和呈现页面。然而,传统的实现方式可能涉及多次数据库调用,导致效率低下。本文将探索如何通过使用数据预取来优化此过程,从而实现单次数据库调用以获取所需数据。

问题

考虑以下场景:

  • 服务器组件包含 generateMetadata 函数和 Page 组件。
  • generateMetadata 生成元数据,Page 组件渲染页面。
  • 这两个功能都需要从数据库获取博客数据。
  • 目前需要对数据库进行两次调用,一次用于 generateMetadata,一次用于 Page 组件。

解决方案:数据预取

Next.js 提供了数据预取功能,允许我们在页面渲染之前从服务器获取数据。通过这种方式,我们可以使用单次数据库调用获取博客数据,然后将数据传递给 generateMetadata 函数和 Page 组件。

实施步骤

1. 定义数据预取函数

首先,定义一个数据预取函数来获取博客数据:

export async function getBlogBySlug(slug: string) {
  // 从数据库获取博客数据
}

2. 使用数据预取函数

generateMetadata 函数和 Page 组件中使用数据预取函数:

generateMetadata

export async function generateMetadata({ params }: GenerateMetadataProps): Promise<Metadata> {
  const blog = await getBlogBySlug(params.slug);

  // 使用博客数据生成元数据
}

Page

const Page = async ({ params, searchParams }: PageProps) => {
  const { slug } = params;

  const blog = await getBlogBySlug(slug);

  // 使用博客数据渲染页面
};

3. 在 getStaticProps 中调用数据预取函数

getStaticProps 函数中调用数据预取函数以在构建时获取数据:

export const getStaticProps: GetStaticProps = async ({ params }) => {
  const { slug } = params;

  const blog = await getBlogBySlug(slug);

  return {
    props: {
      blog,
    },
  };
};

优点

通过使用数据预取,我们可以:

  • 消除对数据库的两次调用。
  • 提高效率并优化应用程序性能。
  • 维护一个单一的、一致的数据源。

常见问题解答

1. 什么时候应该使用数据预取?

当需要在页面渲染之前从服务器获取数据时,应该使用数据预取。

2. 数据预取与服务器端渲染有什么区别?

数据预取在页面渲染之前获取数据,而服务器端渲染在页面渲染之后获取数据。

3. 数据预取有什么限制?

数据预取的数据大小有限制。对于较大的数据集,建议使用增量式数据预取。

4. 数据预取对 SEO 有什么影响?

数据预取不会影响 SEO,因为它是服务器端操作。

5. 如何排除数据预取?

可以通过在 getStaticProps 函数中返回 revalidate: false 来排除数据预取。

结论

通过使用数据预取,我们能够优化 Next.js App Router 中的数据库调用,从而实现单次调用获取所需数据。这提高了应用程序性能,并为更加健壮和高效的 Web 应用程序铺平了道路。