Итак, я написал блог-сайт в Гэтсби и Ремарк. Я структурировал свои посты так:
Library/
-- category-name/
---- article-name/
------ index.md
Это сработало очень хорошо, и я смог создать такие пути, как /category-name/article-name
.
То, что я также хотел бы сделать, это иметь возможность помещать туда изображение с именем hero.jpg и автоматически выбирать его для Гэтсби, не добавляя в него ссылку на frontmatter.
Мне удалось сделать это, добавив в gatsby-node.js следующее:
const hero = (fs.existsSync(path.resolve(__dirname, `src/library/pages/${slug}hero.jpg`))) ? `${slug}hero.jpg` : ''
createNodeField({
node,
name: 'hero',
value: hero,
})
Это работает с данными graphql, и теперь я вижу следующее:
{
"node": {
"id": "3190922a-2207-5621-a7be-e02be9e8da24",
"fields": {
"hero": "/category-name/article-name/hero.jpg"
},
},
Однако на реальной странице ссылка на изображение /category-name/article-name/hero.jpg
не существует, поэтому я получаю мертвое изображение. Я знаю, что это потому, что мой путь к изображению преобразуется gatsby-transformer-sharp
, но я не знаю, как определить, во что он преобразуется.
Я считаю, что мне нужно сделать что-то похожее на ответы на на этот ТАК вопрос , но, похоже, вы ожидаете, что вы знаете, что relativePath
- это время, когда вы пишете свой запрос, но я выиграл ' не будет этой информации до тех пор, пока запрос не будет возвращен в первый раз.
Добавлен крючок OnCreateNode для ясности
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
// Add slug to MarkdownRemark node
if (node.internal.type === 'MarkdownRemark') {
const slug = createFilePath({ node, getNode, basePath: 'library' })
const hero = (fs.existsSync(path.resolve(__dirname, `src/library/pages/${slug}hero.jpg`))) ? './hero.jpg' : ''
createNodeField({
node,
name: 'slug',
value: slug,
})
createNodeField({
node,
name: 'hero',
value: hero,
})
}
}