在Gatsby构建过程中检索文件内容

时间:2019-09-29 02:45:50

标签: node.js gatsby

我需要提取程序源文件的内容,以显示在Gatsby生成的页面中。我已经把所有东西都整理好了,应该可以打电话给我

// my-fancy-template.tsx
import { readFileSync } from "fs";
// ...
const fileContents = readFileSync("./my/relative/file/path.cs");

但是,在运行gatsby developgatsby build时,出现以下错误

未找到此依赖项: ⠀ * ./src/templates/my-fancy-template.tsx中的fs ⠀ 要安装它,您可以运行:npm install --save fs

但是,all the documentation建议该模块是Node 的本机,除非它正在浏览器中运行。我还不太熟悉Node,但是考虑到gatsby build也失败了(该命令甚至没有启动本地服务器),如果这是问题,我会有些惊讶。

我什至从新的测试站点(gatsby new test)尝试了同样的效果。

1 个答案:

答案 0 :(得分:2)

我在侧边栏中找到了this并给了它一个镜头,但似乎宣称 fs可用;它实际上没有提供fs

然后让我吃惊的是,尽管盖茨比在构建时创建了页面,但可能直到需要它们时才渲染。这可能是一个错误的评估,但最终导致了我需要的解决方案:

  1. 您需要在File的{​​{1}}期间将文件内容添加到gatsby-source-filesystem上的字段中(假设您正在使用exports.onCreateNode)。您可以通过通常的方式做到这一点:

    gatsby-node.js
  2. 然后您可以在if (node.internal.type === `File`) { fs.readFile(node.absolutePath, undefined, (_err, buf) => { createNodeField({ node, name: `contents`, value: buf.toString()}); }); } 内的查询中访问此字段:

    my-fancy-template.tsx

从那里,您可以在{ allFile { nodes { fields { content } } } } 的每个元素中自由使用fields.content。 (这当然也适用于allFile.nodes查询方法。)

自然,如果有人有一个更优雅的解决方案,我会欣喜若狂:-)