ろぼいんブログ

Payload CMSのライブプレビューの実装でつまづいたこと

Payload CMSの公式Webサイトのスクリーンショット
画像:Payload CMSの公式サイト

Payload CMSは、標準でライブプレビュー機能をサポートしています。

公式ドキュメントではライブプレビュー機能を実装する方法について、詳しく解説されています。

広告

ところが、ドキュメントにしたがって実装したにもかかわらず、ライブプレビューが機能しないという問題に遭遇しました。

詳しく調査したところ、プレビューの表示自体はできているのですが、記事を編集してもプレビューが再読み込みされず、変更が反映されていないということが判明しました。

原因

この問題は、いくつかの原因がありました。

ドラフトの記事データを読み込んでいない

ライブプレビューに対応するには、ドラフトの記事データを読み込む必要があります。

ドラフトの記事データを読み込むようにしないと、変更を公開するまでプレビューに反映されず、プレビューの意味がなくなってしまいます。

広告

ドラフトの記事データを読み込むには、オプションでdraft: trueを指定します。

const article = await payload.findByID({
// ...
draft: true
});

環境変数がクライアントに公開されていない

Payload CMSのドキュメントのRefreshRouteOnSave.tsxの定義では、"use client"ディレクティブが書かれています。

つまり、このコンポーネントはクライアントコンポーネントということになります。

Next.jsでは、デフォルトではクライアントから環境変数にアクセスできません。

そのため、@payloadcms/live-preview-reactRefreshRouteOnSaveコンポーネントのserverURLに渡す環境変数の名前には、NEXT_PUBLIC_プレフィックスが必要です。

広告

serverURLの値の末尾にスラッシュが入っている

@payloadcms/live-preview-reactRefreshRouteOnSaveコンポーネントのserverURLに渡す値は、末尾のスラッシュが許可されていません。

末尾のスラッシュがあってもエラーにはなりませんが、自動再読み込みが機能しなくなります。

serverURLの値は、payload.config.tsserverURLと同様に、プロトコル、ドメイン、ポートのみが許可され、パスは許可されません。

その他

Next.jsのルートキャッシュやデータキャッシュを利用している場合、ライブプレビュー用のページではこれらを無効化する必要があります。

(私の場合は適切に無効化していましたが、ライブプレビューの実装時に忘れる人が多そうなので一応書いておきます)

広告

記事をシェア

Xに共有するBlueskyに共有するMisskeyに共有するLINEに共有するThreadsに共有する

フォローして最新情報を入手

Googleの優先ソースに追加すると、このサイトの記事をGoogleで見つけやすくなります。また、ぜひXやRSSフィードもフォローしてください。

Googleの優先ソースとして追加するGoogleの優先ソースとして追加するXのロゴ
広告
著者のアイコン画像

生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。

Webフロントエンドプログラマーとして、TypeScriptを用いたWebアプリやブラウザー拡張機能を制作。Xのシャドウバン検知ツール「Shadowban Scanner」やリンクカード復活ツール「Restore Link Card」を公開し、国内外のメディアで紹介されました。iGEM 2023ではJapan-UnitedチームのWikiを制作してGrand Prizeの獲得に貢献。ブログではXやSNSの最新ニュース、不具合の検証と対処法、フロントエンド開発の知見を発信しています。