Open1
Next.js & Apollo tips
Next.jsでapollo client作成
src/libs/apolloClinet.ts
import {
ApolloClient,
HttpLink,
InMemoryCache,
NormalizedCacheObject,
} from "@apollo/client";
let apolloClient: ApolloClient<NormalizedCacheObject> | undefined;
const createApolloClient = () => {
return new ApolloClient({
ssrMode: typeof window === "undefined",
link: new HttpLink({
uri: process.env.NEXT_PUBLIC_HASURA_URL,
headers: {
"x-hasura-admin-secret": process.env.NEXT_PUBLIC_HASURA_KEY,
},
}),
cache: new InMemoryCache(),
});
};
export const initializeApollo = () => {
const _apolloClient = apolloClient ?? createApolloClient();
// For SSG and SSR always create a new Apollo Client
if (typeof window === "undefined") return _apolloClient;
// Create the Apollo Client once in the client
if (!apolloClient) apolloClient = _apolloClient;
return _apolloClient;
};
- SSRやSSGごとにclientを使い分けないとレンダリング等でバグが生じる(らしい by vercel)
src/pages/_app.tsx
import "../styles/globals.css";
import { Header } from "../components/organisms/Header";
import type { AppProps } from "next/app";
import { ApolloProvider } from "@apollo/client";
import { initializeApollo } from "../lib/apolloClient";
function MyApp({ Component, pageProps }: AppProps) {
const client = initializeApollo();
return (
<ApolloProvider client={client}>
<Header />
<Component {...pageProps} />
</ApolloProvider>
);
}
export default MyApp;