Gatsby JSON 中的绝对图像路径

Posted

技术标签:

【中文标题】Gatsby JSON 中的绝对图像路径【英文标题】:Absolute Image Paths in Gatsby JSON 【发布时间】:2019-07-06 11:41:53 【问题描述】:

我正在使用 gatsby-transformer-json 在 Gatsby 中查询 JSON 文件。 JSON 文件中有图像 URL,但它们是绝对文件路径,Gatsby 仅将相对路径转换为图像节点。

我的 JSON:


  "defaultImage": "images/defaultImage.jpg"

我的查询:

metadataJson 
  defaultImage 
    childImagageSharp 
      fixed(width: 3200, height: 2133) 
        ...GatsbyImageSharpFixed
      
    
  

但是,由于 Gatsby 遇到的是绝对路径并且它不是相对路径,因此失败并出现错误,因此它不会将其转换为 Sharp 图像节点。

如果是 Markdown 文件,我可以自己转换路径并将其保存到 Markdown 节点的 fields 对象。但是,gatsby-transformer-json 无法使用该选项。

如何转换 JSON 文件中的绝对路径,以便 Gatsby 将路径替换为 Sharp 图像节点?

【问题讨论】:

你解决了吗?你介意分享你的解决方案吗?我也有同样的挣扎…… 【参考方案1】:

您可以在任何类型的节点上使用createNodeField,而不仅仅是markdown备注。

如果你像下面这样设置gatsby-config.js


  resolve: `gatsby-source-filesystem`,
  options: 
    path: `$__dirname/content/meta`, <-- folder name is used to create node type name, i.e `MetaJson`
    name: `meta`, <-- doesn't affect json node's type name
  ,
,
`gatsby-transformer-json`,

然后您可以将它们转换为 gatsby-node.js,就像使用 MarkdownRemark 节点一样。

exports.onCreateNode = ( node, actions ) => 
  const  createNodeField  = actions

  if (node.internal.type === `MetaJson`) 
    const relativePath = ...

    createNodeField(
      node,
      name: `foo`,
      value: relativePath,
    )
  

您还可以将additional options 传入gatsby-transformer-json 以更精细地控制 json 节点的内部类型名称。


就像gatsby-transformer-remark 转换的markdown 一样,gatsby-transformer-json 转换的jsons 也将一个子节点附加到它的父文件节点上:


  file( sourceInstanceName:  eq: "meta"  ) 
    dir
    childMetaJson 
      fields 
        foo
      
    
  

【讨论】:

谢谢。这种方法看起来是正确的,但无论我做什么,我都无法让 Gatsby 将路径转换为 ​​File 节点,即使我使用了另一个正确转换的 frontmatter 图像的路径。它只是忽略该值并将其保留为字符串。 @Undistraction 没有更多上下文很难判断,但我认为问题可能在于,如果 gatsby 找到一个其字段未链接到文件的节点,它将假定该字段的类型对于所有其他节点(相同节点类型)。你的项目碰巧是开源的吗?或者你能在一个小仓库中复制这个问题吗?

以上是关于Gatsby JSON 中的绝对图像路径的主要内容,如果未能解决你的问题,请参考以下文章

来自 json 的 Gatsby 图像路径

Gatsby 从数据中获取具有相对路径的图像文件夹

在 Gatsby 中使用 ApolloClient 与 localhost / 本地 IP uri

如何在 Gatsby 静态图像组件上添加叠加层?

通过 gatsby-node 将图像导入 GraphQL 不起作用:缺少 childImageSharp

Gatsby - 使用 createRemoteFileNode 获取远程图像