ClerkをRemixで使う際に、rootLoaderでClerk以外の処理も走らせる方法の覚書
ClerkのRemixアダプターは、デフォルトでは特定の方法でしかrootのLoaderを使えないが、他の処理と併用する方法がある。例えば、記事カテゴリ一覧を表示するために、WP APIを使用することができる。rootAuthLoaderはPromise形式でResponseオブジェクトを返すので、それに合わせてloaderを作成することができる。loader作成時には、rootAuthLoaderにClerkのPublishable Keyを渡すことが重要であり、またJSON形式で返す必要がある。
目次
ClerkのRemixアダプターは、デフォルトだとClerkが提供するLoaderだけをrootのLoaderで使うように説明されています。これを他の処理と同居させる方法を試したので、その覚書です。
やりたいこと
レイアウト要素をrootで定義するようなサイトを作っています。その中で外部のAPIが提供するデータを使おうとしていたのですが、Clerkのドキュメントに記載されているloaderの使い方では、他のloaderとの併用が出来無さそうでした。
// Import rootAuthLoader
import { rootAuthLoader } from '@clerk/remix/ssr.server'
// Export as the root route loader
export const loader: LoaderFunction = (args) => rootAuthLoader(args)
以下の例では、レイアウト要素で記事カテゴリ一覧を出すため、WP APIを呼びだしています。
export async function loader(args: LoaderFunctionArgs) {
const locale = params.lang?.startsWith('en') ? 'en' : 'ja'
const wpClient = new WPAPIClient('https://example.com')
const categories = await wpClient.listWPCategories({
orderby: 'count',
order: 'desc',
hide_empty: true,
locale
})
return json({
categories: categories,
user,
})
}
rootAuthLoader
はPromise<Response>
を返すので、それを応用する
型定義を調べると、rootAuthLoader
はPromise形式でResponse
オブジェクトを返していました。ということは、その形を維持するようなloader
を作ればいけそうです。
export async function loader(args: LoaderFunctionArgs) {
const clerkLoader = await rootAuthLoader(args, () => {
return {}
}, {
publishableKey: import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
})
const clerkResponse = await (clerkLoader as Response).json<object>()
const locale = params.lang?.startsWith('en') ? 'en' : 'ja'
const wpClient = new WPAPIClient('https://example.com')
const categories = await wpClient.listWPCategories({
orderby: 'count',
order: 'desc',
hide_empty: true,
locale
})
return json({
...clerkResponse,
categories: categories,
user,
})
}
この方法を採用する場合のポイントは、rootAuthLoader
の第二引数第三引数です。この辺りはまだあまりちゃんと把握できていないのですが、第三引数でClerkのPublishable Keyを渡してやるのが良さそうでした。
また、JSONでreturnする必要があったので、clerkLoader.json()
を一度かませています。