增量构建时Gatsby plugin image节点匹配错误如何修复?
问题根因
该错误核心是增量/二次构建时,你之前通过createRemoteFileNode创建的自定义ID的File节点被Gatsby缓存清理机制回收,或是二次构建时createRemoteFileNode没有重新生成对应ID的节点,导致父节点挂载的image___NODE引用的ID找不到对应节点,Gatsby构建Schema时无法自动推断类型就抛出异常。
修复方案
方案1:补全缓存节点判断+保留节点生命周期(优先选用)
修改gatsby-node.js中的onCreateNode逻辑,增加现有节点检查、节点触活逻辑,避免重复创建和节点被误清理:
exports.onCreateNode = async ({ node, actions: { createNode, touchNode }, store, cache, createNodeId, }) => { if (node.internal.type === `API__Image` && node.pk && node.url) { // 生成全局唯一的固定文件节点ID const fileNodeId = createNodeId(`remote-image-${node.pk}`) // 检查现有节点中是否已经存在该文件节点 const existingFileNode = store.getState().nodes[fileNodeId] if (existingFileNode) { // 触活节点,防止被Gatsby垃圾回收机制清理 touchNode({ nodeId: fileNodeId }) node.image___NODE = fileNodeId return } // 不存在对应节点时再走创建逻辑 const fileNode = await createRemoteFileNode({ url: node.url, parentNodeId: node.id, createNode, createNodeId: () => fileNodeId, cache, store, }) if (fileNode) { node.image___NODE = fileNode.id } } }
方案2:显式声明GraphQL类型(双重保险)
新增Schema自定义逻辑,手动声明字段类型,跳过自动推断环节,避免极端场景下的推断错误:
exports.createSchemaCustomization = ({ actions }) => { const { createTypes } = actions const typeDefs = ` type API__Image implements Node { image: File @link(from: "image___NODE") } ` createTypes(typeDefs) }
方案3:临时本地调试方案
如果只是本地开发临时绕过问题,可以执行gatsby clean命令清理本地缓存后再执行构建,该方法仅适合本地调试,无法解决线上增量构建的问题。
内容的提问来源于stack exchange,提问作者Ander
相关产品推荐
相关产品推荐

