CSS
Next.jsは、CSSを扱うための複数の方法をサポートしています:
CSS Modules
Next.jsは、.module.css
拡張子を使用したCSS Modulesをネイティブでサポートしています。
CSS Modulesは、ユニークなクラス名を自動的に作成することでCSSをローカルにスコープします。これにより、異なるファイルで同じクラス名を使用しても衝突を心配する必要がありません。この動作により、CSS ModulesはコンポーネントレベルのCSSを含めるための理想的な方法となります。
例
CSS Modulesは、app
ディレクトリ内の任意のファイルにインポートできます:
- TypeScript
- JavaScript
import styles from './styles.module.css'
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return <section className={styles.dashboard}>{children}</section>
}
import styles from './styles.module.css'
export default function DashboardLayout({ children }) {
return <section className={styles.dashboard}>{children}</section>
}
.dashboard {
padding: 24px;
}
CSS Modulesは、.module.css
および.module.sass
拡張子を持つファイルに対してのみ有効です。
本番環境では、すべてのCSS Moduleファイルは自動的に多くの最小化されたコード分割された.css
ファイルに連結されます。
これらの.css
ファイルは、アプリケーションのホット実行パスを表し、アプリケーションを描画するために必要な最小限のCSSがロードされることを保証します。
グローバルスタイル
グローバルスタイルは、app
ディレクトリ内の任意のレイアウト、ページ、またはコンポーネントにインポートできます。
Good to know:
- これは
pages
ディレクトリとは異なり、グローバルスタイルは_app.js
ファイル内でのみインポートできます。- Next.jsは、実際にグローバルでない限り、グローバルスタイルの使用をサポートしていません。つまり、すべてのページに適用でき、アプリケーションのライフタイムにわたって存在できる必要があります。これは、Next.jsがReactの組み込みスタイルシートサポートを使用してSuspenseと統合するためです。この組み込みサポートは、ルート間を移動する際にスタイルシートを削除しません。このため、グローバルスタイルよりもCSS Modulesの使用をお勧めします。
例えば、app/global.css
という名前のスタイルシートを考えてみましょう:
body {
padding: 20px 20px 60px;
max-width: 680px;
margin: 0 auto;
}
root レイアウト(app/layout.js
)内で、global.css
スタイルシートをインポートして、アプリケーション内のすべてのルートにスタイルを適用します:
- TypeScript
- JavaScript
// これらのスタイルはアプリケーション内のすべてのルートに適用されます
import './global.css'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
// これらのスタイルはアプリケーション内のすべてのルートに適用されます
import './global.css'
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
外部スタイルシート
外部パッケージによって公開されたスタイルシートは、app
ディレクトリ内のどこにでも、コロケートされたコンポーネントを含めてインポートできます:
- TypeScript
- JavaScript
import 'bootstrap/dist/css/bootstrap.css'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body className="container">{children}</body>
</html>
)
}
import 'bootstrap/dist/css/bootstrap.css'
export default function RootLayout({ children }) {
return (
<html lang="en">
<body className="container">{children}</body>
</html>
)
}
Good to know: 外部スタイルシートは、npmパッケージから直接インポートするか、コードベースと一緒にダウンロードしてコロケートする必要があります。
<link rel="stylesheet" />
を使用することはできません。
順序とマージ
Next.jsは、プロダクションビルド中にスタイルシートを自動的にチャンク(マージ)することでCSSを最適化します。CSSの順序は、アプリケーションコードにスタイルシートをインポートする順序によって決定されます。
例えば、<BaseButton>
が<Page>
で最初にインポートされるため、base-button.module.css
はpage.module.css
の前に順序付けされます:
- TypeScript
- JavaScript
import styles from './base-button.module.css'
export function BaseButton() {
return <button className={styles.primary} />
}
import styles from './base-button.module.css'
export function BaseButton() {
return <button className={styles.primary} />
}
- TypeScript
- JavaScript
import { BaseButton } from './base-button'
import styles from './page.module.css'
export default function Page() {
return <BaseButton className={styles.primary} />
}
import { BaseButton } from './base-button'
import styles from './page.module.css'
export default function Page() {
return <BaseButton className={styles.primary} />
}
予測可能な順序を維持するために、次のことをお勧めします:
- CSSファイルを単一のJS/TSファイルにのみインポートします。
- グローバルクラス名を使用する場合、適用したい順序で同じファイルにグローバルスタイルをインポートします。
- グローバルスタイルよりもCSS Modulesを優先します。
- CSSモジュールの命名規約を一貫して使用します。例えば、
<name>.tsx
よりも<name>.module.css
を使用します。
- CSSモジュールの命名規約を一貫して使用します。例えば、
- 共有スタイルを別の共有コンポーネントに抽出します。
- Tailwindを使用する場合、スタイルシートをファイルの先頭、できればRoot Layoutでインポートします。
- インポートを自動的にソートするリンター/フォーマッター(例:ESLintの
sort-import
)をオフにします。これは、CSSのインポート順序が重要であるため、意図せずにCSSに影響を与える可能性があります。
Good to know:
- CSSの順序は開発モードで異なる動作をすることがあります。最終的なCSSの順序を確認するためにビルド(
next build
)を常に確認してください。next.config.js
のcssChunking
オプションを使用して、CSSのチャンク方法を制御できます。
追加機能
Next.jsは、スタイルの追加体験を向上させるための追加機能を含んでいます:
next dev
をローカルで実行しているとき、ローカルスタイルシート(グローバルまたはCSS Modulesのいずれか)は、Fast Refreshを利用して、編集が保存されるとすぐに変更を反映します。next build
でプロダクション用にビルドするとき、CSSファイルは、スタイルを取得するために必要なネットワークリクエストの数を減らすために、より少ない最小化された.css
ファイルにバンドルされます。- JavaScriptを無効にした場合でも、スタイルはプロダクションビルド(
next start
)でロードされます。ただし、next dev
でFast Refreshを有効にするには、JavaScriptが必要です。