Next.js 应用程序中使用 CSS:新手指南

2025-03-20 11:44 更新

如何在应用程序中使用 CSS

Next.js 提供了多种在应用程序中使用 CSS 的方法,包括:

[toc]

  • CSS 模块
  • 全局 CSS
  • Tailwind CSS
  • Sass
  • CSS-in-JS
  • 外部样式表

本页将指导你如何使用这些方法。

CSS 模块

CSS 模块通过生成唯一的类名来局部作用域 CSS。这允许你在不同文件中使用相同的类,而不用担心冲突。

要开始使用 CSS 模块,创建一个扩展名为 .module.css 的新文件,并将其导入到 app 目录中的任何组件中:

  1. .blog {
  2. padding: 24px;
  3. }

  1. import styles from './styles.module.css'
  2. export default function Page({ children }: { children: React.ReactNode }) {
  3. return <main className={styles.blog}>{children}</main>
  4. }

全局 CSS

你可以使用全局 CSS 在整个应用程序中应用样式。

要使用全局样式,创建一个新 CSS 文件,例如 app/global.css

  1. body {
  2. padding: 20px 20px 60px;
  3. max-width: 680px;
  4. margin: 0 auto;
  5. }

在根布局(app/layout.js)中导入该文件,以将样式应用于应用程序中的每个路由

  1. // 这些样式适用于应用程序中的每个路由
  2. import './global.css'
  3. export default function RootLayout({
  4. children,
  5. }: {
  6. children: React.ReactNode
  7. }) {
  8. return (
  9. <html lang="zh">
  10. <body>{children}</body>
  11. </html>
  12. )
  13. }

小贴士:全局样式可以导入到 app 目录中的任何布局、页面或组件中。但是,由于 Next.js 使用 React 内置的样式表支持与 Suspense 集成,这种内置支持目前在你导航到不同路由时不会移除样式表。因此,我们建议将全局样式用于真正全局的 CSS,而将 CSS 模块用于作用域 CSS。

Tailwind CSS

Tailwind CSS 是一个以实用程序为主的 CSS 框架,与 Next.js 无缝集成。

安装 Tailwind

要开始使用 Tailwind,安装必要的 Tailwind CSS 包:

  1. npm install -D tailwindcss @tailwindcss/postcss postcss

配置 Tailwind

在项目的根目录中创建一个 postcss.config.mjs 文件,并将 @tailwindcss/postcss 插件添加到你的 PostCSS 配置中:

  1. /** @type {import('tailwindcss').Config} */
  2. export default {
  3. plugins: {
  4. '@tailwindcss/postcss': {},
  5. },
  6. }

使用 Tailwind

Tailwind 指令添加到你的全局样式表中:

然后,在根布局中导入样式:

  1. import type { Metadata } from 'next'
  2. // 这些样式适用于应用程序中的每个路由
  3. import './globals.css'
  4. export const metadata: Metadata = {
  5. title: '创建 Next App | 编程狮(w3cschool.cn)',
  6. description: '由 create next app 生成',
  7. }
  8. export default function RootLayout({
  9. children,
  10. }: {
  11. children: React.ReactNode
  12. }) {
  13. return (
  14. <html lang="zh">
  15. <body>{children}</body>
  16. </html>
  17. )
  18. }

最后,你可以在应用程序中开始编写 Tailwind 的实用程序类。

  1. export default function Page() {
  2. return <h1 className="text-3xl font-bold underline">Hello, W3Cschool!</h1>
  3. }

Sass

Next.js 使用 .scss.sass 扩展名和语法与 Sass 集成。

你还可以通过 CSS 模块和 .module.scss.module.sass 扩展名使用组件级 Sass。

安装 Sass

要开始使用 Sass,安装 sass 包:

  1. npm install --save-dev sass

自定义 Sass 选项

如果你想配置 Sass 选项,请在 next.config.js 中使用 sassOptions 选项。

  1. import type { NextConfig } from 'next'
  2. const nextConfig: NextConfig = {
  3. sassOptions: {
  4. additionalData: `$var: red;`,
  5. },
  6. }
  7. export default nextConfig

CSS-in-JS

警告:需要运行时 JavaScript 的 CSS-in-JS 库目前不支持在 React 服务器组件中使用。在使用 CSS-in-JS 时,需要库作者支持 React 的最新版本,例如服务器组件和流式传输。

以下库在 app 目录的客户端组件中受支持(按字母顺序排列):

以下库目前正在进行支持工作:

如果你想为服务器组件添加样式,我们建议使用 CSS 模块或输出 CSS 文件的其他解决方案,例如 Tailwind CSS

配置 CSS-in-JS

要配置 CSS-in-JS,你需要:

  1. 创建一个样式注册表来收集渲染中的所有 CSS 规则。
  2. 使用 useServerInsertedHTML 钩子在可能使用它们的内容之前注入规则。
  3. 创建一个客户端组件,在初始服务器端渲染期间用样式注册表包裹你的应用。

styled-jsx

要为你的应用程序配置 styled-jsx,创建一个新的注册表:

  1. 'use client'
  2. import React, { useState } from 'react'
  3. import { useServerInsertedHTML } from 'next/navigation'
  4. import { StyleRegistry, createStyleRegistry } from 'styled-jsx'
  5. export default function StyledJsxRegistry({
  6. children,
  7. }: {
  8. children: React.ReactNode
  9. }) {
  10. // 只在初始状态下创建一次样式表
  11. const [jsxStyleRegistry] = useState(() => createStyleRegistry())
  12. useServerInsertedHTML(() => {
  13. const styles = jsxStyleRegistry.styles()
  14. jsxStyleRegistry.flush()
  15. return <>{styles}</>
  16. })
  17. return <StyleRegistry registry={jsxStyleRegistry}>{children}</StyleRegistry>
  18. }

然后,在根布局中用注册表包裹:

  1. import StyledJsxRegistry from './registry'
  2. export default function RootLayout({
  3. children,
  4. }: {
  5. children: React.ReactNode
  6. }) {
  7. return (
  8. <html>
  9. <body>
  10. <StyledJsxRegistry>{children}</StyledJsxRegistry>
  11. </body>
  12. </html>
  13. )
  14. }

styled-components

要使用 styled-components,在 next.config.js 中启用它:

  1. import type { NextConfig } from 'next'
  2. const nextConfig: NextConfig = {
  3. compiler: {
  4. styledComponents: true,
  5. },
  6. }
  7. export default nextConfig

然后,使用 styled-components API 创建一个全局注册表组件来收集渲染期间生成的所有 CSS 样式规则,以及一个函数来返回这些规则。然后使用 useServerInsertedHTML 钩子将注册表中收集的样式注入到根布局的 <head> HTML 标签中。

  1. 'use client'
  2. import React, { useState } from 'react'
  3. import { useServerInsertedHTML } from 'next/navigation'
  4. import { ServerStyleSheet, StyleSheetManager } from 'styled-components'
  5. export default function StyledComponentsRegistry({
  6. children,
  7. }: {
  8. children: React.ReactNode
  9. }) {
  10. // 只在初始状态下创建一次样式表
  11. const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())
  12. useServerInsertedHTML(() => {
  13. const styles = styledComponentsStyleSheet.getStyleElement()
  14. styledComponentsStyleSheet.instance.clearTag()
  15. return <>{styles}</>
  16. })
  17. if (typeof window !== 'undefined') return <>{children}</>
  18. return (
  19. <StyleSheetManager sheet={styledComponentsStyleSheet.instance}>
  20. {children}
  21. </StyleSheetManager>
  22. )
  23. }

用样式注册表组件包裹根布局的 children

  1. import StyledComponentsRegistry from './lib/registry'
  2. export default function RootLayout({
  3. children,
  4. }: {
  5. children: React.ReactNode
  6. }) {
  7. return (
  8. <html>
  9. <body>
  10. <StyledComponentsRegistry>{children}</StyledComponentsRegistry>
  11. </body>
  12. </html>
  13. )
  14. }

外部样式表

由外部包发布的样式表可以导入到 app 目录中的任何位置,包括共置组件:

  1. import 'bootstrap/dist/css/bootstrap.css'
  2. export default function RootLayout({
  3. children,
  4. }: {
  5. children: React.ReactNode
  6. }) {
  7. return (
  8. <html lang="zh">
  9. <body className="container">{children}</body>
  10. </html>
  11. )
  12. }

外部样式表必须直接从 npm 包导入或下载并与你的代码库共置。你不能使用 <link rel="stylesheet" />

API 参考

阅读 API 参考 ,了解有关本页中提到的功能的更多信息。

  • sass选项
    配置 Sass 选项。

  • Next.js 编译器
    Next.js Compiler,用 Rust 编写,用于转换和缩小 Next.js 应用程序。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号