GraphQLを使ってJSS Next.jsアプリでコンポーネントレベルのデータを取得してください
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
Next.jsのサンプルアプリは コンポーネントレベルのデータ取得をサポートし、コンポーネントレベルでGraphQLエンドポイントのクエリを可能にします。
!注 コードファーストの開発者ワークフローに従い、GraphQLのコンポーネントレベルのクエリは 接続モードでのみ実行できます。
!警告危険コンポーネントレベルのgetStaticPropsおよびgetServerSideProps関数はクライアントサイドバンドルに含まれています。それらが依存するインポートもクライアントサイドバンドルに含まれており、クライアントサイドのコードがインポートを使わなくても含まれます。
秘密や、明かしたくない機密情報は含めないでください。
これはページレベルのgetStaticPropsやgetServerSideProps機能には影響しません。
コード内では、Sitecore GraphQL Edgeエンドポイントで定義された型GraphQLに強い型を結びつけるのが良い慣例です。これを実現するために、アプリケーションはライブラリgraphql-letとGraphQL内省データを使用します。
サンプルアプリはスキーマの探索やクエリのテストを行うためのGraphiQLインターフェースを提供しています。デフォルトでは、インターフェースには ${SITECORE_API_HOST}/sitecore/api/graph/edge/ui?sc_apikey=${SITECORE_API_KEY}を使ってアクセスできます。このインターフェースは、コンポーネントで使用できるGraphQL型を決めたい場合に役立ちます。
!注graphql-letライブラリは対応する .graphq.d.tsファイル内の型に関する情報も同様に提供しています。
GraphQLでコンポーネントレベルのデータ取得を使用するには:
-
GraphQL-ConnectedDemo.graphqlファイルでは、Connected Demoクエリの例に従ってGraphQLクエリを定義します。
ライブラリgraphql-letはファイルGraphQL-ConnectedDemoQuery.graphql.d.tsを生成します。
-
コンポーネントファイルに、次のインポート文を追加してください:
import { GetServerSideComponentProps, GetStaticComponentProps, useComponentProps, GraphQLRequestClient} from '@sitecore-jss/sitecore-jss-nextjs';
-
GraphQLクエリをインポートしてください。 GraphQL-Letはクエリのインポート機能を提供します。
import { ConnectedDemoQueryDocument, AppRoute, Item, GraphQlConnectedDemo as GrapQLConnectedDemoDatasource,} from './ConnectedDemoQuery.graphql';
-
コンポーネント内でgetStaticPropsまたはgetServerSideProps関数を定義します。この例ではgetStaticPropsを実装しています。GraphQLは切断モードで動作しないため、アプリが切断モードで動作する場合は関数を終了しなければなりません。また、GraphQLRequestClientクラスを使って新しいGraphQLクライアントを作成する必要があります。例えば:
export const getStaticProps: GetStaticComponentProps = async (rendering, layoutData) => { if (process.env.JSS_MODE === constants.JSS_MODE.DISCONNECTED) { return null; } const graphQLClient = new GraphQLRequestClient(config.graphQLEndpoint, { apiKey: config.sitecoreApiKey, }); }
-
リクエストを実行し、結果を返します:
export const getStaticProps: GetStaticComponentProps = async (rendering, layoutData) => { if (process.env.JSS_MODE === constants.JSS_MODE.DISCONNECTED) { return null; } const graphQLClient = new GraphQLRequestClient(config.graphQLEndpoint, { apiKey: config.sitecoreApiKey, }); const result = await graphQLClient.request
(MyQuery, { datasource: rendering.dataSource, contextItem: layoutData?.sitecore?.route?.itemId, language: layoutData?.sitecore?.context?.language, }); return result; }; -
コンポーネント関数では、useComponentPropsフックを使って得られたデータにアクセスできます:
const GraphQLConnectedDemo = (props: StyleguideComponentProps): JSX.Element => { const data = useComponentProps
(props.rendering.uid); // implement your component } -
編集モードでコンテンツを表示する戦略を実装してください。Sitecoreコンテキストを使って静的データをレンダリングできます。あるいは、編集モードでデータベースデータをmaster見るには、Content ManagementインスタンスのエンドポイントURLでGraphQLクライアントをインスタンス化してください。
!注このステップを省略すると、アプリケーションはサイト訪問者に対して同じデータを表示します。なぜなら、Content Delivery URLエンドポイントがmasterデータベースではなくwebから提供されるためです。
-
コンポーネントでプレースホルダーマークアップをレンダリングするには:
import { useSitecoreContext} from '@sitecore-jss/sitecore-jss-nextjs';
const MyComponent = () => { const { sitecoreContext } = useSitecoreContext(); // define some stub data if (sitecoreContext.pageEditing) { return (
This would usually render dynamic GraphQL data. This stub is used only for editing mode.); } // ... rest of the component } -
データ取得に別のエンドポイントを使う場合は、コンポーネントがプレビュー/編集モードかどうかを確認し、それに応じてURLを切り替えます。この例では、GraphQL編集URLを環境変数に割り当てたと仮定します。 EDITING_GQL_ENDPOINT。
export const getStaticProps: GetStaticComponentProps = async (rendering, layoutData, context) => {
if (process.env.JSS_MODE === constants.JSS_MODE.DISCONNECTED) { return null; }
const {preview} = context; const graphQLEndpoint = preview ? process.env.EDITING_GQL_ENDPOINT : config.graphQLEndpoint;
// if using getServerSideProps, you can use the Sitecore context from the layoutData // const graphQLEndpoint = layoutData.sitecore.context.pageEditing ? process.env.EDITING_GQL_ENDPOINT : config.graphQLEndpoint;
const graphQLClient = new GraphQLRequestClient(graphQLEndpoint, { apiKey: config.sitecoreApiKey, });
const result = await graphQLClient.request
(MyQuery, { datasource: rendering.dataSource, contextItem: layoutData?.sitecore?.route?.itemId, language: layoutData?.sitecore?.context?.language, }); return result; };
!注sitecoreApiKeyはエンドポイントごとに異なることがあるので、スイッチングはエンドポイントを切り替えるのと同じロジックで行うようにしてください。
-
コンポーネントでGraphQLクエリを使ったより複雑な例については、JSS Next.jsサンプルアプリのデモコンポーネントを参照してください。