Javascript 盖茨比:为什么我(甚至是我?)需要使用exports.onCreateNode来创建页面?
盖茨比文档中的所有示例似乎都假设您要定义一个Javascript 盖茨比:为什么我(甚至是我?)需要使用exports.onCreateNode来创建页面?,javascript,gatsby,Javascript,Gatsby,盖茨比文档中的所有示例似乎都假设您要定义一个exports.onCreateNode,首先解析数据,然后定义一个单独的exports.createPages来执行路由 然而,这似乎不必要地复杂。一个更简单的选项似乎是只使用createPages提供的graphql选项: exports.createPages = async ({ graphql, actions }) => { const { createPage } = actions; const { data } = aw
exports.onCreateNode
,首先解析数据,然后定义一个单独的exports.createPages
来执行路由
然而,这似乎不必要地复杂。一个更简单的选项似乎是只使用createPages
提供的graphql
选项:
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions;
const { data } = await graphql(query);
// use data to build page
data.someArray.forEach(datum =>
createPage({ path: `/some/path/${datum.foo}`, component: SomeComponent }));
但是,当我这样做时,我会得到一个错误:
TypeError:filepath.includes不是函数
我假设这是因为createPage
的path
prop是一个字符串,应该是“slug”。然而,所有生成slug的方法似乎都涉及到整个exports.onCreateNode
过程
我是否缺少从路径字符串生成有效段塞的简单解决方案?或者我误解了盖茨比,出于某种原因,每次我使用
createPage
,我都需要使用onCreateNode
?结果是我提到的错误:
TypeError:filepath.includes不是函数
根本不是来自路径
道具:它来自(非常有名的)组件
道具。。。它不接受组件函数/类!相反,它需要一个组件的路径(为什么他们不调用propcomponentPath
,我真不明白!)
但除此之外,一旦我将“组件”修复为(叹气)不再是组件,我就能够克服这个错误并创建页面。。。结果证明,整个onCreateNode
的事情是不必要的
为什么我需要使用exports.onCreateNode来创建页面
你没有
盖茨比在幕后大量使用GraphQL。盖茨比文档告诉用户,盖茨比中的许多特性通常只能通过GraphQL获得
您可以在不使用GraphQL的情况下创建页面,正如您在使用
data.someArray.forEach…
进行应答时所做的那样,但这不是预期的方式。通过跳过createNodeField
,您将无法在页面查询中查询这些字段。如果您不需要通过GraphQL使用这些字段,那么您的解决方案是完美的。您有任何您所指的盖茨比文档的示例吗?谢谢,但我仍然能够以这种方式使用GraphQL数据:我只是将数据作为上下文变量传递到页面。我仍然真的不明白onCreateNode的意义,它的额外复杂性(似乎)没有额外的好处。