💿
Remix で preload パターンを実装する
↑の記事で Next.js での preloadパターンの実装について紹介されていたので、それのRemix版です。
deferを用いた実装
Remixのloader
はdefer
を使用することでストリーミング/遅延レスポンスを返却することができます。
実装例は以下の通りです。
export const loader = async () => {
const aStillRunningPromise = loadSlowDataAsync();
const isAuthenticated = await getIsAuthenticated();
if (!isAuthenticated) {
redirect('/login');
}
return defer({
slowPromise: aStillRunningPromise,
});
}
export default function Page() {
const { slowPromise } = useLoaderData<typeof loader>();
return (
<Suspense fallback={<div>Loading...</div>}>
<Await resolve={slowPromise}>
{(resolved) => <p>{resolved.title}</p>}
</Await>
</Suspense>
);
}
use
API を使うパターン
slowPromise
はPromiseなので勘のいい方ならお気づきかもしれませんが、こちらも React の use
を使うことができます。
export const loader = async () => {
const aStillRunningPromise = loadSlowDataAsync();
const isAuthenticated = await getIsAuthenticated();
if (!isAuthenticated) {
redirect('/login');
}
return defer({
slowPromise: aStillRunningPromise,
});
}
export default function Page() {
const { slowPromise } = useLoaderData<typeof loader>();
const resolved = use(slowPromise);
return (
<p>{resolved.title}</p>
);
}
<Suspense>
と<Await>
でラップする必要がなくなったのでHTMLがスッキリしましたね。
というわけで
Remix版でした。
Discussion