在 Next.js 15 中,`generateMetadata` 函数确实是在服务器端渲染(SSR)阶段之前运行的,这意味着它会在页面组件(如 `Page` 函数组件)的数据请求之前执行。因此,为了避免重复请求数据,你可以采取以下几种策略:
1. **在 `generateMetadata` 中请求数据**:
如果你希望在设置元数据时就获取数据,可以在 `generateMetadata` 函数中直接发起数据请求。这样,当页面组件渲染时,数据已经准备好,无需再次请求。
export async function generateMetadata({ params, searchParams }, parent) {
const response = await fetchSomeData(params, searchParams); // 假设这是一个数据请求函数
return {
title: response.title,
// 其他元数据...
};
}
export default function Page({ data }) {
// 业务逻辑,data 可以通过 getServerSideProps 或其他方式传递给页面
return <div>{data.content}</div>;
}
// 注意:在实际应用中,你可能需要通过 getServerSideProps 或 getInitialProps 来获取数据并传递给 Page 组件。
// 这里为了简化示例,没有展示这部分代码。
2. **利用全局状态管理**:
如果数据请求较为复杂或需要在多个页面间共享,可以考虑使用全局状态管理工具(如 Redux、MobX 或 React 的 Context API)来存储和管理数据。这样,你可以在 `generateMetadata` 和页面组件中共享同一份数据,避免重复请求。
3. **客户端渲染时更新元数据**:
如果数据请求不是必须的或可以延迟到客户端渲染时,你也可以选择在页面组件中请求数据,并在数据获取后通过客户端逻辑更新页面的元数据(如标题)。不过,这种方法通常不推荐用于 SEO 重要的元数据,因为搜索引擎爬虫可能无法捕获到动态更新的元数据。
总之,选择哪种方法取决于你的具体需求,如数据的重要性、请求的复杂度以及是否需要优化 SEO 等。在大多数情况下,直接在 `generateMetadata` 中请求数据是一个简单而有效的解决方案。