Next.js: El servidor de desarrollo tiene un flash de contenido sin estilo (FOUC)

Creado en 18 may. 2020  ·  20Comentarios  ·  Fuente: vercel/next.js

Informe de error

Describe el error

Una descripción clara y concisa de cuál es el error.

Al usar Next.js, parece que el CSS no está completamente hidratado en el <head> cuando el elemento <div id="__next"> vuelve visible por primera vez.

Esto provoca un destello de contenido sin estilo (o FOUC) cuando se ejecuta nuestro servidor de desarrollo. Sin embargo, parece que está bien en producción (lo que me parece extraño).

Reproducir

Pasos para reproducir el comportamiento, proporcione fragmentos de código o un repositorio:

  1. Clona este repositorio ejecutando:
$ git clone https://github.com/tutorbookapp/covid-tutoring
  1. Instale nuestras dependencias (más detalles en nuestro README.md ) ejecutando:
$ npm i && lerna bootstrap --hoist
  1. Inicie un servidor de desarrollo ejecutando:
$ npm run dev
  1. Observe el FOUC cuando cargue la página por primera vez.

Comportamiento esperado

Una descripción clara y concisa de lo que esperaba que sucediera.

El elemento <div id="__next"> solo debe ser visible después de que las hojas de estilo necesarias en la parte superior de la página (es decir, las hojas de estilo que se incluyen en los componentes de React que están visibles en la parte superior) se inserten en <head> . Las hojas de estilo restantes se pueden cargar con el elemento <div id="__next"> visible.

Capturas de pantalla

Si corresponde, agregue capturas de pantalla para ayudar a explicar su problema.

Vea el FOUC visible en nuestro servidor de desarrollo:

fouc

Observe que está en nuestro sitio web de producción :

no-fouc

Información del sistema

  • SO: Ubuntu 18.04.2
  • Navegador: Firefox 76.0.1
  • Versión de Next.js: 9.4.0
  • Versión de Node.js: 12.16.1
bug needs investigation

Comentario más útil

¿Y la producción? Todavía estoy experimentando el FOUC con StyledComponents + Material UI

Todos 20 comentarios

También me enfrento a este problema cuando uso módulos css, pero cuando uso styled-jsx, funciona bien.

Noto un problema similar en el que el CSS global en _app.js no parece estar cargado con javascript desactivado mientras está en modo de desarrollo. Hace que SSR sea más difícil de probar, ya que podrían faltar estilos.

@robgraeber tengo el problema exacto que tienes. El CSS se está compilando en _app.js en lugar de en un archivo css separado.

El mismo problema aquí.
He creado un ejemplo mínimo que reproduce este problema: https://github.com/dnaranjo89/next-css-ssr

También a veces edito algún CSS global en el inspector y cualquier cambio hace que el CSS de toda la página se arruine de alguna manera. ¿Alguien ha experimentado eso?

@derskeal, una solución alternativa es usar este complemento de sass e importar sus hojas de estilo a través de sass en su componente de diseño: https://github.com/giuseppeg/styled-jsx-plugin-sass

@Timer Podría reproducir este problema en este repositorio https://github.com/yanv1991/demo-react-dom , esto no carga los estilos usando módulos sass incorporados con un componente cargado dinámico para ssr en modo prod

Este proyecto no se puede ejecutar:

error - Error [FirebaseError]: projectId must be a string in FirebaseApp.options
    at new FirestoreError (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/firestore/dist/index.node.cjs.js:1223:28)
    at Function.Firestore.databaseIdFromApp (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/firestore/dist/index.node.cjs.js:21018:19)
    at new Firestore (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/firestore/dist/index.node.cjs.js:20850:42)
    at /Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/firestore/dist/index.node.cjs.js:22871:66
    at Component.instanceFactory (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/firestore/dist/index.node.cjs.js:22410:16)
    at Provider.getOrInitializeService (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/component/dist/index.cjs.js:219:39)
    at Provider.getImmediate (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/component/dist/index.cjs.js:120:33)
    at FirebaseAppImpl._getService (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/app/dist/index.node.cjs.js:228:49)
    at FirebaseAppImpl.firebaseAppImpl.<computed> [as firestore] (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/app/dist/index.node.cjs.js:440:39)
    at Object.serviceNamespace [as firestore] (/Users/joe/Desktop/scratch2/covid-tutoring/node_modules/@firebase/app/dist/index.node.cjs.js:420:45)
    at eval (webpack-internal:///./src/firebase/db.tsx:19:124)
    at Module../src/firebase/db.tsx (/Users/joe/Desktop/scratch2/covid-tutoring/.next/server/static/development/pages/_app.js:128:1)
    at __webpack_require__ (/Users/joe/Desktop/scratch2/covid-tutoring/.next/server/static/development/pages/_app.js:23:31)
    at eval (webpack-internal:///./src/firebase/user.tsx:12:61)
    at Module../src/firebase/user.tsx (/Users/joe/Desktop/scratch2/covid-tutoring/.next/server/static/development/pages/_app.js:152:1)
    at __webpack_require__ (/Users/joe/Desktop/scratch2/covid-tutoring/.next/server/static/development/pages/_app.js:23:31) {
  code: 'invalid-argument',
  toString: [Function]
}

¡Esto debería arreglarse en next@^9.4.5-canary.15 ! Actualice y avísenos.

¡Gracias @Timer! 🎉 Probé y la solución funciona para mí.

Estaba experimentando esto tanto en modo de desarrollo como en modo de producción en un servidor personalizado (conversión incremental de páginas en el sitio empresarial). ^9.4.5-canary.15 me lo arregló!

Hola chicos. Verificado el problema con la versión canary, soluciona el problema en modo dev, pero aún permanece en producción. ¿Alguien experimenta el mismo problema?

En la construcción de producción falta <style data-next-hide-fouc="true">body{display:none}</style> .

Hola chicos. Verificado el problema con la versión canary, soluciona el problema en modo dev, pero aún permanece en producción. ¿Alguien experimenta el mismo problema?

En la construcción de producción falta <style data-next-hide-fouc="true">body{display:none}</style> .

Lo mismo aquí, ¿es este un problema diferente cuando sucede en prod o relacionado, alguien lo sabe?

Lo mismo aquí, ¿es este un problema diferente cuando sucede en prod o relacionado, alguien lo sabe?

Para mí, este problema solo ocurría en el modo de desarrollo, no en el modo de producción. Entonces, dado eso, asumiría que el problema de la prod puede tener una causa diferente.

Hola chicos. Verificado el problema con la versión canary, soluciona el problema en modo dev, pero aún permanece en producción. ¿Alguien experimenta el mismo problema?

En la construcción de producción falta <style data-next-hide-fouc="true">body{display:none}</style> .

¿Alguien pudo arreglar esto en producción? La versión de Canary arregló nuestra compilación de desarrollo, pero la producción aún no funciona.

Entonces, ¿es canary la última versión de la próxima?

Sí, @jimmynames , canary es la última versión de WIP (el término se originó a partir de los mineros que usan canary birds para probar humos tóxicos ... La versión canary de Next.js podría ser un boceto).

Esta corrección se encuentra en la versión estable de Next.js 9.5.0 y 9.5.1, o más reciente (solo se aplica al servidor de desarrollo).

¿Y la producción? Todavía estoy experimentando el FOUC con StyledComponents + Material UI

¿Alguien encontró alguna solución para esto?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

swrdfish picture swrdfish  ·  3Comentarios

renatorib picture renatorib  ·  3Comentarios

lixiaoyan picture lixiaoyan  ·  3Comentarios

havefive picture havefive  ·  3Comentarios

wagerfield picture wagerfield  ·  3Comentarios