2

我刚刚开始将GatsbySanity无头 CMS 一起使用。

在大多数情况下,它非常简单。但是了解通过 GraphQL 查询数据的最佳实践仍然困扰着我。我目前的做法只是在 GraphQL 操场上疯狂地点击我的 CMS 结构并找到我想要的。这行得通,但这种方法缺乏统一性让我感到不安。

例如,如果我想要某个 CMS 中某处的英雄图像,我需要执行以下操作:

query SomePageQuery($id: String) {
  sanitySomePage(id: { eq: $id }) {
    id
    heroImage {
      asset {
        fluid(maxWidth: 1500) {
          ...GatsbySanityImageFluid
        }
      }
    }
  }
}

但是如果我想要一些PortableText块,那么我需要查询_raw任何类型的相应字段。所以,如果我的类型是introText,盖茨比也提供了一个_rawIntroText. 我只能从这个_raw版本的数据中获取完整的 PortableText。像这样:

query SomePageQuery($id: String) {
  sanitySomePage(id: { eq: $id }) {
    id
    _rawIntroText
  }
}

似乎,对于某些数据您可以使用[Type],有时您必须使用_raw[Type].

没有大量文档说明为什么会这样。而且我不确定这是通过理智还是盖茨比强制执行的。

我想我的问题是,为什么_raw[Anything]Gatsby 和/或 Sanity 世界中存在,人们如何决定使用哪个(除了在 GraphQL 操场和运行时试错)?

4

1 回答 1

6

这来自 Sanity 构建和维护的 gatsby-source-sanity 插件。希望来自 Sanity 的人可以提供更多上下文,但实际上这些_raw[FieldName]条目会返回该字段的原始 JSON 数据。不带前缀的字段(例如fieldName)可能不是您想要的——它只会包含有关数据的元数据位。

我倾向于提取_raw[FieldName]数据,然后直接将其传递给@sanity/block-content-to-react组件,如下所示:

import React from "react"
import { graphql } from "gatsby"
import SanityBlockContent from "@sanity/block-content-to-react"

export default ({ data: { page } }) => (
  <SanityBlockContent
    blocks={page.textContent}
    projectId={process.env.GATSBY_SANITY_PROJECT_ID}
    dataset={process.env.GATSBY_SANITY_DATASET}
  />
)

export const query = graphql`
  query SomePageQuery($id: String) {
    page: sanitySomePage(id: { eq: $id }) {
      textContent: _rawTextContent
    }
  }
`

请注意,我使用 GraphQL 别名来继续引用textContent我的组件中的字段,而不是将组件耦合到此 GraphQL 模式的细节。

您不需要将 Gatsby Image 用于 Sanity 图像,因为无论如何它们都有自己的图像转换管道。相反,您可以只获取asset { _id }然后@sanity/client像这样使用来生成图像 url:

import sanityClient from "@sanity/client"
import sanityImageUrl from "@sanity/image-url"

const client = sanityClient({
  dataset: process.env.GATSBY_SANITY_DATASET,
  projectId: process.env.GATSBY_SANITY_PROJECT_ID,
  useCdn: true,
})

const builder = sanityImageUrl(client)

builder.image({ _id: "..." }).width(400).dpr(2).url()
于 2020-03-10T19:35:05.983 回答