Server Side Rendering with SWR
SWR allows a user to pre-render with default data . Specifically, you can either pass fallbackData directly to useSWR,
const { data } = useSWR("/api/article", fetcher, { fallbackData });or define it globally in SWRConfig
<SWRConfig value={{ fallback }}>
  <Article />
</SWRConfig>Supabase Cache Helpers exports helper to simplify it for every query type.
Using the NextJS App Router and react server components requires importing
fetchQueryFallbackData, fetchOffsetPaginationFallbackData,
fetchOffsetPaginationHasMoreFallbackData from
@supabase-cache-helpers/postgrest-swr/react-server. All other exports are
suitable for client components only.
useQuery
Fetch fallback data for useQuery using fetchQueryFallbackData.
const buildQuery = (supabase: SupabaseClient) => {
    return supabase.from('article').select('id,title');
};
 
export async function getStaticProps() {
  const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
  );
  const [key, fallbackData] = await fetchQueryFallbackData(
    buildQuery(supabase),
  );
  return {
    props: {
      fallback: fallbackData,
    },
  };
}
 
export default function Articles({ fallback }) {
    const supabase = useSupabaseClient();
 
    const { data } = useQuery(buildQuery(supabase), { fallbackData: fallback });
    ...
 
}
 The data can also be passed globally using key.
const buildQuery = (supabase: SupabaseClient) => {
   return supabase.from('article').select('id,title');
};
 
export async function getStaticProps() {
  const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
  );
  const [key, fallbackData] = await fetchQueryFallbackData(
    buildQuery(supabase),
  );
  return {
    props: {
      fallback {
        [key]: fallbackData,
    },
  };
}
 
export default function App({ fallback }) {
    return (
        <SWRConfig value={{ fallback }}>
            <Article />
        </SWRConfig>
    )
}useOffsetInfiniteQuery
To fetch fallback data for useOffsetInfiniteQuery, use fetchOffsetPaginationFallbackData.
const buildQuery = (supabase: SupabaseClient) => {
   return supabase.from('article').select('id,title');
};
 
export async function getStaticProps() {
  const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
  );
  const [key, fallbackData] = await fetchOffsetPaginationFallbackData(
    buildQuery(supabase), 1
  );
  return {
    props: {
      fallback: fallbackData,
    },
  };
}
 
export default function Articles({ fallback }) {
    const supabase = useSupabaseClient();
 
    const { data } = useOffsetInfiniteQuery(buildQuery(supabase), {
        pageSize: 1,
        fallbackData,
    });
    ...
 
}Unfortunately, passing it globally to SWRConfig does not work. There seems
to be an issue with fallbackData in useSWRInfinite that I could not figure
out yet.
useOffsetInfiniteScrollQuery
To fetch fallback data for useOffsetInfiniteScrollQuery, use fetchOffsetPaginationHasMoreFallbackData.
const buildQuery = (supabase: SupabaseClient) => {
   return supabase.from('article').select('id,title');
};
 
export async function getStaticProps() {
  const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
  );
  const [key, fallbackData] = await fetchOffsetPaginationHasMoreFallbackData(
    buildQuery(supabase), 1
  );
  return {
    props: {
      fallback: fallbackData,
    },
  };
}
 
export default function Articles({ fallback }) {
    const supabase = useSupabaseClient();
 
    const { data } = useOffsetInfiniteScrollQuery(buildQuery(supabase), {
        pageSize: 1,
        fallbackData,
    });
    ...
 
}Unfortunately, passing it globally to SWRConfig does not work. There seems
to be an issue with fallbackData in useSWRInfinite that I could not figure
out yet.
useInfiniteOffsetPaginationQuery
To fetch fallback data for useInfiniteOffsetPaginationQuery, use fetchOffsetPaginationHasMoreFallbackData.
const buildQuery = (supabase: SupabaseClient) => {
   return supabase.from('article').select('id,title');
};
 
export async function getStaticProps() {
  const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
  );
  const [key, fallbackData] = await fetchOffsetPaginationHasMoreFallbackData(
    buildQuery(supabase), 1
  );
  return {
    props: {
      fallback: fallbackData,
    },
  };
}
 
export default function Articles({ fallback }) {
    const supabase = useSupabaseClient();
 
    const { data } = useInfiniteOffsetPaginationQuery(buildQuery(supabase), {
        pageSize: 1,
        fallbackData,
    });
    ...
 
}Unfortunately, passing it globally to SWRConfig does not work. There seems
to be an issue with fallbackData in useSWRInfinite that I could not figure
out yet.