我正在尝试通过使用生命周期API编写插件来学习Gatsby。我正在使用Gatsby默认启动程序,并在本地插件的gatsby-node.js
中放入了一些调试语句。这是gatsby build
的输出:
- creating node: [Site] children: []
- creating node: [Directory] children: []
- creating page: [/404/] json name [404-22d]
- creating page: [/] json name [index]
- creating page: [/page-2/] json name [page-2-fbc]
- creating node: [SitePage] path: [/404/] children: []
- creating node: [SitePage] path: [/] children: []
- creating node: [SitePage] path: [/page-2/] children: []
- creating page: [/404.html] json name [404-html-516]
- creating node: [SitePage] path: [/404.html] children: []
这是我的本地插件中的gatsby-node.js
:
function onCreateNode({node, loadNodeContent}) {
let message = `- creating node: [${node.internal.type}]`;
if (node.path) {
message += ` path: [${node.path}]`;
}
if (node.children) {
message += " children: " + JSON.stringify(node.children);
}
if (node.owner) {
message += ` owner: [${node.internal.owner}]`;
}
console.log(message);
}
function onCreatePage({page, actions}) {
let message = `- creating page: [${page.path}] json name [${page.jsonName}]`;
console.log(message);
}
exports.onCreateNode = onCreateNode;
exports.onCreatePage = onCreatePage;
我不理解以下内容:
/404/
,另一个针对/404.html
?creating page
在creating node
之前的位置)。这是为什么?不应该这样吗? (也许回调是以不同的顺序完成的?)谢谢。
答案 0 :(得分:1)
默认情况下,所有由gatsby生成的页面(除index
都放在一个包含index.html
文件的文件夹中,即my-domain.com/page1
将具有一个page1
文件夹index.html
。为什么?我猜想,如果有人关闭javascript,他们仍然会获得漂亮的url(my-domain.com/page1/
而不是my-domain.com/page1.html
。
将404
从404/
复制到404.html
的原因是
许多静态站点主机希望将站点404页面命名为此页面。 — source
这也使我绊了几次,但我仍然不太确定为什么。 createPages
api肯定在sourceNodes
之后被调用,所以我的猜测是:onCreateNode
和onCreatePage
是异步触发的;但是,gatsby将依次调用每个插件的这些挂钩。也许轮到您了(您的gatsby-node.js
钩子将被最后调用)时,盖茨比已经进入了下一步(同样,只是猜测)。
此外,请记住,运行createPage
时,gatsby并不会实际写出带有数据的页面,而只是写出keeps track of the page's metadata stuff。
以下是一些有用的资源:
不是。用户是通过编写请求页面数据的graphql查询在节点和页面之间建立关系的人。
默认情况下,gatsby包含此plugin for all site,它将src/pages/
中的文件转换为页面。用户仍然需要自己查询那些页面的数据。
因此,除了内部插件data bridge为每个页面创建的节点之外,节点和页面之间没有任何关系。