CSS Modules

Beispiele

Next.js bietet integrierte Unterstützung für CSS Modules durch die Verwendung der Dateiendung .module.css.

CSS Modules begrenzen CSS lokal, indem automatisch ein eindeutiger Klassenname erstellt wird. Dadurch können Sie denselben Klassennamen in verschiedenen Dateien verwenden, ohne Kollisionen befürchten zu müssen. Dieses Verhalten macht CSS Modules zur idealen Methode für komponentenspezifisches CSS.

Beispiel

Betrachten Sie beispielsweise eine wiederverwendbare Button-Komponente im components/-Ordner:

Erstellen Sie zunächst components/Button.module.css mit folgendem Inhalt:

Button.module.css
/*
Sie müssen sich keine Sorgen machen, dass .error {} mit anderen `.css`- oder
`.module.css`-Dateien kollidiert!
*/
.error {
  color: white;
  background-color: red;
}

Erstellen Sie dann components/Button.js, importieren Sie die obige CSS-Datei und verwenden Sie sie:

components/Button.js
import styles from './Button.module.css'

export function Button() {
  return (
    <button
      type="button"
      // Beachten Sie, wie die "error"-Klasse als Eigenschaft des importierten
      // `styles`-Objekts aufgerufen wird.
      className={styles.error}
    >
      Zerstören
    </button>
  )
}

CSS Modules sind eine optionale Funktion und werden nur für Dateien mit der Endung .module.css aktiviert. Reguläre <link>-Stylesheets und globale CSS-Dateien werden weiterhin unterstützt.

In der Produktion werden alle CSS Module-Dateien automatisch in mehrere minimierte und code-aufgeteilte .css-Dateien zusammengeführt. Diese .css-Dateien repräsentieren wichtige Ausführungspfade in Ihrer Anwendung und stellen sicher, dass nur die minimal benötigte Menge an CSS geladen wird, um Ihre Anwendung darzustellen.

Globale Styles

Um ein Stylesheet zu Ihrer Anwendung hinzuzufügen, importieren Sie die CSS-Datei in pages/_app.js.

Betrachten Sie beispielsweise das folgende Stylesheet namens styles.css:

styles.css
body {
  font-family: 'SF Pro Text', 'SF Pro Icons', 'Helvetica Neue', 'Helvetica',
    'Arial', sans-serif;
  padding: 20px 20px 60px;
  max-width: 680px;
  margin: 0 auto;
}

Erstellen Sie eine pages/_app.js-Datei, falls noch nicht vorhanden. Importieren Sie dann die styles.css-Datei mit import.

pages/_app.js
import '../styles.css'

// Dieser Standardexport ist in einer neuen `pages/_app.js`-Datei erforderlich.
export default function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />
}

Diese Styles (styles.css) gelten für alle Seiten und Komponenten in Ihrer Anwendung. Aufgrund des globalen Charakters von Stylesheets und um Konflikte zu vermeiden, dürfen Sie sie nur innerhalb von pages/_app.js importieren.

In der Entwicklung ermöglicht diese Art der Stylesheet-Definition ein Hot Reloading der Styles während der Bearbeitung – d.h., Sie können den Anwendungszustand beibehalten.

In der Produktion werden alle CSS-Dateien automatisch in eine einzige minimierte .css-Datei zusammengeführt. Die Reihenfolge der Zusammenführung entspricht der Reihenfolge, in der die CSS-Dateien in _app.js importiert wurden. Achten Sie besonders auf importierte JS-Module, die eigenes CSS enthalten; das CSS des JS-Moduls wird nach denselben Regeln wie importierte CSS-Dateien zusammengeführt. Beispiel:

import '../styles.css'
// Das CSS in ErrorBoundary hängt vom globalen CSS in styles.css ab,
// daher importieren wir es nach styles.css.
import ErrorBoundary from '../components/ErrorBoundary'

export default function MyApp({ Component, pageProps }) {
  return (
    <ErrorBoundary>
      <Component {...pageProps} />
    </ErrorBoundary>
  )
}

Externe Stylesheets

Next.js ermöglicht das Importieren von CSS-Dateien aus einer JavaScript-Datei. Dies ist möglich, weil Next.js das Konzept von import über JavaScript hinaus erweitert.

Importieren von Styles aus node_modules

Seit Next.js 9.5.4 ist das Importieren einer CSS-Datei aus node_modules überall in Ihrer Anwendung erlaubt.

Für globale Stylesheets wie bootstrap oder nprogress sollten Sie die Datei in pages/_app.js importieren. Beispiel:

pages/_app.js
import 'bootstrap/dist/css/bootstrap.css'

export default function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />
}

Für das Importieren von CSS, das von einer Drittanbieter-Komponente benötigt wird, können Sie dies in Ihrer Komponente tun. Beispiel:

components/example-dialog.js
import { useState } from 'react'
import { Dialog } from '@reach/dialog'
import VisuallyHidden from '@reach/visually-hidden'
import '@reach/dialog/styles.css'

function ExampleDialog(props) {
  const [showDialog, setShowDialog] = useState(false)
  const open = () => setShowDialog(true)
  const close = () => setShowDialog(false)

  return (
    <div>
      <button onClick={open}>Dialog öffnen</button>
      <Dialog isOpen={showDialog} onDismiss={close}>
        <button className="close-button" onClick={close}>
          <VisuallyHidden>Schließen</VisuallyHidden>
          <span aria-hidden>×</span>
        </button>
        <p>Hallo. Ich bin ein Dialog</p>
      </Dialog>
    </div>
  )
}

Zusätzliche Funktionen

Next.js enthält zusätzliche Funktionen, um das Erstellen von Styles zu verbessern:

  • Bei lokaler Ausführung mit next dev nutzen lokale Stylesheets (egal ob global oder CSS Modules) Fast Refresh, um Änderungen sofort nach dem Speichern zu übernehmen.
  • Beim Erstellen für die Produktion mit next build werden CSS-Dateien in weniger minimierte .css-Dateien gebündelt, um die Anzahl der Netzwerkanfragen für das Laden der Styles zu reduzieren.
  • Wenn JavaScript deaktiviert ist, werden Styles in der Produktionsversion (next start) trotzdem geladen. Für next dev ist jedoch weiterhin JavaScript erforderlich, um Fast Refresh zu ermöglichen.