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

Payload CMSは、標準でライブプレビュー機能をサポートしています。
公式ドキュメントではライブプレビュー機能を実装する方法について、詳しく解説されています。
ところが、ドキュメントにしたがって実装したにもかかわらず、ライブプレビューが機能しないという問題に遭遇しました。
詳しく調査したところ、プレビューの表示自体はできているのですが、記事を編集してもプレビューが再読み込みされず、変更が反映されていないということが判明しました。
原因
この問題は、いくつかの原因がありました。
ドラフトの記事データを読み込んでいない
ライブプレビューに対応するには、ドラフトの記事データを読み込む必要があります。
ドラフトの記事データを読み込むようにしないと、変更を公開するまでプレビューに反映されず、プレビューの意味がなくなってしまいます。
ドラフトの記事データを読み込むには、オプションでdraft: trueを指定します。
const article = await payload.findByID({ // ... draft: true});環境変数がクライアントに公開されていない
Payload CMSのドキュメントのRefreshRouteOnSave.tsxの定義では、"use client"ディレクティブが書かれています。
つまり、このコンポーネントはクライアントコンポーネントということになります。
Next.jsでは、デフォルトではクライアントから環境変数にアクセスできません。
そのため、@payloadcms/live-preview-reactのRefreshRouteOnSaveコンポーネントのserverURLに渡す環境変数の名前には、NEXT_PUBLIC_プレフィックスが必要です。
serverURLの値の末尾にスラッシュが入っている
@payloadcms/live-preview-reactのRefreshRouteOnSaveコンポーネントのserverURLに渡す値は、末尾のスラッシュが許可されていません。
末尾のスラッシュがあってもエラーにはなりませんが、自動再読み込みが機能しなくなります。
serverURLの値は、payload.config.tsのserverURLと同様に、プロトコル、ドメイン、ポートのみが許可され、パスは許可されません。
その他
Next.jsのルートキャッシュやデータキャッシュを利用している場合、ライブプレビュー用のページではこれらを無効化する必要があります。
(私の場合は適切に無効化していましたが、ライブプレビューの実装時に忘れる人が多そうなので一応書いておきます)
記事をシェア
フォローして最新情報を入手
Googleの優先ソースに追加すると、このサイトの記事をGoogleで見つけやすくなります。また、ぜひXやRSSフィードもフォローしてください。
-1.png&w=1080&q=75)
生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。
Webフロントエンドプログラマーとして、TypeScriptを用いたWebアプリやブラウザー拡張機能を制作。Xのシャドウバン検知ツール「Shadowban Scanner」やリンクカード復活ツール「Restore Link Card」を公開し、国内外のメディアで紹介されました。iGEM 2023ではJapan-UnitedチームのWikiを制作してGrand Prizeの獲得に貢献。ブログではXやSNSの最新ニュース、不具合の検証と対処法、フロントエンド開発の知見を発信しています。



![Discordの[プロフィールのプライバシー]設定のスクリーンショット](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fdiscord-profile-privacy-settings.png&w=3840&q=75)
![スマートフォンのホーム画面の[Social]フォルダーを表示した写真。フォルダー内にはFacebook、Instagram、Threads、X、LinkedIn、TikTok、YouTubeのアイコンが配置されている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Ffacebook-instagram-threads-x-twitter-linkedin-tiktok-youtube-mobile-app-unsplash.jpg&w=3840&q=75)







