javascript - Gatsby JSON 中的绝对图像路径

标签 javascript json image gatsby sharp

我正在使用 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 图像节点?

最佳答案

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

如果您像下面这样设置 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
      }
    }
  }
}

关于javascript - Gatsby JSON 中的绝对图像路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54656648/

相关文章:

javascript - Vue.js:在 laravel 公共(public)文件夹中显示个人资料图片

javascript - 输入 Intl.NumberFormat 时,VueJS 数字格式实时以逗号分隔

javascript - 使用 post 方法时对 php 的 AJAX 调用不返回值

字符 "with the characters\"的 Javascript .replace()

angularjs - JSON 中位置 0 处出现意外标记 T

javascript - 写入图库时出错

Javascript image.onload() 保证图像已加载?

javascript - 将 RSS 数据加载到全局变量中

javascript - 显示数据表响应模式后我可以调用函数吗

json - 如何在 Swift 的 Alamofire 中发送 body 参数?