enonic-nextxp-integration について
enonic-nextxp-integrationは、@enonic/nextjs-adapterを使ってNext.jsフロントエンドとEnonic XPを統合する手順を案内します。コンテンツ表示、Guillotineでのデータ取得、Content Studioプレビュー、デプロイ、検証を扱います。
主な機能
- 01Next.jsとEnonic XPの統合箇所を特定
- 02アダプターと環境変数を設定
- 03コンテンツタイプをReactコンポーネントに対応付け
- 04Guillotine GraphQLクエリを設定
- 05Content Studioプレビューとデプロイを有効化
- 06統合の検証と問題の診断
活用シーン
- 01既存のNext.jsフロントエンドをEnonic XPに接続
- 02独自のReactビューでEnonicコンテンツを表示
- 03Content Studioで下書きコンテンツをプレビュー
- 04デプロイ前にマッピングとビルドを確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ webmaxru/ enonic-agent-skills --skill enonic-nextxp-integrationインストール後、Claude Code で/enonic-nextxp-integrationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/nextxp-page.template.tsxreferences/compatibility.mdexamples.mdnextxp-reference.mdtroubleshooting.mdscripts/find-nextxp-targets.mjs詳細
Next.js + Enonic XP ヘッドレス統合(Next.XP)
手順
ステップ 1:ワークスペースの統合対象を特定する
- ワークスペースを調べて、Next.js のエントリーポイント(
next.config.*、next依存関係を含むpackage.json)、Enonic XP アプリのマーカー(com.enonic.xpを含むbuild.gradle)、または既存の Next.XP アダプター参照(@enonic/nextjs-adapter)を確認します。 - Node ランタイムが利用できる場合は、
node scripts/find-nextxp-targets.mjs .を実行し、Next.js プロジェクト、ENONIC_*変数を含む.envファイル、コンポーネントマッピングファイル(_mappings.ts)、Guillotine クエリファイルを一覧表示します。 - Node ランタイムが利用できない場合は、
package.json、.env、src/components/_mappings.tsを手動で調べ、統合対象を特定します。 - ワークスペースに Enonic XP アプリと Next.js フロントエンドの両方が含まれている場合は、先に進む前にタスクの対象がどちらかを確認します。
- ワークスペースが Next.js + Enonic XP プロジェクトではない場合は、作業を中止し、このスキルが適用されないことを説明します。
ステップ 2:Enonic アダプターを設定する
- 設定を記述または変更する前に、
references/nextxp-reference.mdを読みます。 - Next.js プロジェクトのルートに、必要な変数を含む
.env(ローカル開発の場合は.env.local)ファイルがあることを確認するか、作成します。ENONIC_API_TOKEN— プレビューモード認証に使用する共有シークレットです。ENONIC_APP_NAME— 完全修飾された Enonic アプリケーション名です(例:com.example.myproject)。ENONIC_MAPPINGS— ロケールとプロジェクト/サイトのマッピングです(例:en:intro/hmdb)。ENONIC_API— Guillotine API エンドポイントのベース URL です(例:http://127.0.0.1:8080/site/)。
@enonic/nextjs-adapterパッケージがまだインストールされていない場合は、インストールします:npm install @enonic/nextjs-adapter。- 組み込みコンポーネントレンダラーを登録するため、
src/components/_mappings.tsの先頭で@enonic/nextjs-adapter/baseMappingsをインポートします。 - Next.js プロジェクトが
nextxp-templateからスキャフォールディングされていること、または想定されるファイル構造(src/components/_mappings.ts、src/app/[locale]/[[...contentPath]]/page.tsx、src/app/api/以下の API ルート)を含んでいることを確認します。 @enonic/nextjs-adapter(v4.x)、Next.js(16+)、React(19)、Enonic XP 間のバージョン要件を確認するため、references/compatibility.mdを読みます。 ステップ 3:コンテンツタイプを React コンポーネントに対応付ける- コンポーネントレジストリ API とマッピングパターンについて、
references/nextxp-reference.mdを読みます。 - クエリ、ビュー、プロセッサを含むコンテンツタイプの完全なマッピング例について、
references/examples.mdを読みます。 - カスタムレンダリングが必要な Enonic コンテンツタイプごとに、次の手順を実行します。
a.
src/components/queries/に Guillotine GraphQL クエリ関数を作成し、型イントロスペクション(... on AppName_ContentTypeName)を使って、そのコンテンツタイプ固有のフィールドを取得します。 b. HTML area(リッチテキスト)フィールドがあるコンテンツタイプでは、@enonic/nextjs-adapterのrichTextQuery(fieldName)を使ってクエリフラグメントを生成します。リッチテキストのレンダリングについては、references/nextxp-reference.mdを参照してください。 c.src/components/views/に React ビューコンポーネントを作成し、FetchContentResultの props を受け取り、取得したデータをレンダリングします。HTML area フィールドには、@enonic/nextjs-adapter/views/RichTextViewのRichTextViewを使います。 d.ComponentRegistry.addContentType()を使って、両方をsrc/components/_mappings.tsに登録します。 - ページコンポーネント(ページ、パーツ、レイアウト)については、次の手順を実行します。
a. Enonic アプリの
src/main/resources/site/pages/、parts/、またはlayouts/にコンポーネント XML を定義します。 b. 対応する React コンポーネントをsrc/components/pages/、parts/、またはlayouts/に作成します。レイアウトにはLayoutPropsを使い、各リージョンのレンダリングには名前付きエクスポートのRegionViewを使います。 c.ComponentRegistry.addPage()、ComponentRegistry.addPart()、またはComponentRegistry.addLayout()を使って登録します。 - レイアウトでは
LayoutProps型を使い、各リージョンのレンダリングにはRegionsViewではなくRegionView(単数形、名前付きエクスポート)を使います。 - コンテンツタイプの参照を動的に保つには、
@enonic/nextjs-adapterからAPP_NAMEとAPP_NAME_UNDERSCOREDをインポートします。
ステップ 4:Guillotine のデータ取得を設定する
- Guillotine のクエリ構造と変数の受け渡しについて、
references/nextxp-reference.mdを読みます。 guillotine { get(key:$path) { ... } }を通じてコンテンツを取得するための主な変数として、$path:ID!を使う GraphQL クエリを記述します。- 型イントロスペクションを使って、コンテンツタイプ固有のフィールドにアクセスします:
... on AppName_ContentTypeName { data { ... } }。 - リッチテキストフィールド(HtmlArea)には、フィールドを直接クエリする代わりに、アダプターの
richTextQuery(fieldName)を使います。@enonic/nextjs-adapter/views/RichTextViewのRichTextViewでレンダリングします。 - パーツと設定可能なコンポーネントについては、
query(path, context, config)関数とvariables(path, context, config)関数を含むクエリオブジェクトをエクスポートします。 - ビューワーに渡す前にクエリ結果を後処理するには、プロセッサ(非同期関数、任意)を使います。
- すべてのページコンポーネントで共有するデータには、
ComponentRegistry.setCommonQuery()を使います。パフォーマンスを最適化するために不要な場合は、共通クエリを削除します。 - スタンドアロンモードと Content Studio プレビューの両方で機能する URL 処理には、アダプターの
getUrl()とgetAsset()ヘルパー関数を使います。 - リッチテキスト内のマクロは、
RichTextViewを使う他のコンポーネントより前に、ComponentRegistry.addMacro()で登録します。マクロ登録 API については、references/nextxp-reference.mdを参照してください。 Step 5: Content Studio のプレビュー モードを有効にする - プレビュー アーキテクチャの詳細については、
references/nextxp-reference.mdをお読みください。 - Enonic XP に
Next.XPアプリをインストールします:XP Menu → Applications → Install → search "Next.XP"。 - サイト編集画面の「Applications」コンボボックスを使用して、Content Studio で対象サイトに Next.XP アプリを追加します。
- デフォルトのプレビュー設定を確認します:URL は
http://127.0.0.1:3000、シークレットはENONIC_API_TOKENと一致している必要があります。 - 本番環境では、アプリ設定で Next.XP アプリにデプロイ済みの Next.js URL と共有シークレットを設定します:
nextjs.default.url = <Next.js app URL> nextjs.default.secret = <shared secret> - プレビュー モードでは Guillotine API が自動的に
draftブランチに切り替わり、公開中の Next.js フロントエンドではmaster(公開済み)ブランチが使用されます。 - Content Studio のプレビュー、インライン、編集の各モードで URL が正しく解決されるよう、すべてのコンポーネントのリンクで
getUrl()を使用します。 - プレビューに空白のページが表示される場合は、診断手順について
references/troubleshooting.mdをお読みください。
Step 6: 本番環境にデプロイする
- デプロイのチェックリストについては、
references/nextxp-reference.mdをお読みください。 enonic cloud app installを使用して Enonic Cloud に Enonic アプリをデプロイします。- Enonic Cloud で Guillotine API を公開するための ingress を作成します(target path は
/site、public path は/api)。 - Next.js アプリを Vercel または別のホスティングプラットフォームにデプロイします。
- 本番環境の環境変数を設定します:
ENONIC_API、ENONIC_APP_NAME、ENONIC_API_TOKEN、ENONIC_MAPPINGS。 - Enonic Cloud の Next.XP アプリを、本番環境の Next.js URL を参照するように設定します。
- Content Studio でコンテンツを公開し、ライブ フロントエンドに表示されるようにします。
Step 7: 統合を検証する
node scripts/find-nextxp-targets.mjs .を実行し、アダプター、マッピング、環境設定が引き続き正しく解決されることを確認します。- 公開済みコンテンツを使用して、
http://localhost:3000でスタンドアロンの Next.js レンダリングが動作することを確認します。 - Content Studio のプレビューで、下書きコンテンツと公開済みコンテンツの両方が正しくレンダリングされることを確認します。
- コンテンツの URL にアクセスし、カスタムビューがレンダリングされることを確認して、コンテンツタイプのマッピングをテストします。
- ページハンドラーで
@enonic/nextjs-adapterのvalidateData()を使用し、無効なコンテンツレスポンスを検出します。SSG ページハンドラーのパターンについては、references/nextxp-reference.mdを参照してください。 - ワークスペースのビルド(
npm run build)を実行して、TypeScript またはビルドのエラーを検出します。
エラー処理
- Content Studio のプレビューに空白のページが表示される場合は、プレビュー プロキシの診断、トークン不一致の検出、CORS の問題について
references/troubleshooting.mdをお読みください。 - Guillotine クエリが空または予期しないデータを返す場合は、コンテンツタイプ名がイントロスペクションのパターンと一致していることを確認し、
http://localhost:8080/site/<project>の GraphQL Playground でクエリをテストしてください。 @enonic/nextjs-adapterのインポートに失敗する場合は、バージョン要件についてreferences/compatibility.mdを確認し、パッケージがインストールされていることを確認してください。- プレビューではコンテンツがレンダリングされるのに公開サイトでは表示されない場合は、コンテンツが公開済みであること(
draftブランチからmasterブランチに移動していること)を確認してください。 - コンポーネントのマッピングが適用されない場合は、
_mappings.tsの登録でAPP_NAMEとともに正しい完全修飾コンテンツタイプ名またはコンポーネント名を使用していることを確認してください。
コメント
Markdown 対応