如何从Gatsby.js中的YAML数组中获取图像

时间:2019-12-10 17:26:27

标签: reactjs gatsby gatsby-image

我正在使用Gatsby.js开发博客

每个帖子都是一个YAML文件,其中有一个用于画廊的数组,如下所示:

gallery:
-'/uploads/image1.jpg'
-'/uploads/image2.jpg'
-'/uploads/image3.jpg'
-'/uploads/image4.jpg'
-'/uploads/image5.jpg'

在帖子中,我有这样的内容:


const images = data.postData.frontmatter.gallery;

return (

{images.map((image, index) => {
            return (
  <img src={image}/>
)
}
)};

export const query = graphql`
query PostData($slug: String!) {
  postData: markdownRemark(fields: {slug: {eq: $slug}}) {
        frontmatter {
          gallery

        }
    }
}
`;

但是图像没有显示出来,因为它们在构建时没有经过处理并放置在静态文件夹中。

据我了解,插件'gatsby-plugin-sharp'不会转换YAML文件中数组中找到的图像,但是当它只是一张图像时就可以了...

(在某些帖子中有这样的字段

main-image: 'path/to/the/image'

然后我可以像这样用graphql进行采购:

     main-image {
       fluid {
         src
       }
     }
   }

,对于“画廊”数组,不会创建“流体”节点。)

我希望这是有道理的,我意识到我对某些事情有些困惑,希望您能帮助我理解一些知识。

谢谢

M

编辑

感谢@Z,我向前走了一点。兹拉特夫。

我将其插入gatsby-node.js:

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes } = actions;
  const typeDefs = `
    type MarkdownRemark
    implements Node {
      frontmatter: Frontmatter
    }
    type Frontmatter {
      gallery: [File]
    }
  `;
  createTypes(typeDefs);
};

,现在为图库数组中的每个图像创建节点。

但是,查询图像时我得到的是空...

一些细节:

YAML文件:

---
date: 2019-11-06T13:47:07.000+00:00
title: Cool Project
main_picture: "/uploads/simon-matzinger-Gpck1WkgxIk-unsplash.jpg"
gallery:
 - "/uploads/PROEGELHOEF.jpg"
 - "/uploads/swapnil-dwivedi-N2IJ31xZ_ks-unsplash-1.jpg"
 - "/uploads/swapnil-dwivedi-N2IJ31xZ_ks-unsplash.jpg"
 - "/uploads/simon-matzinger-Gpck1WkgxIk-unsplash.jpg"
---

这里是GraphQl查询:

query MyQuery {
  allMarkdownRemark(filter: {id: {eq: "af697225-a842-545a-b5e1-4a4bcb0baf87"}}) {
    edges {
      node {
        frontmatter {
          title
          gallery {
            childImageSharp {
              fluid {
                src
              }
            }
          }
        }
      }
    }
  }
}

以下是数据响应:

{
  "data": {
    "allMarkdownRemark": {
      "edges": [
        {
          "node": {
            "frontmatter": {
              "title": "Cool Project",
              "gallery": [
                {
                  "childImageSharp": null
                },
                {
                  "childImageSharp": null
                },
                {
                  "childImageSharp": null
                },
                {
                  "childImageSharp": null
                }
              ]
            }
          }
        }
      ]
    }
  }
}

我想我仍然想念一些东西...

2 个答案:

答案 0 :(得分:2)

我将尝试解释这在盖茨比的工作原理。首先,是gatsby-transformer-sharp插件将您的File节点转换为ImageSharp节点。 gatsby-plugin-sharp当然也作为低级API参与其中。

您遇到的主要问题是Gatsby无法识别(推断)您的数据作为对文件的引用。转换完成后,转换链将自动启动。Gatsby实际上试图找出string是否是文件路径,但是这些路径必须相对于它们所在的文件。

考虑以下示例:

gatsby-project
├── content
│   ├── images
│   │   └── home.png
│   └── pages
│       └── home.yml
└── src

content / pages / home.yml

title: Homepage
url: /
image: ../images/home.png

最简单的解决方案是在yaml文件中提供正确的相对路径。可悲的是,我们知道这并不总是可能的。由NetlifyCMS创建的文件就是一个例子。如果您也是这种情况,请尝试一些现有的解决方案,例如: https://www.gatsbyjs.org/packages/gatsby-plugin-netlify-cms-paths/

自Gatsby 2.2.0起,createSchemaCustomization API的存在使我们能够通过定义自定义解析器和字段扩展来更优雅地处理此类情况,但对于不熟悉GraphQL的人来说,这可能令人望而生畏。进一步了解here

答案 1 :(得分:0)

我通过安装以下命令来解决:https://www.npmjs.com/package/@forestryio/gatsby-remark-normalize-paths

感谢您将我带往正确的方向。

M