CSS モジュール
サンプル
Next.jsは以下の種類のスタイルシートをサポートしています:
CSSモジュール
Next.jsは.module.css
拡張子を使用したCSSモジュールを組み込みでサポートしています。
CSSモジュールは、自動的に一意のクラス名を生成することでCSSをローカルスコープ化します。これにより、異なるファイルで同じクラス名を使用しても衝突を心配する必要がありません。この動作により、CSSモジュールはコンポーネントレベルのCSSを含める理想的な方法となっています。
例
例えば、components/
フォルダ内の再利用可能なButton
コンポーネントを考えてみましょう:
まず、components/Button.module.css
を作成し、以下の内容を記述します:
/*
他の`.css`や`.module.css`ファイルと`.error {}`が衝突する心配はありません!
*/
.error {
color: white;
background-color: red;
}
次に、components/Button.js
を作成し、上記のCSSファイルをインポートして使用します:
import styles from './Button.module.css'
export function Button() {
return (
<button
type="button"
// インポートした`styles`オブジェクトのプロパティとして"error"クラスにアクセスしていることに注意
className={styles.error}
>
Destroy
</button>
)
}
CSSモジュールは .module.css
と.module.sass
拡張子のファイルに対してのみ有効 です。
本番環境では、すべてのCSSモジュールファイルは自動的に 多くの最小化されコード分割された .css
ファイルに結合されます。
これらの.css
ファイルはアプリケーション内のホットな実行パスを表しており、アプリケーションの描画に必要な最小限のCSSが読み込まれることを保証します。
グローバルスタイル
アプリケーションにスタイルシートを追加するには、pages/_app.js
内で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;
}
まだ存在しない場合は、pages/_app.js
ファイルを作成してください。
そして、styles.css
ファイルをimport
します。
import '../styles.css'
// このデフォルトエクスポートは新しい`pages/_app.js`ファイルで必要です。
export default function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
これらのスタイル(styles.css
)はアプリケーションのすべてのページとコンポーネントに適用されます。
スタイルシートのグローバルな性質と衝突を避けるため、スタイルシートはpages/_app.js
内でのみインポートできます。
開発環境では、この方法でスタイルシートを表現することで、編集時にスタイルをホットリロードできます。つまり、アプリケーションの状態を保持しながらスタイルを変更できます。
本番環境では、すべてのCSSファイルは自動的に1つの最小化された.css
ファイルに結合されます。CSSが結合される順序は、_app.js
ファイルにCSSがインポートされた順序と一致します。独自のCSSを含むインポートされたJSモジュールに特に注意してください。JSモジュールのCSSは、インポートされたCSSファイルと同じ順序規則に従って結合されます。例えば:
import '../styles.css'
// ErrorBoundaryのCSSはstyles.cssのグローバルCSSに依存しているため、
// styles.cssの後にインポートします。
import ErrorBoundary from '../components/ErrorBoundary'
export default function MyApp({ Component, pageProps }) {
return (
<ErrorBoundary>
<Component {...pageProps} />
</ErrorBoundary>
)
}
外部スタイルシート
Next.jsではJavaScriptファイルからCSSファイルをインポートできます。
これはNext.jsがimport
の概念をJavaScriptを超えて拡張しているため可能です。
node_modules
からスタイルをインポート
Next.js 9.5.4以降、node_modules
からのCSSファイルのインポートがアプリケーションのどこでも許可されています。
bootstrap
やnprogress
のようなグローバルスタイルシートの場合、pages/_app.js
内でファイルをインポートする必要があります。例えば:
import 'bootstrap/dist/css/bootstrap.css'
export default function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
サードパーティコンポーネントに必要なCSSをインポートする場合、コンポーネント内で行えます。例えば:
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}>Open Dialog</button>
<Dialog isOpen={showDialog} onDismiss={close}>
<button className="close-button" onClick={close}>
<VisuallyHidden>Close</VisuallyHidden>
<span aria-hidden>×</span>
</button>
<p>Hello there. I am a dialog</p>
</Dialog>
</div>
)
}
追加機能
Next.jsにはスタイルの追加体験を向上させるための追加機能が含まれています:
next dev
でローカル実行する場合、ローカルスタイルシート(グローバルまたはCSSモジュール)はFast Refreshを活用し、編集が保存されると即座に変更が反映されます。next build
で本番ビルドする場合、CSSファイルはスタイルを取得するために必要なネットワークリクエストの数を減らすために、より少ない最小化された.css
ファイルにバンドルされます。- JavaScriptを無効にしても、本番ビルド(
next start
)ではスタイルが読み込まれます。ただし、next dev
でFast Refreshを有効にするにはJavaScriptが必要です。