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

Posted

技术标签:

【中文标题】gatsbyjs:多次使用graphql,还是一次使用并通过上下文传递结果?【英文标题】:gatsbyjs: using graphql multiple times, or one time and pass the results through context? 【发布时间】:2019-07-11 17:57:25 【问题描述】:

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

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

这样,模板就不需要再次查询graphql

    我可以在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 可能会在某种程度上有害吗?

【问题讨论】:

【参考方案1】:

FWIW,这是gatsby issue

但真正完整的数据不应该通过上下文传递到页面 - 您应该只传递在页面查询中使用的最少需要的数据(如 id 或 slug)以在那里获取完整数据。

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

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

【讨论】:

是的,这些都是很好的点,确实更模块化,谢谢:)【参考方案2】:

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

【讨论】:

以上是关于gatsbyjs:多次使用graphql,还是一次使用并通过上下文传递结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 GraphQL 查询以使用 GatsbyJS 从 mdx 文件中获取图像?

GatsbyJS :访问保存在降价文件(GraphQL)中的博客文章的不同部分

Gatsbyjs 中的 GraphQL - 仅返回包含特定字段的数据

已解决 - GatsbyJS - GraphQL ACF 查询问题

并非所有 graphql 查询数据都在 GatsbyJS 页面上呈现

使用 GatsbyJS 的 GraphQL 查询中的范围文件夹结构