盖茨比开发作品但不是建立在同一个项目上
gatsby develop works but not build on same project
我有一个非常简单的 Gatsby 应用程序。我正在运行ning gatsby develop on that并且它工作正常但是当我运行 gatsby build时我收到一个错误。我不确定为什么开发会工作而构建不会。不确定我错过了什么!
import React from "react"
import Layout from "./layout"
const ProductTemplate = ({ pageContext }) => {
const { product } = pageContext
return (
<Layout>
<h1>{product.title}</h1>
<div>{product.description}</div>
</Layout>
)
}
export default ProductTemplate
这是准确的错误
8 | return (
9 | <Layout>
> 10 | <h1>{product.title}</h1>
| ^
11 | <div>{product.description}</div>
12 |
WebpackError: TypeError: Cannot read property 'title' of undefined
- product.js:10
src/pages/product.js:10:20
盖茨比-node.js
const path = require(`path`)
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
// Query for all products in Shopify
const result = await graphql(`
query {
allShopifyProduct(sort: { fields: [title] }) {
edges {
node {
title
shopifyId
handle
description
availableForSale
priceRange {
maxVariantPrice {
amount
}
minVariantPrice {
amount
}
}
}
}
}
}
`)
// Iterate over all products and create a new page using a template
// The product "handle" is generated automatically by Shopify
result.data.allShopifyProduct.edges.forEach(({ node }) => {
createPage({
path: `/product/${node.handle}`,
component: path.resolve(`./src/pages/product.js`),
context: {
product: node,
},
})
})
}
您的 ProductTemplate
是 inside /pages
文件夹(它应该在 /templates
中)。这导致 Gatsby 尝试自动为该目录中的每个文件创建页面。在它自动执行的情况下,它不会获得任何上下文,因此构建失败。这只会在你 运行 gatsby build
时发生,因为在 gatsby develop
期间没有 SSR (Server-Side R渲染).
createPage
API 旨在基于 slug、路径或另一个独特的 identifier 字段创建动态页面,而不是针对已知页面,例如 inside /pages
文件夹。
要修复它,只需将您的 product.js
移动到 /templates
并更改为:
component: path.resolve(`./src/pages/product.js`),
为此:
component: path.resolve(`./src/templates/product.js`),
这是因为您要为每个产品创建模板,而不是页面(就像 Gatsby 理解页面一样)。
Here's a GitHub thread 如果您想遵循完整的解释,则正是您的问题。
我有一个非常简单的 Gatsby 应用程序。我正在运行ning gatsby develop on that并且它工作正常但是当我运行 gatsby build时我收到一个错误。我不确定为什么开发会工作而构建不会。不确定我错过了什么!
import React from "react"
import Layout from "./layout"
const ProductTemplate = ({ pageContext }) => {
const { product } = pageContext
return (
<Layout>
<h1>{product.title}</h1>
<div>{product.description}</div>
</Layout>
)
}
export default ProductTemplate
这是准确的错误
8 | return (
9 | <Layout>
> 10 | <h1>{product.title}</h1>
| ^
11 | <div>{product.description}</div>
12 |
WebpackError: TypeError: Cannot read property 'title' of undefined
- product.js:10
src/pages/product.js:10:20
盖茨比-node.js
const path = require(`path`)
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
// Query for all products in Shopify
const result = await graphql(`
query {
allShopifyProduct(sort: { fields: [title] }) {
edges {
node {
title
shopifyId
handle
description
availableForSale
priceRange {
maxVariantPrice {
amount
}
minVariantPrice {
amount
}
}
}
}
}
}
`)
// Iterate over all products and create a new page using a template
// The product "handle" is generated automatically by Shopify
result.data.allShopifyProduct.edges.forEach(({ node }) => {
createPage({
path: `/product/${node.handle}`,
component: path.resolve(`./src/pages/product.js`),
context: {
product: node,
},
})
})
}
您的 ProductTemplate
是 inside /pages
文件夹(它应该在 /templates
中)。这导致 Gatsby 尝试自动为该目录中的每个文件创建页面。在它自动执行的情况下,它不会获得任何上下文,因此构建失败。这只会在你 运行 gatsby build
时发生,因为在 gatsby develop
期间没有 SSR (Server-Side R渲染).
createPage
API 旨在基于 slug、路径或另一个独特的 identifier 字段创建动态页面,而不是针对已知页面,例如 inside /pages
文件夹。
要修复它,只需将您的 product.js
移动到 /templates
并更改为:
component: path.resolve(`./src/pages/product.js`),
为此:
component: path.resolve(`./src/templates/product.js`),
这是因为您要为每个产品创建模板,而不是页面(就像 Gatsby 理解页面一样)。
Here's a GitHub thread 如果您想遵循完整的解释,则正是您的问题。