与创建节点和创建页面有关的Gatsby Lifecycle API问题

时间:2019-03-22 22:25:46

标签: gatsby

我正在尝试通过使用生命周期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;

我不理解以下内容:

  1. 为什么有两个针对404的创建页面调用,一个针对/404/,另一个针对/404.html
  2. 它出现在创建节点之前调用创建页面的调试语句中(请参见上文creating pagecreating node之前的位置)。这是为什么?不应该这样吗? (也许回调是以不同的顺序完成的?)
  3. 最终,我不完全了解节点和页面之间的关系。有关系吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

1。为什么有两个针对404的创建页面调用,一个针对/ 404 /,另一个针对/404.html?

默认情况下,所有由gatsby生成的页面(除index都放在一个包含index.html文件的文件夹中,即my-domain.com/page1将具有一个page1文件夹index.html。为什么?我猜想,如果有人关闭javascript,他们仍然会获得漂亮的url(my-domain.com/page1/而不是my-domain.com/page1.html

404404/复制到404.html的原因是

  

许多静态站点主机希望将站点404页面命名为此页面。 — source

2。它出现在创建节点之前调用的创建页面的调试语句中。为什么会这样?

这也使我绊了几次,但我仍然不太确定为什么。 createPages api肯定在sourceNodes之后被调用,所以我的猜测是:onCreateNodeonCreatePage是异步触发的;但是,gatsby将依次调用每个插件的这些挂钩。也许轮到您了(您的gatsby-node.js钩子将被最后调用)时,盖茨比已经进入了下一步(同样,只是猜测)。

此外,请记住,运行createPage时,gatsby并不会实际写出带有数据的页面,而只是写出keeps track of the page's metadata stuff

以下是一些有用的资源:

3。 (在节点和页面之间)有关系吗?

不是。用户是通过编写请求页面数据的graphql查询在节点和页面之间建立关系的人。

默认情况下,gatsby包含此plugin for all site,它将src/pages/中的文件转换为页面。用户仍然需要自己查询那些页面的数据。

因此,除了内部插件data bridge为每个页面创建的节点之外,节点和页面之间没有任何关系。