樣式設計
Next.js 對樣式不強制單一做法,三種主流方案可以視專案規模混搭使用:全域 CSS 管全站共用樣式、CSS Modules 管單一元件的局部樣式、Tailwind CSS 用 utility class 快速堆疊樣式。這一頁介紹三種做法怎麼用,以及字型最佳化。
全域 CSS
在根 Layout 匯入一份全域樣式表,套用到整個網站:
import "./globals.css";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="zh-Hant">
<body>{children}</body>
</html>
);
}
全域 CSS 只能在根 Layout 匯入一次,適合放 CSS Reset、字型、色彩變數這類全站共用的規則;不適合放特定元件的樣式,否則規模一大就容易互相覆蓋、難以維護。
CSS Modules
檔名以 .module.css 結尾的樣式表,class 名稱會在建置時自動加上唯一雜湊值,天生局部作用域,不會跟其他元件的同名 class 衝突:
.card {
border: 1px solid #e5e5e5;
border-radius: 8px;
padding: 1rem;
}
import styles from "./Card.module.css";
export default function Card({ children }: { children: React.ReactNode }) {
return <div className={styles.card}>{children}</div>;
}
CSS Modules 適合團隊已經熟悉寫原生 CSS、又想要元件層級的樣式隔離的專案。
Tailwind CSS
Tailwind 用大量預先定義好的 utility class 直接寫在 JSX 上,不用另外切換檔案:
export default function Card({ children }: { children: React.ReactNode }) {
return (
<div className="rounded-lg border border-gray-200 p-4 shadow-sm">
{children}
</div>
);
}
Tailwind 的優點是不用一直切換檔案、也不用煩惱命名,樣式跟結構寫在同一個地方;缺點是 JSX 裡 class 會變長,習慣之後大多數團隊反而覺得更容易維護。已存在的專案也可以照 Tailwind 官方 Next.js 安裝指南 手動加裝。
字型最佳化
Next.js 內建 next/font,會在建置時自動下載並自我託管字型檔案(包含 Google Fonts),避免瀏覽器另外對外發送請求,同時消除字型載入造成的版面跳動:
import { Noto_Sans_TC } from "next/font/google";
const notoSansTC = Noto_Sans_TC({
subsets: ["latin"],
weight: ["400", "700"],
});
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="zh-Hant" className={notoSansTC.className}>
<body>{children}</body>
</html>
);
}
推薦影音
四種樣式寫法一次看懂
簡述:這支影片依序示範全域 CSS、CSS Modules、Tailwind CSS 與行內樣式在 Next.js 專案裡的實際寫法與差異,適合還在猶豫該選哪一種方案時參考。
下一步
畫面做好之後,接著看如何在同一個專案裡寫後端 API,詳見 Route Handlers(API 路由)。