所以我在 Gatsby and Remark 中写了一个博客站点。我的帖子结构是这样的:
Library/
-- category-name/
---- article-name/
------ index.md
这非常有效,并导致我能够制作类似/category-name/article-name
.
我还想做的是能够在其中放置一个名为“hero.jpg”的图像,并让 Gatsby 自动拾取它,而无需添加对它的 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
但我不知道如何计算出它正在被转换成什么。
我相信我需要做一些类似于这个 SO question的答案的事情,但这似乎希望您知道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,
})
}
}