Next.js: Arbeiten mit externen CSS- und CSS-Dateien

Erstellt am 19. Okt. 2017  ·  38Kommentare  ·  Quelle: vercel/next.js

Es ist ein überflüssiges Problem, das ich kenne, aber ich habe dieses Problem absichtlich geöffnet. Es sind drei Tage, in denen ich eine next.js-Boilerplate (mit Redux, Redux-Saga, ...) einrichte und zwei Tage lang bin ich beim Einrichten des Ladens externer CSS- und Scss-Dateien stecken geblieben. Ich habe die Beispiele with-global- stylesheet und

Hilfreichster Kommentar

Ich möchte auch darauf hinweisen, dass mir persönlich der Ton der Leute in dieser Ausgabe nicht gefällt.
Ich verstehe völlig, dass Sie CSS importieren möchten. Und wir sind uns dieser Bitte sehr bewusst. Deshalb habe ich die vergangene Woche damit verbracht, an der bestmöglichen Lösung zu arbeiten 👍
Mehr dazu in Kürze. Bis dahin bitte schöne Feiertage

Alle 38 Kommentare

Ich stimme zu, nur styled-jsx hat saubere (einschließlich Hot-Reloading) Unterstützung und das hält mich davon ab, Next.js für alles zu verwenden, außer wenn ich schnelles Prototyping benötige.

Ich denke, die Lösung für CSS-Scoping-Probleme von CSS-Modulen ist viel sauberer, und mit CSS-Modulen ist es immer noch möglich, Klassen an untergeordnete Komponenten zu übergeben (versuchen Sie, eine nicht-globale Klasse auf ein SVG zu setzen, das mit babel-plugin-inline-react-svg importiert wurde). mit styled-jsx).

Das und ich bevorzuge standardisierte .css Dateien, um Framework-Lock-in so weit wie möglich zu verhindern, und externe CSS-Dateien in der Produktion zum Caching (und damit MQ-Polyfills wie Respond.js funktionieren, wenn Sie das Pech haben müssen noch IE8) unterstützen.

Massiv +1
Es ist eine große Frustration, dass eine so einfache Sache wie externes CSS/Scss mit next.js fast unmöglich zu erreichen ist, was es für 90% meiner Anwendungen nutzlos macht.

Ich arbeite mit Bootstrap und benötige eine Konfiguration, bei der es einen globalen Bootstrap-CSS-Import mit zusätzlichem CSS mit externem Geltungsbereich gibt.

Während wir es geschafft haben, einen externen Stylus mit styled jsx 1 (Webpack zur Handhabung der Kompilierung) zum Laufen zu bringen, hatten wir Schwierigkeiten, dies auf styled jsx 2 herauszufinden, seit die Änderung der Handhabung separater CSS-Dateien eingeführt wurde.
Aktueller Ansatz:

import ComponentStyles from './footer.styl';
...
      <style jsx>
        {ComponentStyles}
      </style>

Wäre toll zu sehen, wie https://github.com/zeit/next.js/tree/master/examples/with-styled-jsx-scss mit externen scss-Dateien arbeitet.

Wir haben die gleiche Tortur beim Einrichten der Umgebung durchgemacht.
Schließlich haben wir uns mit einem globalen Stylesheet mit scss+post css mit Lost-Grid zufrieden gegeben.
Hot Reloading funktioniert, ist also zwar keine ideale Lösung (da das globale Stylesheet auf einmal geladen wird), aber ein guter Kompromiss.

Abhängigkeiten

"autoprefixer": "^7.1.6",
"babel-plugin-module-resolver": "^2.7.1",
"babel-plugin-wrap-in-js": "^1.1.1",
"node-sass": "^4.5.3",
"sass-loader": "^6.0.6",
"pixrem": "^4.0.1",
"postcss-easy-import": "^3.0.0",
"postcss-loader": "^2.0.8"

In package.json

  ...
  "postcss": {
    "plugins": {
      "lost": {},
      "postcss-easy-import": {
        "prefix": "_"
      },
      "autoprefixer": {},
      "pixrem": {}
    }
  }
  ...

In next.config.js

webpack: (config, { dev }) => {
    config.module.rules.push(
      {
        test: /\.(css|scss)/,
        loader: 'emit-file-loader',
        options: {
          name: 'dist/[path][name].[ext]'
        }
      }
    ,
      {
        test: /\.css$/,
        use: ['babel-loader', 'raw-loader', 'postcss-loader']
      }
    ,
      {
        test: /\.s(a|c)ss$/,
        use: ['babel-loader', 'raw-loader', 'postcss-loader',
          { loader: 'sass-loader',
            options: {
              includePaths: ['styles', 'node_modules']
                .map((d) => path.join(__dirname, d))
                .map((g) => glob.sync(g))
                .reduce((a, c) => a.concat(c), [])
            }
          }
        ]
      }
    )
    return config
  }

In pages/_document.js

...

import stylesheet from 'styles/main.scss'

   ...
        <Head>
          <style dangerouslySetInnerHTML={{ __html: stylesheet }} />
        </Head>
   ...

Und Sie können Ihre Stile dann von /styles/main.scss . aus verwalten
Ich hoffe es hilft

Mein Problem bei jedem dieser beiden Stilbeispiele ( with-global- stylesheet und Jest- und Snapshot-Tests zu integrieren ist. Es hat Leute gegeben, die Jest erfolgreich dazu gebracht haben, mit Webpack zu arbeiten, aber das ist, indem sie ausdrücklich das CSS überspringen.

Das Ausführen einer babel-jest Präprozessordatei, wie in dieser SO-Antwort beschrieben, scheint ein so schlechter Hack zu sein.

Es scheint externes CSS als with-global- stylesheet zu erhalten, Sie müssen Webpack verwenden, aber um Jest zu verwenden, können Sie sich nicht auf Webpack verlassen, sondern nur auf Babel.

Hat jemand Ideen in diesem Bereich?

ich stehe vor einem ähnlichen Problem. Ich bin neu bei nextjs und kann das Beispiel "with-external-scoped-css" nicht richtig zum Laufen bringen. Manchmal wird meine CSS geladen und manchmal nicht. Ich weiß nicht, ob es das gleiche Problem ist, von dem du redest.

https://github.com/zeit/next.js/issues/3276

Probleme mit externen Stilen mit diesem Loader behoben https://github.com/coox/styled-jsx-css-loader

@ilionic Ich habe deine Lösung überprüft. Es ist großartig! Dankeschön :)

@arefaslani Ich glaube nicht, dass dieses Problem geschlossen ist.

Ab HTTP v1 ist es immer noch eine schreckliche Leistungssteuer für das Laden von Tonnen von CSS, es verlängert die Zeit bis zum ersten Zeichnen dramatisch.

Die richtige Unterstützung für externe Stile würde das Importieren von CSS ermöglichen und zu a . führen kein Inline