#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