I created the sample code below.
Why my serverLoader runs every time I reload?
I thought serverLoader will run only first time.
import type { LoaderFunctionArgs, MetaFunction } from "@remix-run/node";
import { LoaderFunction, json } from "@remix-run/node";
import {
Link,
useLoaderData,
ClientLoaderFunctionArgs,
defer,
Await,
} from "@remix-run/react";
import { Suspense } from "react";
import localforage from "localforage";
interface LazyData {
message: string;
}
export const loader = async ({ request }: LoaderFunctionArgs) => {
console.log("loader function ran");
return defer({
message: getLazyData(),
});
};
export async function clientLoader({ serverLoader }: ClientLoaderFunctionArgs) {
console.log("clientLoader function ran");
let cacheKey = "lazy-data";
let cached = await localforage.getItem<LazyData>(cacheKey);
if (cached) {
return { message: cached };
}
let data: LazyData = await serverLoader();
let cacheData = data.message;
await localforage.setItem(cacheKey, cacheData);
return cacheData;
}
clientLoader.hydrate = true;
export default function Index() {
const data = useLoaderData<typeof loader>();
console.log("Index function ran");
console.log(data);
return (
<div className="h-full flex flex-col items-center pt-20 bg-slate-900 text-white">
<p>Playground Page</p>
<Suspense fallback={<Loading />}>
<Await resolve={data.message}>
{(resolvedData) => {
const { message } = resolvedData;
return (
<div>
<p>{message}</p>
</div>
);
}}
</Await>
</Suspense>
</div>
);
}
function getLazyData() {
return new Promise<LazyData>((resolve) => {
setTimeout(() => {
resolve({ message: "Hello from a lazy loader!" });
}, 1000);
});
}
function Loading() {
return <div>Loading...</div>;
}