Как вызывать и использовать встроенные ресурсы из полноценных полей форматированного текста с помощью Gatsby?

#reactjs #gatsby #contentful

#reactjs #gatsby #удовлетворительный

Вопрос:

Я использую Gatsby в качестве стартера для моего приложения React. Для обработки содержимого я использую Contentful.

В моей модели контента с содержанием я создал следующие типы контента:

  • Короткий текст
  • Короткий текст
  • Медиафайлы
  • Форматированный текст
  • Форматированный текст

Используя плагины Gatsby’s gatsby-source-contenful и @contentful / gatsby-transformer-contentful-richtext, я успешно отрисовал все эти типы контента, за исключением того, что в моих типах форматированного текста я не могу отобразить встроенные ресурсы внутри него.

Я попытался установить @contentful / rich-text-types через npm и использовать константы MARK и INLINES на основе примера из документации Gatsby, найденной здесь

 const { MARKS, INLINES } = require('@contentful/rich-text-types')
  
 {
      resolve: `@contentful/gatsby-transformer-contentful-richtext`,
      options: {
        renderOptions: {
          /*
           * Defines custom html string for each node type like heading, embedded entries etc..
           */
          renderNode: {
            // Example
            [INLINES.ASSET_HYPERLINK]: node => {
              return `<img class='custom-asset' src="${
                node.data.target.fields.file['en-US'].url
              }"/>`
            },
            [INLINES.EMBEDDED_ENTRY]: node => {
              return `<div class='custom-entry' />${
                node.data.target.fields.name['en-US']
              }</div>`
            },
          },
          /*
           * Defines custom html string for each mark type like bold, italic etc..
           */
          renderMark: {
            // Example
            [MARKS.BOLD]: text => `<strong>${text}<strong>`,
          },
        },
      },
    },
  

В идеале я хотел бы, чтобы Gatbsy автоматически отображал ресурсы изображения в типах форматированного текста как <img src="[ASSET URL]" alt="[ASSET DESCRIPTION]">

Комментарии:

1. Эй, Райан, в настоящее время я пытаюсь сделать именно это. Вместо МЕТОК или ВСТРОЕННЫХ СТРОК попробуйте БЛОКИ. EMBEDDED_ASSET

Ответ №1:

Попробуйте это:

 const { BLOCKS } = require('@contentful/rich-text-types')
...
renderNode: {
  [BLOCKS.EMBEDDED_ASSET]: node => {
    // console.log(node)
    let { description, title, file } = node.data.target.fields
    // console.log(file["en-US"].url)
    return <img src={file["en-US"].url} />
  },
},
  

Кажется, у меня это работает, хотя изображение кажется полноразмерным и загружается довольно медленно. Требуется дополнительная работа, но это, похоже, работает (по крайней мере, в разработке)

РЕДАКТИРОВАТЬ:
Похоже, что fields свойство my node.data.target перестало отображаться при отправке моего запроса graphql… и это перестало работать… супер странно

РЕДАКТИРОВАТЬ 2: если вы удалите .cache папку ( project-root/.cache ), вышеупомянутая проблема будет исправлена. https://github.com/gatsbyjs/gatsby/issues/10592

Комментарии:

1. Добавление forceFullSync: true к gatsby-source-contentful параметрам в gatsby-config.js решает проблему с .cache