我想基于是否定义了logo
字段来构建网站标题(如果未定义,则将使用网站标题)。
gatsby-config.js:
module.exports = {
siteMetadata: {
title: 'Hello Web',
logo: '/images/logo.png'
}
}
查询:
const query = graphql`
{
site {
siteMetadata {
title
logo
}
}
}
上面的方法工作正常,但是如果我删除build breaks的logo
字段。
我阅读了盖茨比(Gatsby)文档上的“模式自定义”部分,但没有找到任何适用的内容(我是否遗漏了什么?)。
我当前的解决方案是将logo
设置为某些“虚拟内容”。尽管它可以工作,但显然不是一个很好的解决方案,并且随着项目的发展会存在一些缺点。
截屏:
答案 0 :(得分:1)
签出create types in this blog post.和fixing fields in the the docs。
createTypes
可用于定义,修复或扩展表示您的某些应用数据的Gatsby GraphQL类型。可以将它视为逃生舱口,以便向盖茨比告知您数据的形状。
Gatsby根据构建时可用的数据来推断模式。如果您尝试查询不存在的字段,则会收到构建错误。
使用createTypes
可以告诉盖茨比,logo
字段是String
类型的可空SiteSiteMetadata
。现在,如果在数据源中未找到该字段,则将获得一个空值,但是gatsby可以成功构建。
// gatsby-node.js
exports.sourceNodes = ({ actions }) => {
const { createTypes } = actions
const typeDefs = `
type SiteSiteMetadata implements Node {
logo: String
}
`
createTypes(typeDefs)
}
请注意,不必提供其余字段(标题,描述,作者),它们仍将由Gatsby的类型推断来处理。