所以我用 Gatsby 和 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
但我不知道如何计算出它正在转变为什么。
我相信我需要做一些类似于答案的事情这个问题 https://stackoverflow.com/questions/50141031/gatsby-image-difference-between-childimagesharp-vs-imagesharp但这似乎期望你知道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,
})
}
}