【问题标题】:Gatsby: How to handle undefined fields in siteMetadata?Gatsby:如何处理 siteMetadata 中未定义的字段?
【发布时间】:2020-11-09 01:36:31
【问题描述】:

我想根据是否定义了 logo 字段来构建站点标题(如果未定义,则将使用站点标题)。

gatsby-config.js:

module.exports = {
  siteMetadata: {
    title: 'Hello Web',
    logo: '/images/logo.png'
  }
}

查询:

const query = graphql`
  {
    site {
      siteMetadata {
        title
        logo
      }
    }
  }

以上工作正常,但如果我删除logo 字段build breaks

我阅读了 Gatsby 文档中的架构自定义部分,但没有找到任何适用的内容(我是否遗漏了什么?)。

我目前的解决方案是将logo 设置为一些“虚拟内容”。虽然它有效,但它显然不是一个优雅的解决方案,并且随着项目的发展会出现一些缺点。

截图:

【问题讨论】:

    标签: graphql gatsby


    【解决方案1】:

    查看create types in this blog post.fixing fields in the the docs

    createTypes 可用于定义、修复或扩展 Gatsby GraphQL 类型,该类型代表您应用的某些数据。可以把它想象成一个逃生舱,礼貌地告知 Gatsby 你的数据的形状。

    Gatsby 根据构建时可用的数据推断架构。如果您尝试查询不存在的字段,您将收到构建错误。

    使用 createTypes,您可以告诉 gatsby,logo 字段在 SiteSiteMetadata 类型上是可以为空的 String。现在,如果在您的数据源中找不到该字段,您将获得一个空值,但 gatsby 可以成功构建。

    // gatsby-node.js
    
    exports.sourceNodes = ({ actions }) => {
      const { createTypes } = actions
      const typeDefs = `
        type SiteSiteMetadata implements Node {
          logo: String
        }
      `
      createTypes(typeDefs)
    }
    

    请注意,其他字段(标题、描述、作者)不必提供,它们仍将由 Gatsby 的类型推断处理。

    【讨论】:

      猜你喜欢
      • 2017-09-09
      • 2019-05-27
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多