You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:27:26