¿Cómo se puede evitar que la página parpadee cuando se usa el modo oscuro basado en clases en Tailwind CSS con Next.js v12 sin usar paquetes de terceros como los siguientes temas?
he mirado:
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<Script strategy="beforeInteractive" src="/scripts/darkMode.js"/> en un destello de página, ya que agrega defer en la head // 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') } Creo que restringen poner cosas en Head desde v12 para prepararse para Suspense/Streaming/React v18.
De cualquier manera, no sé cómo hacerlo sin los siguientes temas, ¿alguien sabe cómo podemos inyectar ese fragmento de secuencia de comandos para evitar que la página parpadee?
Espero que esta pregunta tenga sentido, si no, por favor dame un grito.
Me gustan las cosas simples y minimalistas, de ahí el objetivo de reducir la dependencia de paquetes de terceros, algo tan simple debería ser posible sin una solución demasiado complicada, en mi opinión.
Tuve el mismo problema y lo resolví así en Next 12.1.0:
theme.js dentro de la carpeta public (la mía tiene el siguiente contenido): ;(function initTheme() { var theme = localStorage.getItem('theme') || 'light' if (theme === 'dark') { document.querySelector('html').classList.add('dark') } })()<Script src="/theme.js" strategy="beforeInteractive" /> a _app.tsx o _app.jsx . Esto es importante: intenté ponerlo dentro _document.tsx , que no funcionó. El _app.tsx final se ve así: import '../styles/globals.css' import type { AppProps } from 'next/app' import Head from 'next/head' import Script from 'next/script' function App({ Component, pageProps }: AppProps) { return <> <Head> <meta name="viewport" content="initial-scale=1.0, width=device-width" /> </Head> <Script src="/theme.js" strategy="beforeInteractive" /> <Component {...pageProps} /> </> } export default AppFunciona de maravilla para mí: sin parpadeos y toda la magia de Next.js. :) Espero que esto funcione para usted también.