gatsbyjs:多次使用 graphql,还是一次并通过上下文传递结果?

gatsbyjs: using graphql multiple times, or one time and pass the results through context?

使用 gatsby-node.js 并以编程方式创建页面,我有 2 个选项:

  1. 我可以对 gatsby-node.js 我需要的一切进行 graphql 查询,然后将具有 context 的(例如)边数组传递给我使用的不同模板。

这样,模板就不需要再次执行另一个graphql查询

  1. 我可以在 gatsby-node.js 上做同样的查询(因为无论如何我都需要这些信息),但是我可以用 context 将相关信息传递给模板,这样他们就可以做其他 graphql 查询以检索他们需要的数据。

这样,我不会通过上下文传递大量数据(事实并非如此,但最终可能会发生),而是重复数据库查询。

什么更有效率?我看到文档似乎建议重复 graphql 查询,但我不完全确定。

所以问题是,在 gatsby 中对 graphql 进行大量调用有什么缺点吗?或者最好只调用一次,其余的使用 javascript?

(示例)

export const createPages = ({ graphql, actions }) => {
...
  return graphql(`
    query {
...
  `).then(result => {
...
     result.data.allMarkdownRemark.edges.map(({ node }) => {
      createPage({
        component: path.resolve(`./src/templates/myTemplate.js`),
        context: {
          name: node.name,
          title: node.title,
          date: node.date,
          tags: node.tags,
          html: node.html,
        },
...

并且在模板中,不要进行任何查询,因为需要的内容在上下文中

或相反

      createPage({
        component: path.resolve(`./src/templates/myTemplate.js`),
        context: {
          name: node.name,
        },

并在模板中执行特定查询

  query($name: String) {
    allMarkdownRemark(filter: { name: {eq: $name }}) {
      edges {
        node {
          name
          title
          date
          tags
          html
        }
      }
    }

在我看来,做这两个查询似乎是多余的,但是,过度使用 context 可能是有害的?

最后,我决定在 gatsby-node.js 中保留尽可能少的查询,并且每个模板都会执行更适合他们需要的查询

FWIW,有这个 gatsby issue

But really full data shouldn't be passed by context to page - you should only pass minimal needed data ( like ids or slugs) to be used in page queries to get full data there.

我认为您的示例数据足够少,这无关紧要,但我确实想补充一点,为每个模板创建查询有一些好处:

  • 查询数据的方式放在其组件旁边 - 当需要调试时,无需在 gatsby-node.js 和模板之间来回切换。
  • 添加数据更容易,因为您只需要修改查询(相对于修改查询然后将数据添加到上下文)