Как загрузить изображения из поля URL на другом узле в Gatsbyjs, чтобы я мог использовать gatsby-image?

#gatsby #kentico-kontent

#gatsby #kentico-kontent

Вопрос:

Я работаю над оптимизацией изображений для сайта с использованием Gatsby и Kentico Cloud. Я хочу использовать gatsby-image плагин, но gatsby-image не могу запрашивать поля URL. Итак, мне нужно загрузить эти изображения из CMS на другом узле, чтобы их можно было запросить gatsby-image .

Я пытался реализовать это с помощью другого плагина, gatsby-plugin-remote-images но пока это не сработало. Я не уверен, что неправильно понимаю документацию.

Вот мой последний код из gatsby-config

 {
  resolve: `gatsby-plugin-remote-images`,
  options: {
    nodeType: 'kenticoCloudItemAbout',
    imagePath: 'data.kenticoCloudItemAbout.elements.main_image.value[0].url'
  }
}

  

Я понимаю, что теперь я должен иметь возможность запрашивать localImage (после перезапуска сервера) из GraphiQL и видеть путь к загруженному файлу, но, похоже, это не работает.

Спасибо!

Ответ №1:

Будучи новичком в GatsbyJS, я тоже боролся с этим, прежде чем заставить его работать. Во-первых, я не думаю, что ваша конфигурация ImagePath должна включать data. переменную, используемую в компонентах для возврата результатов GraphQL. Начните с kenticoCloudItemAbout . Если это не сработает, я обнаружил, что вложенный путь к изображению был проблематичным. (Либо я еще не понимаю, как правильно использовать ImagePath, либо подключаемому модулю не нравится вложенная структура.) Например, мой запрос GraphQL / структура данных выглядит следующим образом:

   {
  allMyNodes{
    edges {
      node {
            levelOneField
            subItem {
              levelTwoField
              subSubItem {
                imageURL
              }
            }
          }
        }
      }
    }
  

Когда я использовал { nodeType="myNodes", imagePath="myNodes.edges.node.subitem.subsubitem.imageURL"} , мне не повезло заставить плагин работать. Однако, когда я указал непосредственно на узел с моим ImageUrl, как { nodeType="subSubItem", imagePath="imageURL"} , это сработало. Кроме того, следите за ошибками в терминале при сборке gatsby develop . Ошибки, такие как ImageUrl, не указывающие на файл (неработающая ссылка), вызвали проблемы. Наконец, убедитесь, что вы не включаете фрагменты GraphQL (например, ...GatsbyImageSharpFluid ) в свое окно GraphiQL. В GraphiQL попробуйте ссылаться только на localImage свойства объекта, чтобы проверить, работает ли плагин для вас. Например:

 {
    allSubSubItem {
      imageURL
      localImage {
         id
      }
    }
 }
  

Ответ №2:

Вероятно, вы уже нашли решение.

Если нет, я смог заставить удаленные изображения работать с gatsby-image. Я тоже пытался gatsby-plugin-remote-images , но не смог заставить его работать. Что для меня помогло, так это создать распознаватель для моего удаленного API (мой удаленный источник cms в gatsby-source-graphql , я использую Webiny CMS) вот так:

В gatsby-config.js :

 plugins: [
       {
        resolve: 'gatsby-source-filesystem',
        options: {
            name: 'images',
            path: '${__dirname}/src/images',
        },
         },
    {
        resolve: 'gatsby-source-graphql',
        options: {
          typeName: "Webiny",
          fieldName: "webinyHeadlessCms",
          url: "https://XXXXXXXXXXX.cloudfront.net/cms/read/production",
          headers: {
            authorization: "XXXXXXXXXXXXXXXXXXXX"
          },
          refetchInterval: 60,
        },
    },
  ],
  

И мой gatsby-node.js :

 const { createRemoteFileNode } = require(`gatsby-source-filesystem`)

exports.createResolvers = ({actions,cache,createNodeId,createResolvers,store,reporter,}) => {
    const { createNode } = actions
    createResolvers({
        Webiny_BlogPost: {
            imageFile: {
                type: `File`,
                resolve(source, args, context, info) {
                    return createRemoteFileNode({
                        url: source.headerImage,
                        store,
                        cache,
                        createNode,
                        createNodeId,
                        reporter,
                    })
                },
            },
        },
    })
}
  

Теперь я могу запрашивать изображения для использования с gatsby-image вот так:

 export const query = graphql`{
    webinyHeadlessCms {
        listBlogPosts {
            data {
                headerImage
                imageFile {
                    childImageSharp {
                        fluid (quality: 100, maxWidth: 1920) {
                            ...GatsbyImageSharpFluid_withWebp
                        }
                    }
                }
            }
        }
    }
}`
  

Важно действительно понимать схему GraphQL вашего удаленного API. Посмотрите на это в GraphiQL. В моем случае распознаватель создает новый узел с именем imageFile at Webiny_BlogPost . В общем, это должно быть сделано в typeName_SchemaSubType , где часть перед подчеркиванием является вашей, typeName определенной в gatsby-source-graphql , а часть после подчеркивания — это подтип схемы в этом источнике, в котором вы хотите создать свой узел изображения (файла).
Когда вы запрашиваете его, имейте в виду, что вам также нужно запросить узел с URL удаленного изображения (в моем случае headerImage ), чтобы заставить его работать.