【发布时间】:2018-01-28 05:04:18
【问题描述】:
我正在创建一个文档站点来保存我的每个产品的 DocPages。 Gatsby 将我的所有网站都构建为静态页面。我有多名技术作家,他们不断更新和创建新页面。盖茨比是如何处理这个问题的?每次更新某些内容时,我是否必须使用 Gatsby 重建我的整个站点?
【问题讨论】:
标签: javascript contentful gatsby
我正在创建一个文档站点来保存我的每个产品的 DocPages。 Gatsby 将我的所有网站都构建为静态页面。我有多名技术作家,他们不断更新和创建新页面。盖茨比是如何处理这个问题的?每次更新某些内容时,我是否必须使用 Gatsby 重建我的整个站点?
【问题讨论】:
标签: javascript contentful gatsby
gatsby-source-contentful 插件使用sync API。如果您在插件周围保留.cache 和public 文件夹,则只能获取更改的条目和资产并更新盖茨比数据。保持.cache 应该构建得更快。
取决于您的 webhook 设置,此构建过程可能会被触发多次以解决问题,也许您可以添加一个脚本来延迟构建并确保只有一个构建过程正在运行。
【讨论】:
我知道这是一个老问题,但我今天在这个问题上苦苦挣扎,似乎没有人给出一个像样的帖子或答案,当你重新启动 gatsby development 时,Gatsby v2 仍然会重建所有内容。如果您的构建在第一次运行时需要 20 分钟,那么这是不行的。我的解决方案如下。
您可以使用cache API 保存数据的哈希或更新信息,并且仅在缓存不匹配时调用 createPage 操作(数据已更新)
这就是我在项目中的做法:
exports.createPages = async ({ actions: { createPage }, graphql, cache }) => {
const results = await graphql(`
query GetAllCars {
myNamespaceFromGraphqlSource {
allCars {
id
updatedAt
}
}
}
`);
const createDetailsPage = async (car) => {
const carCache = await cache.get(car.id);
if(carCache != car.updatedAt) {
createPage({
path: `/car_details/${car.id}/`,
component: require.resolve("./src/templates/details.js"),
context: {
id: car.id,
},
});
await cache.set(car.id, car.updatedAt);
}
}
for(let i=0; i < results.data.myNamespaceFromGraphqlSource.allCars.length; i++ ) {
const car = results.data.myNamespaceFromGraphqlSource.allCars[i];
await createDetailsPage(car)
}
【讨论】: