当前位置: 首页 > news >正文

Next.js 学习笔记(七)——样式

样式

Next.js 支持不同的应用程序样式设计方法,包括:

  • 全局 CSS:对于有传统 CSS 使用经验的人来说,使用简单且熟悉,但随着应用程序的增长,可能会导致 CSS 包过大,难以管理样式。
  • CSS 模块:创建本地范围的 CSS 类,以避免命名冲突并提高可维护性。
  • Tailwind CSS:实用工具优先的 CSS 框架,可通过组合实用工具类快速实现自定义设计。
  • Sass:一种流行的 CSS 预处理器,可通过变量、嵌套规则和混合体等功能扩展 CSS。
  • CSS-in-JS:直接在 JavaScript 组件中嵌入 CSS,实现动态和范围样式化。

CSS 模块

Next.js 内置支持使用 .module.css 扩展名的 CSS 模块。

CSS 模块通过自动创建唯一的类名来本地化 CSS 范围。这样,你就可以在不同的文件中使用相同的类名,而不必担心冲突。这种行为使 CSS 模块成为包含组件级 CSS 的理想方式。

示例

CSS 模块可以导入 app 目录下的任何文件:

// app/dashboard/layout.tsximport styles from './styles.module.css'export default function DashboardLayout({children,
}: {children: React.ReactNode
}) {return <section className={styles.dashboard}>{children}</section>
}
// app/dashboard/styles.module.css.dashboard {padding: 24px;
}

CSS 模块是一项可选功能,仅适用于扩展名为 .module.css 的文件。仍支持常规 <link> 样式表和全局 CSS 文件。

在生产过程中,所有 CSS 模块文件都将自动串联成许多经过精简和代码拆分.css 文件。这些 .css 文件代表应用程序中的热执行路径,可确保加载的 CSS 量最少,以便应用程序绘制。

全局样式

全局样式可导入 app 目录中的任何布局、页面或组件。

需要知道:这与 pages 目录不同,后者只能在 _app.js 文件中导入全局样式。

例如,请看名为 app/global.css 的样式表:

body {padding: 20px 20px 60px;max-width: 680px;margin: 0 auto;
}

在根布局(app/layout.js)中,导入 global.css 样式表可将样式应用到应用程序中的每个路由:

// app/layout.tsx// 这些样式应用于应用程序中的每个路由
import './global.css'export default function RootLayout({children,
}: {children: React.ReactNode
}) {return (<html lang="en"><body>{children}</body></html>)
}

外部样式表

第三方包发布的样式表可以导入 app 目录中的任何位置,包括共用组件:

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

需要知道:外部样式表必须直接从 npm 包导入,或下载并与代码库放在一起。不能使用 <link rel="stylesheet" />

附加功能

Next.js 包含一些附加功能,可提升添加样式的编写体验:

  • 使用 next dev 在本地运行时,本地样式表(全局或 CSS 模块)将利用快速刷新功能,在编辑保存时即时反映更改。
  • 使用 next build 为生产版本构建时,CSS 文件将被捆绑到更少的 .css 文件中,以减少检索样式所需的网络请求数量。
  • 如果禁用 JavaScript,样式仍会在生产构建(next start)中加载。不过,next dev 仍需要 JavaScript 才能启用快速刷新。

Tailwind CSS

Tailwind CSS 是一个实用优先的 CSS 框架,与 Next.js 配合使用效果极佳。

安装 Tailwind

安装 Tailwind CSS 包,运行 init 命令生成 tailwind.config.jspostcss.config.js 文件:

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

配置 Tailwind

tailwind.config.js 中,为将使用 Tailwind CSS 类名的文件添加路径:

// tailwind.config.js/** @type {import('tailwindcss').Config} */
module.exports = {content: ['./app/**/*.{js,ts,jsx,tsx,mdx}', // Note the addition of the `app` directory.'./pages/**/*.{js,ts,jsx,tsx,mdx}','./components/**/*.{js,ts,jsx,tsx,mdx}',// Or if using `src` directory:'./src/**/*.{js,ts,jsx,tsx,mdx}',],theme: {extend: {},},plugins: [],
}

你无需修改 postcss.config.js

导入样式

添加 Tailwind CSS 指令,Tailwind 会使用这些指令将生成的样式注入到应用程序中的全局样式表中,例如:

/* app/globals.css */@tailwind base;
@tailwind components;
@tailwind utilities;

在根布局(app/layout.tsx)中,导入 globals.css 样式表,以便将样式应用到应用程序中的每个路由。

// app/layout.tsximport type { Metadata } from 'next'// 这些样式适用于应用程序中的每个路由
import './globals.css'export const metadata: Metadata = {title: 'Create Next App',description: 'Generated by create next app',
}export default function RootLayout({children,
}: {children: React.ReactNode
}) {return (<html lang="en"><body>{children}</body></html>)
}

使用类

安装 Tailwind CSS 并添加全局样式后,你就可以在应用程序中使用 Tailwind 的实用类。

// app/page.tsxexport default function Page() {return <h1 className="text-3xl font-bold underline">Hello, Next.js!</h1>
}

使用 Turbopack

从 Next.js 13.1 开始,Turbopack 支持 Tailwind CSS 和 PostCSS。

CSS-in-JS

警告:服务器组件目前不支持需要运行时 JavaScript 的 CSS-in-JS 库。将 CSS-in-JS 与较新的 React 功能(例如:服务器组件和流式传输)一起使用,需要库作者支持最新版本的 React,包括并发渲染。

我们正与 React 团队合作开发上游 API,以处理 CSS 和 JavaScript 静态资源,并支持 React 服务器组件和流架构。

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

  • chakra-ui
  • kuma-ui
  • @mui/material
  • pandacss
  • styled-jsx
  • styled-components
  • style9
  • tamagui
  • tss-react
  • vanilla-extract

目前正在为以下组件提供支持:

  • emotion

需要知道:我们正在测试不同的 CSS-in-JS 库,并将为支持 React 18 功能和(或)app 目录的库添加更多示例。

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

app 中配置 CSS-in-JS

配置 CSS-in-JS 是一个三步选择过程,其中包括:

  1. 样式注册表,用于收集渲染中的所有 CSS 规则。
  2. 新的 useServerInsertedHTML 钩子,用于在任何可能使用规则的内容之前注入规则。
  3. 客户端组件(Client Component),用于在初始服务器端渲染过程中使用样式注册表包装你的应用程序。
styled-jsx

在客户端组件中使用 styled-jsx,需要使用 v5.1.0。首先,创建一个新注册表:

// app/registry.tsx'use client'import React, { useState } from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { StyleRegistry, createStyleRegistry } from 'styled-jsx'export default function StyledJsxRegistry({children,
}: {children: React.ReactNode
}) {// 只创建一次具有懒惰初始状态的样式表// x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-stateconst [jsxStyleRegistry] = useState(() => createStyleRegistry())useServerInsertedHTML(() => {const styles = jsxStyleRegistry.styles()jsxStyleRegistry.flush()return <>{styles}</>})return <StyleRegistry registry={jsxStyleRegistry}>{children}</StyleRegistry>
}

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

// app/layout.tsximport StyledJsxRegistry from './registry'export default function RootLayout({children,
}: {children: React.ReactNode
}) {return (<html><body><StyledJsxRegistry>{children}</StyledJsxRegistry></body></html>)
}

这里有一个例子。

样式化组件

下面举例说明如何配置 styled-components@6 或更新版本:

首先,在 next.config.js 中启用样式化组件。

// next.config.jsmodule.exports = {compiler: {styledComponents: true,},
}

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

// lib/registry.tsx'use client'import React, { useState } from 'react'
import { useServerInsertedHTML } from 'next/navigation'
import { ServerStyleSheet, StyleSheetManager } from 'styled-components'export default function StyledComponentsRegistry({children,
}: {children: React.ReactNode
}) {// 只创建一次具有懒惰初始状态的样式表// x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-stateconst [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())useServerInsertedHTML(() => {const styles = styledComponentsStyleSheet.getStyleElement()styledComponentsStyleSheet.instance.clearTag()return <>{styles}</>})if (typeof window !== 'undefined') return <>{children}</>return (<StyleSheetManager sheet={styledComponentsStyleSheet.instance}>{children}</StyleSheetManager>)
}

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

// app/layout.tsximport StyledComponentsRegistry from './lib/registry'export default function RootLayout({children,
}: {children: React.ReactNode
}) {return (<html><body><StyledComponentsRegistry>{children}</StyledComponentsRegistry></body></html>)
}

这里有一个例子。

需要知道

  • 在服务器渲染过程中,样式将被提取到全局注册表中,并刷新到 HTML 的 <head> 中。这将确保样式规则被放置在任何可能使用它们的内容之前。将来,我们可能会使用即将推出的 React 功能来确定注入样式的位置。

  • 在流式传输过程中,我们会收集每个分块的样式,并将其添加到现有样式中。在客户端水合完成后,styled-components 将像往常一样接管并注入任何进一步的动态样式。

  • 我们特别在样式注册表树的顶层使用了客户端组件,因为这样提取 CSS 规则的效率更高。它可以避免在后续服务器渲染时重新生成样式,并防止它们被发送到服务器组件有效载荷中。

  • 对于需要配置样式化组件编译的个别属性的高级用例,可以阅读我们的 Next.js 样式化组件 API 参考资料了解更多。

Sass

在使用 .scss.sass 扩展名安装包后,Next.js 内置了与 Sass 集成的支持。你可以通过 CSS 模块和 .module.scssor.module.sass 扩展使用组件级 Sass。

首先,安装 sass:

npm install --save-dev sass

需要知道:

Sass 支持两种不同的语法,每种语法都有自己的扩展名。.scss 扩展名要求你使用 SCSS 语法,而 .sass 扩展名则要求使用缩进语法 (“Sass”)。

如果你不确定该选择哪一种,请从 .scss 扩展名开始,它是 CSS 的超集,不需要你学习缩进语法 (“Sass”)。

自定义 Sass 选项

如果要配置 Sass 编译器,请在 next.config.js 中使用 sassOptions

// next.config.jsconst path = require('path')module.exports = {sassOptions: {includePaths: [path.join(__dirname, 'styles')],},
}

Sass 变量

Next.js 支持从 CSS 模块文件导出的 Sass 变量。

例如,使用导出的 primaryColor Sass 变量:

// app/variables.module.scss$primary-color: #64ff00;:export {primaryColor: $primary-color;
}
// app/page.js// 映射到根 `/` 路径import variables from './variables.module.scss'export default function Page() {return <h1 style={{ color: variables.primaryColor }}>Hello, Next.js!</h1>
}

相关文章:

Next.js 学习笔记(七)——样式

样式 Next.js 支持不同的应用程序样式设计方法&#xff0c;包括&#xff1a; 全局 CSS&#xff1a;对于有传统 CSS 使用经验的人来说&#xff0c;使用简单且熟悉&#xff0c;但随着应用程序的增长&#xff0c;可能会导致 CSS 包过大&#xff0c;难以管理样式。CSS 模块&#…...

金线检测步骤

半导体行业,金线检测是必不可以少的一个检测项,除了焊点,die面,手指以外的必检项目. 重难点在于金线的提取,算法多种多样,找到适合才是关键,涉及到打光,图像处理,这里不做深入分析,软件和硬件配合好才能做的最好. 经典算法Block分析,结合图像检测. 高斯算法提取 边缘检测算法提…...

电池-电量监测基础知识

一、为何要进行电池电量监测 不知各位有没有想过为何现在手机电池和笔记本电脑电池不容易鼓包了&#xff1f;十年前还经常出现的电池鼓包最近像是消失了一样&#xff0c;其实是因为随着电量监测技术的发展&#xff0c;哪怕是最基本的电子设备也有电池侧和产品侧至少两级电量监测…...

西瓜书学习笔记——层次聚类(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 层次聚类是一种将数据集划分为层次结构的聚类方法。它主要有两种策略&#xff1a;自底向上和自顶向下。 其中AGNES算法是一种自底向上聚类算法&#xff0c;用于将数据集划分为层次结构的聚类。算法的基本思想是从每个数据点开始&#xff0…...

深度视觉目标跟踪进展综述-论文笔记

中科大学报上的一篇综述&#xff0c;总结得很详细&#xff0c;整理了相关笔记。 1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) &#xff0c;在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法&#xff0c;采用的框架包括相关滤波器、分类…...

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…...

android tts播报破音解决方案汇总

导航app引导中经常遇到破音&#xff0c;这里也将之前经历过的方案收集以下&#xff0c;方便以后选择&#xff1a; 1 对于开始和结尾破音&#xff1a; 可以用升降音来处理 两种方式 一种是 直接对开始和结束的时间段进行音量直接渐进改变。这里配的是200ms的渐变。 VolumeSha…...

2024年新提出的算法:一种新的基于数学的优化算法——牛顿-拉夫森优化算法|Newton-Raphson-based optimizer,NRBO

1、简介 开发了一种新的元启发式算法——Newton-Raphson-Based优化器&#xff08;NRBO&#xff09;。NRBO受到Newton-Raphson方法的启发&#xff0c;它使用两个规则&#xff1a;Newton-Raphson搜索规则&#xff08;NRSR&#xff09;和Trap Avoidance算子&#xff08;TAO&#…...

笔记 | Clickhouse 命令行连接及查询

在 ClickHouse 中&#xff0c;可以使用命令行客户端执行查询。默认情况下&#xff0c;ClickHouse 的命令行客户端称为 clickhouse-client。下面是一些基本的步骤和示例&#xff0c;用于使用 clickhouse-client 进行查询。 首先&#xff0c;需要确保已经安装了 ClickHouse 服务…...

设计模式—行为型模式之责任链模式

设计模式—行为型模式之责任链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&am…...

如何使用Python+Flask搭建本地Web站点并结合内网穿透公网访问?

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…...

【C语言】【力扣】刷题小白的疑问

一、力扣做题时的答案&#xff0c;没有完整的框架 疑问&#xff1a; 在学习C语言的初始&#xff0c;就知道C语言程序离不开下面这个框架&#xff0c;为什么力扣题的解答往往没有这个框架&#xff1f; #include <stdio.h>int main() {return 0; } 解答&#xff1a; 力扣平…...

【Python】03快速上手爬虫案例三:搞定药师帮

文章目录 前言1、破解验证码2、获取数据 前言 提示&#xff1a;通过用户名、密码、搞定验证码&#xff0c;登录进药师帮网站&#xff0c;然后抓取想要的数据。 爬取数据&#xff0c;最终效果图&#xff1a; 1、破解验证码 使用药师帮测试系统&#xff1a;https://dianrc.ysb…...

C++异步编程

thread std::thread 类代表一个单独的执行线程。在创建与线程对象相关联时&#xff0c;线程会立即开始执行&#xff08;在等待操作系统调度的延迟之后&#xff09;&#xff0c;从构造函数参数中提供的顶层函数开始执行。顶层函数的返回值被忽略&#xff0c;如果它通过抛出异常…...

dfs专题(记忆化搜索)P1141 01迷宫——洛谷(题解)

题目描述 有一个仅由数字 00 与 11 组成的 &#xfffd;&#xfffd;nn 格迷宫。若你位于一格 00 上&#xff0c;那么你可以移动到相邻 44 格中的某一格 11 上&#xff0c;同样若你位于一格 11 上&#xff0c;那么你可以移动到相邻 44 格中的某一格 00 上。 你的任务是&#…...

pip 安装出现报错 SSLError(SSLError(“bad handshake

即使设置了清华源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip 安装包不能配置清华源&#xff0c;出现报错: Retrying (Retry(total2, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘SSLE…...

新概念英语第二册(46)

【New words and expressions】生词和短语&#xff08;12&#xff09; unload v. 卸&#xff08;货&#xff09; wooden adj. 木制的 extremely adv. 非常&#xff0c;极其 occur …...

动态规划入门题目

动态规划&#xff08;记忆化搜索&#xff09;&#xff1a; 将给定问题划分成若干子问题&#xff0c;直到子问题可以被直接解决。然后把子问题的答保存下来以免重复计算&#xff0c;然后根据子问题反推出原问题解的方法 动态规划也称为递推&#xff08;暴力深搜记忆中间状态结果…...

探索云性能测试的各项功能有哪些?

云性能测试作为现代软件开发和部署过程中不可或缺的一环&#xff0c;为确保系统在各种条件下的高效运行提供了关键支持。本文将介绍云性能测试的各项功能&#xff0c;帮助您更好地了解其在软件开发生命周期中的重要性。 1. 负载测试 云性能测试的首要功能之一是负载测试。通过模…...

(大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量

今天&#xff0c;面试了一家公司&#xff0c;什么也不说先来三道面试题做做&#xff0c;第一题。 那么&#xff0c;我们就开始做题吧&#xff0c;谁叫我们是打工人呢。 题目是这样的&#xff1a; 统计除豪车外&#xff0c;销售最差的车 车辆按批销售&#xff0c;每次销售若干…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...