Next.js: Über CSS-Chunks duplizierte Stile führen zu Problemen bei der Quellreihenfolge

Erstellt am 30. Apr. 2020  ·  42Kommentare  ·  Quelle: vercel/next.js

Fehlerbericht

Beschreibe den Fehler

Ich habe eine Anwendung, die eine Komponente auf mehreren Seiten verwendet. Wenn ich das Projekt erstelle, werden die Stile der Komponente in jedem der relevanten CSS-Seitenblöcke dupliziert. Dies erzeugt visuelle Fehler.

Beispiel ( some-component und initial-page-component-override sind Klassen, die auf dasselbe Element im DOM auf der Startseite angewendet werden):

initial-page.chunk.css

// component styles
.some-component { margin-bottom: 10px; }

// page specific override
.initial-page-component-override { margin-bottom: 20px; }

second-page.chunk.css

// component styles
.some-component { margin-bottom: 10px; }

Wenn dem DOM die Datei second-page.chunk.css hinzugefügt wird, werden die Komponentenstile erneut über alle auf der Startseite definierten seitenspezifischen Stile angewendet. Die Überschreibungen gehen verloren und der falsche Rand wird jetzt auf die Komponente auf der Startseite angewendet. Hinweis: Dies ist kein Problem im Entwicklungsmodus, sondern nur in der Produktion.

Reproduzieren

Um das Verhalten zu reproduzieren, geben Sie bitte Codefragmente oder ein Repository an:

  1. Kasse https://github.com/petewarman/nextjs-css-module-issue
  2. npm i , npm run build , npm start
  3. Bewegen Sie den Mauszeiger über die hellgrüne Taste
  4. Wenn das Stylesheet der zweiten Seite vorinstalliert ist, ändert es sich in Pink

Erwartetes Verhalten

Stildeklarationen sollten nicht in kompilierten Stylesheets dupliziert werden. Komponentenstile sollten (in ihrem eigenen Block?) Über seitenspezifischen Stilen geladen werden.

System Information

  • Betriebssystem: macOS
  • Version von Next.js: 9.3.6
  • Version von Node.js: 10.16.3
bug 3

Hilfreichster Kommentar

Ich habe genau das gleiche Problem: https://github.com/zeit/next.js/issues/11946#issuecomment -615298112

Alle 42 Kommentare

Ich habe genau das gleiche Problem: https://github.com/zeit/next.js/issues/11946#issuecomment -615298112

Gleiches Problem auch hier: weinen:
Ich habe mein Problem hier beschrieben: https://github.com/zeit/next.js/pull/11901#issuecomment -614644961

Irgendein Fortschritt? Ich habe immer noch das gleiche Problem und kann es nicht in Produktion bringen.
Getestet auf 9.3.7-canary.9

@ EduardoPedrosa
Status: v9.3.7-canary.11 und das Problem besteht weiterhin.

Wir scheinen ein ähnliches Problem mit Komponenten aus einer gemeinsam genutzten Komponentenbibliothek in unserem Monorepo zu haben - alle Stile in unserer App, die diese Komponenten betreffen, werden von den Bibliotheksstilen überschrieben, obwohl die Spezifität der Stile in unseren App-CSS-Dateien gleich ist höher und sollte daher Vorrang haben. Im Dev-Modus sieht es gut aus, nur nicht in der Produktion :(

(Wir verwenden SCSS-Module mit @zeit/next-sass )

image

image

Als ich @ zeit / next-sass oder @ zeit / next-css verwendete, war alles in Ordnung mit Reihenfolge, Präferenz und Duplikaten zwischen Chuncks. :Denken:

Das eigentliche Problem für mich beginnt, als ich nextjs auf 9.3 aktualisiert und mit der Verwendung von CSS-Modulen begonnen habe.

Ich habe beide 2 Methoden ausprobiert (next-sass und integriert) - das Problem bestand in beiden Fällen

Mein Stapel:
1) CSS-Module
2) SCSS
3) Dart-Sass mit @ use Importen

Versuchte viele Variationen und diese funktioniert für mich (ohne Stilduplikate):

1) package.json:

"@zeit/next-css": "^1.0.1",
"@zeit/next-sass": "^1.0.1",
"next": "9.2.1", (9.4.1 is current)
"node-sass": "npm:[email protected]", (this is dart sass, but can be used default)

2) next.config.js

const path = require('path')
const withSass = require('@zeit/next-sass')
const withCSS = require('@zeit/next-css')
const withBundleAnalyzer = require('@next/bundle-analyzer')({ // Optional, of course
  enabled: process.env.ANALYZE === 'true',
})

module.exports = withBundleAnalyzer(
  withCSS(
    withSass({
      cssModules: true,
      sassLoaderOptions: {
        // Resolving SASS absolute imports
        includePaths: [path.resolve(__dirname, 'src')],
      },
      cssLoaderOptions: {
        importLoaders: 2,
        localIdentName:
          process.env.NODE_ENV === 'production'
            ? '[hash:base64]'
            : '[name]__[local]__[hash:base64:5]',
      },
      webpack(config, options) {
        // Resolving absolute imports
        config.resolve.modules.push(path.join(__dirname, 'src'))

        // Make global styles work
        config.module.rules.forEach(rule => {
          if (rule.test && rule.test.toString().includes('.scss')) {
            rule.rules = rule.use.map(useRule => {
              if (typeof useRule === 'string') {
                return {
                  loader: useRule,
                }
              }

              if (useRule.loader.startsWith('css-loader')) {
                return {
                  oneOf: [
                    {
                      test: new RegExp('.module.scss$'),
                      loader: useRule.loader,
                      options: useRule.options,
                    },
                    {
                      loader: useRule.loader,
                      options: {},
                    },
                  ],
                }
              }
              return useRule
            })
            delete rule.use
          }
        })

        return config
      },
    }),
  ),
)

3) Importieren globaler (nicht modulierter) Stile wie folgt:

index.scss:

...
<strong i="19">@import</strong> '~emoji-mart/css/emoji-mart.css';
...

Es wird großartig sein, wenn jemand eine solche Konfiguration versucht, damit ich sicherstellen kann, dass dies wirklich funktioniert.

Ich schlage vor, dies zu ersetzen:

.other-page__component-override { background: pink; }

Mit diesem:

.other-page .component-override { background: pink; }

Die seitenspezifischen Stile gelten also nur für diese bestimmte Seite =).

Ich habe auch Probleme mit diesem Fehler.
Ich habe das nächste CSS in das integrierte CSS geändert und es ist passiert.
Es funktioniert im Entwicklungsmodus, aber nicht im Produktionsmodus, wenn CSR verwendet wird. In SSR gibt es kein Problem.

Ich verwende die nächste Version 9.4.4 mit integrierter CSS-Unterstützung und ich habe auch dieses Problem, es passiert in der Produktion.

Gleiches Problem am nächsten 9.4.4. Nur im Produktionsmodus

Dies passiert mit unserer Produktionsumgebung am nächsten 9.4.4, und irgendwie haben wir eine Lösung gefunden.

Bei der Verwendung von node-sass probieren wir verschiedene Optionen aus dem Dokument aus und lösen dies, indem wir next.config.js ein neues sassOptions hinzufügen

module.exports = {
  ...,
  sassOptions: {
    outputStyle: 'expanded',
  },
}

Referenz: outputStyle

Nachdem Sie den CSS-Klassennamen nach next build überprüft haben, scheint dies zu funktionieren.
Hoffe das hilft!

Vielen Dank für das Teilen von @ Howard86 , versucht, aber es hat hier nicht funktioniert. Wir verwenden next-css und next-sass auch für unsere Builds (nicht die integrierte CSS-Unterstützung von next und haben das gleiche Problem wie in dieser Ausgabe beschrieben), und die Duplizierung tritt in Klassen auf, die aus reinem CSS stammen, das als CSS importiert wurde. Module, die nicht aus Sass-Stilen stammen

@ Howard86 @ alexandre-marchina

Ich verwende integriertes CSS von next, next 9.4.4 und Ihre Lösung hat auch bei mir nicht funktioniert. :Schrei:

Ich habe das gleiche Problem mit Antd und dem nächsten neuesten 😞

gleicher Fehler . CSS laden perfekt in dev, aber im Produkt werden einige Teile von CSS nicht geladen

Gleiches Problem auch hier.

Ich habe die gleichen Probleme mit der nächsten Version 9.5.1 beim Prod Build erlebt. Beim Dev Build sind die Styles in Ordnung.

Dieser Fehler macht die Verwendung von CSS-Modulen in next.js unmöglich (weil niemand hinzufügen möchte! Wichtig in Stilen)

Dieser Fehler macht die Verwendung von CSS-Modulen in next.js unmöglich (weil niemand hinzufügen möchte! Wichtig in Stilen)

Sie können die Spezifität für die Stile erhöhen, die die Grundstile überschreiben. Nehmen wir zum Beispiel die Komponentenabhängigkeit als Button <- IconButton <- MoreSpecificButton an. In diesem Fall verfügt Button über eigene Stile, die beim Wechseln zu einer anderen Seite neu geladen werden und daher Stile von IconButton und MoreSpecificButton überschreiben. Wenn die Stile von IconButton als .className.className sind und MoreSpecificButton die Stile auch als .className.className wird sie von Button nicht überschrieben. Und da die Reihenfolge der Stile IconButton und MoreSpecificButton in CSS korrekt ist, überschreiben die Stile von MoreSpecificButton immer IconButton - erwartet.

Ich habe die gleichen Probleme mit der nächsten Version 9.5.1 beim Prod Build erlebt. Beim Dev Build sind die Styles in Ordnung.

Ich habe das gleiche Problem.

+1 mit Rückenwind, Bootstrap. Die aktuelle Problemumgehung besteht darin, alle Stile über den Link rel in die Datei _document.js zu importieren. Für Tailwind ist es ein benutzerdefinierter CSS-Build. Dieses Problem ist sehr ärgerlich.

Ich verwende CSS-Module mit Rückenwind (normaler globaler CSS-Import). Inlining CSS hat die Ladereihenfolge gelöst, aber ich weiß nicht, ob es immer noch dupliziert wird. Es ist nur eine Problemumgehung. In der Produktion habe ich keinen Stil bemerkt, der einen anderen überschreibt.

https://github.com/vercel/next-plugins/issues/238#issuecomment -432211871

Dies ist auf dem neuesten Kanarienvogel von Next.js behoben. Bitte aktualisieren Sie auf next@^9.5.3-canary.7 und lassen Sie es uns wissen!

Behebt es nicht für mich, zum Beispiel sind Zeilenhöhen, Schriftstärken, Hintergrundfarben und Ränder in dev und prod unterschiedlich.

@talaikis bitte eröffnen Sie eine neue Ausgabe mit einer vollständig reproduzierbaren Demo! Ich habe den genauen Code in dieser Reproduktion getestet und er funktioniert jetzt mit canary .

Fix für mich, aber es verursacht ein weiteres kritischeres Problem.
In meinem Fall, wenn ich nur die Hash-URL mit Router.push( localhost: 3000 ändere, ändern Sie ) coming from localhost: 3000 `Alle Stylesheets werden erneut geladen, wodurch der Bildschirm blinkt.

Können Sie bitte 9.5.3-canary.9 ausprobieren?

@Timer läuft npm i :

image

Ich hatte versucht, 9.5.3-canary.9 aber es ist immer noch Problem mit Hash.

Ich habe es nicht erwähnt, verwende aber 9.5.2 und wenn ich auf 9.5.3-canary.6 migriert bin, gibt es auch einen Fehler in der devtools-Konsole, wenn ich den Router verwende, um den Hash wie oben zu ändern.
Das Problem existiert nicht in 9.5.3-canary.5 .

image

@fabinppk bitte öffnen Sie eine neue Ausgabe mit einer Reproduktion!

Ich wollte nur bestätigen, dass das ursprüngliche Problem in 9.5.3-canary.9 behoben zu sein scheint. Vielen Dank, dass Sie @Timer

Vielen Dank für die Bestätigung von @petewarman!

@ Timer sicher. Ich denke, Ihr Fix ist in Ordnung und hängt nicht mit diesem Problem in devtools zusammen.
Vielen Dank. : +1:

Kann bestätigen, dass dies immer noch mit 9.5.6-canary.11 geschieht. Klassen werden über Chunks hinweg dupliziert.

@glottonous Alle in diesem Problem kommentierten Probleme wurden vom Timer gelöst.

Ps: Ich benutze 9.5.5. 👌👌

@fabinppk Ich kann bestätigen, dass das gleiche Problem ab 9.5.6-canary.11 immer noch auftritt .

@glottonous Ich habe einige Tests an meinem Projekt mit der Version 9.5.6-canary.11 und hatte keine Probleme.

Wenn Sie wirklich ein Problem haben, öffnen Sie ein neues Problem, indem Sie auf dieses verweisen. : +1:

in nextjs 10 die gleichen Ausgaben

Gleiche Probleme 10.0.1

Ich habe # 19055 mit einer reproduzierbaren Demo begonnen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

olifante picture olifante  ·  3Kommentare

sospedra picture sospedra  ·  3Kommentare

jesselee34 picture jesselee34  ·  3Kommentare

renatorib picture renatorib  ·  3Kommentare

lixiaoyan picture lixiaoyan  ·  3Kommentare