NetlifyにデプロイされたGatsbyサイトがgraphcmsからのデータを更新しない
私はGatsbyとgraphcmsを使い始めたばかりです。gatsby開発環境でcmsからデータを取得することは問題なく、すべてが良好です。私は自分のウェブサイトをNetlifyにデプロイしましたが、cmsを介して新しいコンテンツを追加すると、コンテンツが更新されず、フェッチされません。
cmsからのコンテンツを必要とするコンポーネント:
import React from "react"
import { StaticQuery, graphql } from "gatsby"
import ServicesMobileProduct from "./ServicesMobileProduct"
const ProductsMobile = () => (
<StaticQuery
query={graphql`
{
product {
products {
id
productName
description
price
amount
}
}
}
`}
render={({ product: { products } }) => (
<>
{products.map(({ productName, description, price, amount, id }) => (
<ServicesMobileProduct
key={id}
productName={productName}
description={description}
price={price}
amount={amount}
/>
))}
</>
)}
/>
)
export default ProductsMobile
回答
Gatsbyは静的サイトジェネレーターです。つまり、ビルド/開発時に、CMS、マークダウン、JSON、またはその他のデータソースからすべてのデータを収集し、/publicフォルダーにパブリックHTML出力を作成します。この単純化されたスキーマに多かれ少なかれ従います:
通常、サイトが構築されたら、コンテンツを更新、作成、または削除するためにサイトを再デプロイする必要があります。これは、サイトがこれらのCMSの新しい変更で更新されていないためです。
あなたが達成しようとしていることはwebhookと呼ばれています。Webhookは、ソースからのコンテンツの作成、削除、変更など、新しいイベントがリアルタイムで発生したときに、アプリケーションが別のアプリケーションに通知する方法です。
Gatsbyでは、一部のソース(DatoCMSなど)がWebhookを公開していますが、これは開発モードでのみ機能します。CMSを変更するとgatsby develop、コンテンツを更新するコマンドがトリガーされます。もちろん、gatsby develop自動更新を実現するためだけにサイトをライブモードでアップロードすることは強くお勧めしません。
ビルドモードでは、考え方は非常に似ていgatsby developますが、コマンドを実行する代わりに、gatsby build+デプロイをトリガーする必要があります。Netlifyなどの継続的デプロイツール(CD)を使用している場合は、これを簡単に実現できます。Jenkinsなどの継続的インテグレーション(CI)ツールを使用している場合は、それを実現するためにパイプラインを構成する必要があります。
目的を達成するもう1つの方法は、アプリケーションにコンテンツを取り込む外部APIまたはデータソースへの非同期JavaScriptリクエストを作成することです。これはどのような環境でも機能しますが、ギャツビーがもたらすSEOの可能性(およびその他)はすべて失われます。