从Sanity v4+Next.js13.4迁移至next-sanity v7,求getClient示例
next-sanity v5+ 适配App Router的getClient实现方案
针对你从next-sanity v4升级到v7(需先完成v4到v5过渡)的需求,这里提供符合官方App Router迁移指南的client.js完整示例,替代你之前直接导出的固定client:
完整client.js代码
import { createClient } from 'next-sanity' import { apiVersion, dataset, projectId, useCdn } from '../schemas/env' // 创建可复用的getClient函数,支持动态配置选项 export function getClient(previewMode = false) { const client = createClient({ projectId, dataset, apiVersion, useCdn: !previewMode && useCdn, // 预览模式下禁用CDN,确保获取最新内容 perspective: previewMode ? 'previewDrafts' : 'published', }) // 预览模式下附加预览token(可选,若需要访问草稿内容) if (previewMode) { client.config({ token: process.env.SANITY_PREVIEW_TOKEN, }) } return client } // 导出默认的生产环境client(兼容原有直接导入的用法) export const client = getClient()
关键改动说明
- 改用
getClient函数替代固定client,支持根据预览模式动态调整配置 - 预览模式下自动切换
perspective为previewDrafts,并禁用CDN,确保能获取未发布的草稿内容 - 可选添加预览token配置,需在环境变量中配置
SANITY_PREVIEW_TOKEN(从Sanity后台获取) - 保留原有的
client导出,兼容你之前直接导入的代码,减少迁移成本
使用示例
- 生产环境/静态生成(同原有用法):
import { client } from './client' const data = await client.fetch(`*[_type == "post"]`)
- 预览模式(如在App Router的路由处理函数中):
import { getClient } from './client' export async function getServerSideProps(context) { const isPreview = context.preview || false const client = getClient(isPreview) const data = await client.fetch(`*[_type == "post"]`) return { props: { data, isPreview } } }
内容的提问来源于stack exchange,提问作者Thorvald
相关产品推荐
相关产品推荐

