gatsby中allFile和allMarkdownRemark有什么区别

What is the difference between allFile and allMarkdownRemark in gatsby

所有文件查询:

query{
  allFile{
    edges{
      node{
        childMarkdownRemark{
          frontmatter{
            title
            desc
            link
          }
        }
        childImageSharp{
          fluid{
            srcSetWebp
          }
        }
      }
    }
  }
}

对于上面的 allFile 查询,我得到以下输出

{
  "data": {
    "allFile": {
      "edges": [
        {
          "node": {
            "childMarkdownRemark": {
              "frontmatter": {
                "title": "Arrays in Javascript ",
                "desc": "I am hello i am the greatest lorem ipsum diut shit in the world of world",
                "link": null
              }
            },
            "childImageSharp": null
          }
        },
      }

allMarkdown查询:

query{
  allMarkdownRemark{
    edges{
      node{
        frontmatter{
          title
          desc
          link
        }
      }
    }
  }
}

上述 allMarkdown 查询的输出是

{
  "data": {
    "allMarkdownRemark": {
      "edges": [
        {
          "node": {
            "frontmatter": {
              "title": "This is party react",
              "desc": "I am React GUyyyy ",
              "link": null
            }
          }
        },

输出限制为1项以保存space问题

allFileallMarkdownRemark query

之间有性能差异吗

allFile查询中,我们可以获取相对路径相对目录,而allMarkdownRemark仅限于fileAbsolutePath

如上所示,我们可以使用 childMarkdownRemarkallFile 查询中访问降价。

在许多 YouTube 教程中,人们使用 allMarkdownRemark。这样做有什么具体原因吗?

它始终取决于您的文件系统及其设置方式。

简短的回答是 allFile 检索在您的 gatsby-source-filesystem 中设置的所有类型的文件(图像、降价、JSONs 等),而 allMarkdownRemark 仅获取降价文件,因为转换器插件之前已经创建了一个特定的节点来执行此操作。

allMarkdownRemark当然更具体,性能更好,因为你只查询markdown文件,而不是像allFile那样查询所有类型的文件。关于过滤器,两者都可用(相对和绝对路径),使用 GraphQL playground (localhost:8000/___graphql) 来测试它们。


TL;DR

gatsby-source-filesystem 从文件创建文件节点。各种“转换器”插件可以将文件节点转换为各种其他类型的数据,例如gatsby-transformer-json 将 JSON 文件转换为 JSON 数据节点,gatsby-transformer-remark 将 markdown 文件转换为 MarkdownRemark 节点,您可以从中查询 HTML 表示降价.

总结一下,gatsby-source-filesystem 检索所有类型的文件,但必须为每个数据文件夹设置,以帮助其他插件将文件类型转换为节点,以使其可用于 Gatsby 和 GraphQL。

allMarkdownRemark,是另一个转换器插件,它将所有 markdown 文件(之前在 gatsby-source-filesystem 中设置)转换为 GraphQL 节点,以便在您查询 markdown 文件时可以使用它们,从而允许您检索特定的来自它的数据。

让我们假设一个文件系统如下:

{
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `images`,
    path: `${__dirname}/src/images/`,
  },
},

{
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `jsons`,
    path: `${__dirname}/src/jsons/`,
  },
},
{
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `markdowns`,
    path: `${__dirname}/src/markdowns/`,
  },
},

如果你像这样离开文件系统,allFile 将检索 JSONs 以及图像和降价,但你将无法从中查询特定数据,因为没有转换器已创建节点的插件,此外,您将失去使用组合插件的所有好处。如果您使用以前的文件系统配置添加 gatsby-transformer-remark,例如:

{
  resolve: `gatsby-transformer-remark`,
  options: {
    plugins: [
      {
        resolve: `gatsby-remark-relative-images`,
      },
      {
        resolve: `gatsby-remark-images`,
        options: {
          maxWidth: 1200,
          withWebp: true,
        },
      },
    ],
  },
},

您正在为所有 Markdown 文件创建节点并在其中为图像创建相对路径 (gatsby-remark-relative-images),这样可以让您省去一些麻烦并从中解析图像。