gatsbyjs:多次使用 graphql,还是一次并通过上下文传递结果?
gatsbyjs: using graphql multiple times, or one time and pass the results through context?
使用 gatsby-node.js
并以编程方式创建页面,我有 2 个选项:
- 我可以对
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
可能是有害的?
最后,我决定在 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
和模板之间来回切换。
- 添加数据更容易,因为您只需要修改查询(相对于修改查询然后将数据添加到上下文)
使用 gatsby-node.js
并以编程方式创建页面,我有 2 个选项:
- 我可以对
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
可能是有害的?
最后,我决定在 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
和模板之间来回切换。 - 添加数据更容易,因为您只需要修改查询(相对于修改查询然后将数据添加到上下文)