Next.jsにおいてSSRを回避し、useLayoutEffect
などを正常に使用する方法について記載します。
dynamic
を使用する
dynamic
で{ssr: false}
を指定することでSSRを回避できます。
const Sample = dynamic(() => import('../components/Sample'), { ssr: false })
Suspense
を使用する
以下のように記述するとクライアント側で
<Suspense fallback={<Loading />}>
<Sample />
</Suspense>
function Sample() {
if (typeof window === 'undefined') {
throw Error('Sample should only render on the client.');
}
// ...
}
SSRではエラーとなり、最も近いSuspense
のfallback
に指定したLoading
が表示されます。
クライアントで正常に処理が完了するとSample
が表示されます。
isMounted
stateを使用する
以下のように記述するとコンポーネントがハイドレーションの後にのみレンダリングされます。
export function Sample() {
const [isMounted, setIsMounted] = useState(false)
useEffect(() => {
setIsMounted(true)
}, [])
return isMounted ? <RealContent /> : <FallbackContent />
}
useEffect
はクライアントでのみ実行されるため、SSRではFallbackContent
がレンダリングされ、useEffect
が実行されるとRealContent
が表示されます。