Gatsby 什么';使用盖茨比将图像附加到节点的标准方法是什么?
我目前正在Gatsby 什么';使用盖茨比将图像附加到节点的标准方法是什么?,gatsby,Gatsby,我目前正在gatsby node.js中onCreateNode修改一些创建后的节点。我想做的一件事是将图像(或者其他类型的文件)附加到节点。假设映像存在于文件系统的其他位置,我可以通过调用名为getImageForNode(node)的(异步)函数来获取其绝对路径,然后如何将其附加到我的节点,以便: 在构建过程中,它被移动到/static/,这样网站就可以为它提供服务 它被认为是一个图像,所以我可以访问它的宽度/高度/url以及我可能需要的任何其他元数据(我不需要调整它的大小,但我不介意这是否
gatsby node.js
中onCreateNode
修改一些创建后的节点。我想做的一件事是将图像(或者其他类型的文件)附加到节点。假设映像存在于文件系统的其他位置,我可以通过调用名为getImageForNode(node)
的(异步)函数来获取其绝对路径,然后如何将其附加到我的节点,以便:
/static/
,这样网站就可以为它提供服务gatsby源文件系统
有一个createRemoteFileNode
功能,但它只适用于通过internet提供的图像(我真的不想为此设置本地http服务器,而且它似乎不支持文件://
)。gatsby源文件系统
将文件数据拉入您的gatsby应用程序,
gatsby transformer sharp
将要求gatsby plugin sharp
处理您的图像并将其复制到公用文件夹
您可以要求盖茨比将文件链接到另一个节点,方法是在该节点中添加一个相对路径作为字段。您也可以手动链接它
设置
您需要让盖茨比知道您的文件的位置:
{
resolve: `gatsby-source-filesystem`,
options: {
path: absolute/path/to/a/directory,
name: `anything`,
},
},
它还可以找到根目录之外的目录
path: path.resolve(__dirname, '../../images')
向现有节点添加相对路径
假设您有一个Json
节点,由gatsby transformer remark
或其他gatsby的官方插件创建,您可以向其添加一个新字段:
const fileAbsolutePath = /* find this node's absolute path */
const imageAboslutePath = /* do your get absolute path thing */
const imageRelativePath = path.relative(fileAbsolutePath, imageAboslutePath)
createNodeField({
node,
name: `image`,
value: imageRelativePath,
})
这将把新字段image
链接到一个文件节点,您可以在其中找到一个带有图像信息的imageSharp
节点
然后你可以像这样查询它
query {
markdownRemark {
fields { <-- fields created by `createNodeField` will live here
image { <-- point to a file node
childImageSharp { <-- point to imageSharp node of this file
fixed {
width <-- see more info in gatsby-plugin-sharp documentation
height
srcSet
src
}
}
}
}
}
}
您可以在此找到更详细的代码示例。谢谢Derek。虽然不是我想要的,但这对于处于类似情况的人来说是非常彻底的。在我的例子中,在调用
getImageForNode
之前,这些文件实际上并不存在,因此有关配置gatsby源文件系统的常规建议不起作用。我现在可以用了,所以我会写下我所做的并更新这个。哦,我错过了!我认为处理这个问题的标准方法是调用getImageForNode
,在预引导步骤中将文件拉入文件夹。期待着看到你如何处理它@AndrewIngram看起来您可以获取图像并将其添加到setFieldsOnGraphQLNodeType
hook中的节点。我发现了一个复杂的例子。不知道你是否也做过类似的事情,因为这可能是最经典的!最后我这样做了:虽然感觉有点黑客,但我认为使用setFieldsOnGraphQLNodeType
更优雅,因为这意味着如果不查询字段,我可以避免生成图像的开销。@AndrewIngram干得好,我认为这是一个很棒的插件。美丽的博客顺便说一句!编辑:哦,已经有了。但是有一个可以接受设计模板的东西会很酷。
createNodeField({
node,
name: 'target___NODE', <--- `___NODE` will resolve to another node
value: targetNode.id,
})