Gatsby gatsby-remark-relative-images不会将yaml绝对图像路径转换为相对

时间:2019-10-08 05:48:39

标签: javascript reactjs gatsby netlify-cms

我目前正在尝试将yaml文件中的绝对路径解析为相对路径,以便可以在gatsby中使用graphql进行查询。绝对路径是从netlify-cms提供的。

当将相同的路径放置在md文件中并使用gatsby-remark-relative-images将其转换为相对路径时,它完全没有问题,但对yaml而言却没有相同。

图像文件放置在static/img/中,cms提供的路径为/img/xxx.jpg

src / data / pages / index.yaml

page: index
slider:
  - image: /img/1_new.jpg
    url: ""
  - image: /img/2_new.jpg
    url: ""
  - image: /img/3_new.jpg
    url: ""

gatsby-config.js

module.exports = {
  // ...
  plugins: [
    // ...
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        path: `${__dirname}/src/data`,
        name: 'data',
      },
    },
    {
      resolve: 'gatsby-source-filesystem',
      options: {
        path: `${__dirname}/static/img`,
        name: 'uploads',
      },
    },
    {
      resolve: 'gatsby-source-filesystem',
      options: {
        path: `${__dirname}/src/pages`,
        name: 'pages',
      },
    },
    {
      resolve: 'gatsby-source-filesystem',
      options: {
        path: `${__dirname}/src/assets/images`,
        name: 'images',
      },
    },
    {
      resolve: 'gatsby-plugin-react-svg',
      options: {
        rule: {
          include: /\.inline\.svg$/,
        },
      },
    },
    `gatsby-plugin-sharp`,
    `gatsby-transformer-sharp`,
    `gatsby-transformer-yaml-plus`,
    {
      resolve: 'gatsby-transformer-remark',
      options: {
        plugins: [
          {
            resolve: 'gatsby-remark-relative-images',
            options: {
              name: 'uploads',
            },
          },
          {
            resolve: 'gatsby-remark-images',
            options: {
              maxWidth: 2048, // must specify max width container
            },
          },
          {
            resolve: `gatsby-remark-responsive-iframe`,
            options: {
              wrapperStyle: `margin-bottom: 1.0725rem`,
            },
          },
          {
            resolve: 'gatsby-remark-copy-linked-files',
            options: {
              destinationDir: 'static',
            },
          },
          `gatsby-remark-smartypants`,
          `gatsby-remark-widows`,
        ],
      },
    },
    {
      resolve: 'gatsby-plugin-netlify-cms',
      options: {
        modulePath: `${__dirname}/src/cms/cms.js`,
      },
    },
    'gatsby-plugin-netlify', // make sure to keep it last in the array
  ],
  // for avoiding CORS while developing Netlify Functions locally
  // read more: https://www.gatsbyjs.org/docs/api-proxy/#advanced-proxying
  developMiddleware: app => {
    app.use(
      '/.netlify/functions/',
      proxy({
        target: 'http://localhost:9000',
        pathRewrite: {
          '/.netlify/functions/': ``,
        },
      })
    )
  },
}

此外,这是将节点中的绝对路径转换为相对路径的地方

gatsby-node.js

exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions
  fmImagesToRelative(node) // convert image paths for gatsby images

  if (node.internal.type === `MarkdownRemark`) {
    const value = createFilePath({ node, getNode })
    createNodeField({
      name: `slug`,
      node,
      value,
    })
  }
}

最后,在这里定义netlify-cms配置

static / admin / config.yml

backend:
  name: git-gateway
  branch: master

media_folder: static/img
public_folder: /img

collections:
  - label: "Data"
    name: "data"
    files:
    - name: "index"
      label: "Index"
      file: "src/data/pages/index.yml"
      fields:
        - {label: "Page", name: "page", widget: hidden, default: "index"}
        - label: "Slider"
          name: "slider"
          widget: list
          fields:
            - {label: "Image", name: "image", widget: image}
            - {label: "Url", name: "url", widget: string, required: false}

错误消息

 ERROR 

GraphQL Error Field "image" must not have a selection since type "String" has no subfields.

  file: /home/gaara/JS/iconic-starter-netlify-cms/src/pages/index.js

   1 |
   2 |   query IndexPage {
   3 |     pagesYaml(page: { eq: "index" }) {
   4 |       id
   5 |       slider {
   6 |         desktop {
>  7 |           image {
     |                 ^
   8 |             childImageSharp {
   9 |               fluid(maxWidth: 2000, quality: 90) {
  10 |                 aspectRatio
  11 |                 presentationWidth
  12 |                 src
  13 |                 srcSet
  14 |                 sizes
  15 |               }
  16 |             }
  17 |           }


⠙ extract queries from components
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

我已经确保所有图像都位于static/img/文件夹内。我也做了几次尝试重新启动服务器,以避免图像无法加载的问题。 netlify-cms提供的图像路径应保持为/img/xxx.jpg,因为还有许多其他降价文件都在使用它,并且解析路径没有问题。

我是否可以知道我做错了什么或者错过了导致gatsby-remark-relative-images无法解析文件路径的配置问题?

1 个答案:

答案 0 :(得分:0)

gatsby-remark-relative-images是仅适用于gatsby-transformer-remark处理的markdown文件的插件。

最新的graphql模式自定义更新允许独立于文件类型的新解决方案。您可以在此处浏览有关该主题的官方文档:Customize the Graphql Schema (gatsby docs)

而不是在gatsby到达之前修改图像路径(例如与gatsby-remark-relative-images一样),我们将自定义graphql模式,以便图像字段(在您的情况下为slider.desktop.image)解析为图像文件节点。

请注意,下面的节点类型只是一些松散的示例,您应该转到graphiql端点(即localhost:8000/graphiql)以找到正确的类型名称。

exports.createSchemaCustomization = ({ actions }) => {
  const { createTypes, createFieldExtension } = actions

  createFieldExtension({
    name: 'fileByStaticPath',
    extend: () => ({
      resolve: (src, args, ctx, info) => {
        // look up original string value
        const { fieldName } = info
        const partialPath = src[fieldName]

        // TODOS
        // - join path to create the correct image file path
        // - query the file node with `context.nodeModel.runQuery`
        // - return the file node if exists
      }
    })
  })


  const typeDefs = `
    type YamlSliderDesktop @infer {
      image: File @fileByStaticPath
    }

    type YamlSlider @infer {
      desktop: YamlSliderDesktop
    }

    type PagesYaml implements Node @infer {
      slider: YamlSlider
    }
  `
  createTypes(typeDefs)
}


我发现自己经常这样做,所以我为此写了一个插件:gatsby-schema-field-absolute-path (github)

我还在我的博客(byderek.com)上对此进行了更深入的介绍,但实际上,在盖茨比官方文档中找不到任何内容,只是用另一种语言进行了解释。 / p>

希望有帮助!