代码之家  ›  专栏  ›  技术社区  ›  Rico Kahler

在Gatsby中以编程方式创建页面的最佳实践是什么?

  •  0
  • Rico Kahler  · 技术社区  · 5 年前

    我正在启动一个绿地Gatsby项目,我的问题是关于以编程方式创建页面。

    一般来说,最好是:

    1. 仅查询ID(通过 graphql(/* ... */) createPages API),然后使用ID重新查询每个页面的相关数据
    2. 查询整个对象并通过以下方式将其发送到页面 pageContext ?

    这是一个电子商务+博客网站,有500多篇帖子和产品需要以编程方式创建。

    考虑到DX(例如启动时间、重新加载时间)、可维护性和构建时间,哪种方法更好?为什么?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Rico Kahler    5 年前

    我把这个问题发布在 Gatsby Discord LekoArts 选择了方法1,这显然是正确的选择。

    这是他们对Discord的回应:

    因为其他情况下,您会将每个页面加载的数据膨胀,因为每个页面都会加载您在gatsby节点中查询的所有内容。Gatsby还必须查询每个节点,这些节点可以达到数百万个,就像在本期中一样 https://github.com/gatsbyjs/gatsby/issues/20671

    另一方面,如果你通过id,你可以获得很大的速度提升 https://github.com/gatsbyjs/gatsby/pull/20609


    这是第一期GitHub的另一个粘贴 LekoArts 由Gatsby贡献者链接, vladar :

    @MartinMikusat感谢您提出这个问题!

    看起来你在页面上下文中输入了太多的数据。您将整个数据集放入其中: https://github.com/MartinMikusat/gatsby-reproduce/blob/master/gatsby-node.esm.js#L83

    页面上下文不用于向页面传递数据。它旨在传递简单的参数,这些参数稍后可以作为变量传递给页面的GraphQL查询。

    有一个与上下文相关的开销——Gatsby必须访问上下文中每个对象的每个字段来推断SitePageContext类型。

    您有850个节点的页面(在您的示例中为SanityLens),每个页面上下文都有其中的所有节点。此外,每个节点大约有30个字段。这意味着盖茨比必须参观850*850*30个田地(约2170万块)。

    在这样的情况下(当上下文使用不当时),我们可以通过显示警告来做得更好,我们正好遇到了这个问题:#14213

    如果有点令人困惑,很抱歉,感谢您使用Gatsby