How can one prevent the page flash when using class-based dark mode in Tailwind CSS with Next.js v12 without using any 3rd party pkgs like next-themes?
I've looked at:
- this Q&A How to fix dark mode background color flicker in NextJS? and while it's a valid/working solution in Next.js <v12, in v12 it no longer works and throws warnings in dev which suprisingly turn to a build blocking error in prod env
Do not add <script> tags using next/head (see inline <script>). Use next/script instead. See more info here: https://nextjs.org/docs/messages/no-script-tags-in-head-component
- This article https://www.vidyasource.com/blog/dark-mode-nextjs-tailwindcss-react-hooks however including the script
<Script strategy="beforeInteractive" src="/scripts/darkMode.js"/>
still results in a page flash as it addsdefer
to it in thehead
- This official Tailwind CSS dark mode doc on what's required https://tailwindcss.com/docs/dark-mode#toggling-dark-mode-manually
// On page load or when changing themes, best to add inline in `head` to avoid FOUC
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
I think they restrict putting things in Head
from v12 to prepare for Suspense / Streaming / React v18.
Either way, I'm lost on how to do it without next-themes, does anyone know how can we just inject that bit of script to prevent that page flash?
Hope this question makes sense, if not, please give me a shout.
I like simple and minimalistic things, hence the aim to reduce the dependency on 3rd party pkgs, such a simple thing should be possible without overcomplicated solution IMO.
Hydration failed because the initial UI does not match what was rendered on the server.
when refreshing the page - any ideas? – Pharmacology