我需要提取程序源文件的内容,以显示在Gatsby生成的页面中。我已经把所有东西都整理好了,应该可以打电话给我
// my-fancy-template.tsx
import { readFileSync } from "fs";
// ...
const fileContents = readFileSync("./my/relative/file/path.cs");
但是,在运行gatsby develop
或gatsby build
时,出现以下错误
未找到此依赖项: ⠀ * ./src/templates/my-fancy-template.tsx中的fs ⠀ 要安装它,您可以运行:npm install --save fs
但是,all the documentation建议该模块是Node 的本机,除非它正在浏览器中运行。我还不太熟悉Node,但是考虑到gatsby build
也失败了(该命令甚至没有启动本地服务器),如果这是问题,我会有些惊讶。
我什至从新的测试站点(gatsby new test
)尝试了同样的效果。
答案 0 :(得分:2)
我在侧边栏中找到了this并给了它一个镜头,但似乎宣称 fs
可用;它实际上没有提供fs
。
然后让我吃惊的是,尽管盖茨比在构建时创建了页面,但可能直到需要它们时才渲染。这可能是一个错误的评估,但最终导致了我需要的解决方案:
您需要在File
的{{1}}期间将文件内容添加到gatsby-source-filesystem
上的字段中(假设您正在使用exports.onCreateNode
)。您可以通过通常的方式做到这一点:
gatsby-node.js
然后您可以在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
查询方法。)
自然,如果有人有一个更优雅的解决方案,我会欣喜若狂:-)