跳到內容

CSS

Next.js 提供了多種使用 CSS 為應用程式設定樣式的方法,包括:

Tailwind CSS

Tailwind CSS 是一個實用優先的 CSS 框架,它提供了低級別的實用類來構建自定義設計。

安裝 Tailwind CSS

終端
pnpm add -D tailwindcss @tailwindcss/postcss

將 PostCSS 外掛新增到您的 postcss.config.mjs 檔案中

postcss.config.mjs
export default {
  plugins: {
    '@tailwindcss/postcss': {},
  },
}

在您的全域性 CSS 檔案中匯入 Tailwind

app/globals.css
@import 'tailwindcss';

在您的根佈局中匯入 CSS 檔案

app/layout.tsx
import './globals.css'
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  )
}

現在您可以在應用程式中開始使用 Tailwind 的實用類了

app/page.tsx
export default function Page() {
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <h1 className="text-4xl font-bold">Welcome to Next.js!</h1>
    </main>
  )
}

須知: 如果您需要更廣泛的舊版瀏覽器支援,請參閱 Tailwind CSS v3 設定說明

CSS 模組

CSS 模組透過生成唯一的類名來區域性作用 CSS。這允許您在不同的檔案中使用相同的類,而無需擔心命名衝突。

要開始使用 CSS 模組,請建立一個副檔名為 .module.css 的新檔案,並將其匯入到 `app` 目錄中的任何元件中

app/blog/blog.module.css
.blog {
  padding: 24px;
}
app/blog/page.tsx
import styles from './blog.module.css'
 
export default function Page() {
  return <main className={styles.blog}></main>
}

全域性 CSS

您可以使用全域性 CSS 在整個應用程式中應用樣式。

建立一個 app/global.css 檔案,並在根佈局中匯入它,將樣式應用於應用程式中的所有路由

app/global.css
body {
  padding: 20px 20px 60px;
  max-width: 680px;
  margin: 0 auto;
}
app/layout.tsx
// These styles apply to every route in the application
import './global.css'
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  )
}

須知: 全域性樣式可以匯入到 `app` 目錄中的任何佈局、頁面或元件中。然而,由於 Next.js 使用 React 內建的樣式表支援與 Suspense 整合,這目前不會在您導航路由時移除樣式表,這可能導致衝突。我們建議將全域性樣式用於真正的全域性 CSS(如 Tailwind 的基礎樣式),將 Tailwind CSS 用於元件樣式,並在需要時將 CSS 模組 用於自定義作用域 CSS。

外部樣式表

外部包釋出的樣式表可以匯入到 `app` 目錄的任何位置,包括協同定位的元件

app/layout.tsx
import 'bootstrap/dist/css/bootstrap.css'
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body className="container">{children}</body>
    </html>
  )
}

須知: 在 React 19 中,也可以使用 <link rel="stylesheet" href="..." />。有關更多資訊,請參閱 React link 文件

排序和合並

Next.js 在生產構建期間透過自動分塊(合併)樣式表來最佳化 CSS。CSS 的順序取決於您在程式碼中匯入樣式的順序

例如,base-button.module.css 將在 page.module.css 之前排序,因為 <BaseButton>page.module.css 之前匯入

page.tsx
import { BaseButton } from './base-button'
import styles from './page.module.css'
 
export default function Page() {
  return <BaseButton className={styles.primary} />
}
base-button.tsx
import styles from './base-button.module.css'
 
export function BaseButton() {
  return <button className={styles.primary} />
}

建議

為了保持 CSS 順序可預測

  • 嘗試將 CSS 匯入限制在單個 JavaScript 或 TypeScript 入口檔案。
  • 在應用程式的根目錄中匯入全域性樣式和 Tailwind 樣式表。
  • 使用 Tailwind CSS 來滿足大多數樣式需求,因為它涵蓋了常用的設計模式和實用類。
  • 當 Tailwind 實用程式不足時,使用 CSS 模組來設定元件特定的樣式。
  • 為您的 CSS 模組使用一致的命名約定。例如,使用 <name>.module.css 而不是 <name>.tsx
  • 將共享樣式提取到共享元件中,以避免重複匯入。
  • 關閉自動排序匯入的 linter 或格式化工具,例如 ESLint 的 sort-imports
  • 您可以在 next.config.js 中使用 cssChunking 選項來控制 CSS 的分塊方式。

開發與生產

  • 在開發模式(next dev)下,CSS 更新會透過 快速重新整理 即時生效。
  • 在生產模式(next build)下,所有 CSS 檔案都會自動連線成許多經過壓縮和程式碼分割.css 檔案,確保為路由載入最小量的 CSS。
  • 在生產環境中,即使停用 JavaScript,CSS 也會載入,但在開發環境中,快速重新整理需要 JavaScript。
  • CSS 排序在開發環境中可能表現不同,請始終檢查構建(next build)以驗證最終的 CSS 順序。