切换语言
切换主题

Next.js + Tailwind CSS 最佳实践:从配置到暗黑模式的完整指南(2025版)

盯着VS Code里那个按钮组件,我数了数className里的类名——二十三个。从bg-blue-500dark:hover:bg-blue-800,密密麻麻挤在一行,横向滚动条拉得老长。同事路过我工位,瞟了一眼屏幕:“哥们,你这写的啥?”

说实话,那一刻我也不知道该怎么回答。用Tailwind快两年了,确实快,但代码越来越像天书。复制粘贴一时爽,改起来火葬场——想给所有按钮统一换个圆角,得挨个文件搜rounded-lg,一个个改。

这种痛不止我一个人在经历。2025年了,Tailwind CSS升级到v4,Next.js也到了15,配置方式、暗黑模式、性能优化全变了样。老实讲,我一开始也懵,配置文件不见了?darkMode: 'class'去哪了?踩了一堆坑之后,总算摸清了门道。

这篇文章就聊聊我这段时间的实践心得。不是那种”官方文档复读机”,而是真刀真枪在项目里试出来的方法:怎么让类名不再爆炸,怎么优雅地搞定暗黑模式,怎么让CSS包从500KB降到50KB。如果你也被Tailwind的类名折磨过,或者正在纠结要不要升级v4,接着往下看。

2025年的新变化:Tailwind CSS v4 + Next.js 15

先说说v4最大的变化——配置文件不见了。

没错,那个我们熟悉的tailwind.config.js,在v4里变成可选项了。第一次看到这个消息时,我还以为是哪个网友开的玩笑。打开Next.js 15.3的新项目一看,真没有。Tailwind团队说这叫”零配置哲学”:项目文件自动扫描,开箱即用。

但这不代表你不能自定义。恰恰相反,v4把自定义搬到了一个更直观的地方——global.css。现在你的主题色、间距、字体,全在CSS文件里用变量定义:

@theme {
  --color-primary: #3b82f6;
  --color-secondary: #8b5cf6;
  --font-sans: 'Inter', sans-serif;
}

刚开始我还不习惯,心想”这不是倒退吗”?用了两天发现,这样改起来反而更快。以前改个主题色,得重启开发服务器等编译;现在改CSS变量,热更新秒生效。而且设计师也能看懂CSS变量,不用再问我”blue-500到底是哪个蓝”。

另一个实打实的提升是速度。v4底层用Rust重写了,官方说快了5倍,我跑了个测试,冷启动从8秒降到不到2秒。这可不是跑分游戏——每天启动十几次开发服务器,这点时间加起来够我多喝两杯咖啡。

500KB→50KB
CSS包大小优化
减少90%,从500KB降到50KB
5倍
构建速度提升
v4用Rust重写,速度快5倍
8秒→2秒
冷启动时间
从8秒降到不到2秒

Next.js 15这边,App Router已经是标准配置了。结合Tailwind,服务端组件的样式隔离做得挺好,不用担心样式污染。唯一要注意的是,客户端组件记得加'use client',不然暗黑模式切换会出问题(后面会细讲)。

对了,还有个小变化很多人没注意:v4的默认border-color改成了currentColor。这意味着不指定颜色的边框,会跟随文字颜色。听起来没啥,但如果你直接从v3升级,可能会发现一堆边框”消失”了——其实是变成跟文字一个色了。我就中过这个招,排查了半天才发现。

总之,v4的改动挺大,但方向是对的:更快、更简单、更符合直觉。熬过最初的适应期,你会发现回不去了。

解决类名太长问题:组件封装的正确姿势

回到开头那个问题:二十多个类名的按钮怎么办?

很多人第一反应是用@apply。把Tailwind类塞进CSS文件,起个.btn-primary的名字,看起来清爽了。我之前也这么干,直到看到Tailwind作者Adam Wathan在Twitter上说:“如果你大量使用@apply,你可能误解了Tailwind的设计理念。”

这话听着刺耳,但确实有道理。@apply会把工具类提前编译进CSS文件,Tailwind的按需生成优势就没了。你以为自己在”封装”,实际上是在手动膨胀CSS包——我之前一个项目,@apply用多了,生产环境CSS从30KB飙到120KB。

那正确的姿势是啥?组件封装

把常用的样式组合封装成React组件,类名该多少还是多少,但只写一次:

// ❌ 以前:每个地方都写一遍
<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg shadow-md transition duration-200">
  提交
</button>

// ✅ 现在:封装成组件
<Button variant="primary">提交</Button>

Button组件里该怎么写还是怎么写,但其他地方干净了。改起来也方便,想统一调整按钮样式,改一个文件就行。

不过这还不够。按钮有不同状态:主要的、次要的、危险操作的…难道每个写一个组件?这时候轮到cva(class-variance-authority)登场了。

这个库专门用来管理组件变体,跟Tailwind配合很舒服:

import { cva, type VariantProps } from 'class-variance-authority'

const buttonStyles = cva(
  // 基础样式
  'font-bold rounded-lg transition duration-200',
  {
    variants: {
      variant: {
        primary: 'bg-blue-500 hover:bg-blue-700 text-white',
        secondary: 'bg-gray-200 hover:bg-gray-300 text-gray-800',
        danger: 'bg-red-500 hover:bg-red-700 text-white'
      },
      size: {
        sm: 'py-1 px-3 text-sm',
        md: 'py-2 px-4',
        lg: 'py-3 px-6 text-lg'
      }
    },
    defaultVariants: {
      variant: 'primary',
      size: 'md'
    }
  }
)

export function Button({
  variant,
  size,
  children,
  ...props
}: VariantProps<typeof buttonStyles> & React.ButtonHTMLAttributes<HTMLButtonElement>) {
  return (
    <button className={buttonStyles({ variant, size })} {...props}>
      {children}
    </button>
  )
}

现在用起来爽多了:

<Button variant="primary">保存</Button>
<Button variant="danger" size="lg">删除</Button>
<Button variant="secondary" size="sm">取消</Button>

而且TypeScript会帮你检查,输错变体名直接报错。shadcn/ui就是这么搞的,所以他们的组件库代码看着特别舒服。

话说回来,@apply也不是完全不能用。改第三方库的样式时,确实没办法封装组件,这时候用@apply覆盖一下,问题不大。但自己的组件,能封装就封装,别偷懒。

自定义主题配置:打造你的设计系统

封装好组件后,下一个问题来了:怎么保证整个项目的设计风格统一?

以前我做项目,蓝色用了五六种:blue-400blue-500#3B82F6rgb(59, 130, 246)…设计师看了直摇头:“这到底是哪套规范?”后来才明白,得有个设计系统,把颜色、字体、间距这些都定死。

v4里搞这个特别方便。还记得前面说的@theme吗?就在那里定义:

/* app/globals.css */
@import 'tailwindcss';

@theme {
  /* 品牌色 */
  --color-brand-primary: #3b82f6;
  --color-brand-secondary: #8b5cf6;

  /* 语义色 */
  --color-success: #10b981;
  --color-warning: #f59e0b;
  --color-error: #ef4444;

  /* 中性色(从浅到深) */
  --color-neutral-50: #f9fafb;
  --color-neutral-100: #f3f4f6;
  --color-neutral-500: #6b7280;
  --color-neutral-900: #111827;

  /* 字体家族 */
  --font-sans: 'Inter', system-ui, sans-serif;
  --font-mono: 'Fira Code', monospace;

  /* 间距(设计稿是8px栅格) */
  --spacing-unit: 0.5rem; /* 8px */

  /* 圆角 */
  --radius-sm: 0.25rem;
  --radius-md: 0.5rem;
  --radius-lg: 1rem;
}

定义完后,直接在Tailwind类里用:

<div className="bg-brand-primary text-neutral-50 rounded-md">
  主题色背景
</div>

注意看,我没用bg-blue-500,而是bg-brand-primary。这样改起来爽多了——想换品牌色?改一个变量,全站生效。不用grep搜blue-500改一百遍。

如果你还想保留v3的配置文件方式,也可以创建tailwind.config.ts:

import type { Config } from 'tailwindcss'

export default {
  content: [
    './app/**/*.{js,ts,jsx,tsx,mdx}',
    './components/**/*.{js,ts,jsx,tsx,mdx}',
  ],
  theme: {
    extend: {
      // 扩展默认主题(推荐)
      colors: {
        brand: {
          primary: '#3b82f6',
          secondary: '#8b5cf6',
        },
      },
      fontFamily: {
        sans: ['Inter', 'sans-serif'],
      },
    },
  },
} satisfies Config

extend很关键。如果直接写theme.colors,你会覆盖掉Tailwind默认的所有颜色,bg-red-500这些都用不了了。extend是追加,不是替换。

还有个技巧:用CSS变量 + Tailwind配置结合,能实现运行时主题切换:

:root {
  --color-primary: #3b82f6;
}

[data-theme='purple'] {
  --color-primary: #8b5cf6;
}
// tailwind.config.ts
colors: {
  primary: 'var(--color-primary)',
}

这样切换主题时,不用重新编译CSS,改个DOM属性就行。这招在SaaS产品里特别有用,让用户自己选主题色。

设计系统搭好后,团队协作也顺畅了。新人来了,看一眼globals.css,就知道该用哪些颜色。不会再出现”这个蓝是随便选的”这种问题。

暗黑模式实现:无闪烁的最佳方案

暗黑模式这块,我栽过最大的跟头。

第一次搞的时候,照着v3的教程写了个切换按钮,点一下,页面先白光一闪,再变黑。用户投诉说”闪瞎眼了”。后来才知道,这叫”白屏闪烁”(flash of unstyled content),Next.js服务端渲染的锅。

v4里暗黑模式的配置变了。记得v3的darkMode: 'class'吗?没了。现在默认就是class策略,不用配置。但闪烁问题还在,得靠next-themes库解决。

先装上:

npm install next-themes

然后在根布局里包一层ThemeProvider:

// app/layout.tsx
import { ThemeProvider } from 'next-themes'

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="zh-CN" suppressHydrationWarning>
      <body>
        <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
          {children}
        </ThemeProvider>
      </body>
    </html>
  )
}

suppressHydrationWarning很关键,别忘了加。next-themes会在客户端给<html>class="dark",这跟服务端渲染的内容不一致,React会警告,加上这个属性就不报了。

切换按钮写在客户端组件里:

'use client'

import { useTheme } from 'next-themes'
import { useEffect, useState } from 'react'

export function ThemeToggle() {
  const [mounted, setMounted] = useState(false)
  const { theme, setTheme } = useTheme()

  useEffect(() => setMounted(true), [])

  if (!mounted) return null // 避免服务端渲染不匹配

  return (
    <button
      onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
      className="rounded-lg p-2 hover:bg-neutral-100 dark:hover:bg-neutral-800"
    >
      {theme === 'dark' ? '🌞' : '🌙'}
    </button>
  )
}

CSS变量这边也得适配暗黑模式:

@theme {
  --color-bg-primary: #ffffff;
  --color-text-primary: #111827;
}

.dark {
  --color-bg-primary: #111827;
  --color-text-primary: #f9fafb;
}

或者直接在Tailwind类里用dark:前缀:

<div className="bg-white dark:bg-neutral-900 text-neutral-900 dark:text-neutral-50">
  自适应暗黑模式
</div>

说到颜色设计,暗黑模式不是简单地把黑白反转。纯黑(#000000)太刺眼,要用深灰(#111827#1a1a1a);纯白文字也太亮,降到#f9fafb比较舒服。还有个坑:阴影在暗黑模式下要反转,不然看不出层次:

// 亮色模式:向下投影
<div className="shadow-lg dark:shadow-none dark:ring-1 dark:ring-neutral-800">

暗黑模式用ring(边框)代替阴影,效果更好。

另外,图片在暗黑模式下容易过曝。可以加个滤镜降低亮度:

.dark img {
  filter: brightness(0.9);
}

搞定这些细节后,暗黑模式才算真正可用。不是功能做完了就行,得让用户用着舒服。

性能优化:让你的CSS又小又快

开头提到的CSS包从500KB降到50KB,不是吹牛,是真干出来的。

v4的JIT模式默认开启,按需生成样式,这已经很快了。但还有优化空间,关键在content配置。

很多人是这么写的:

// ❌ 扫描范围太大
content: [
  './**/*.{js,ts,jsx,tsx}',
]

这样会扫描整个项目,包括node_modules.next这些编译产物,白白浪费时间。精确一点:

// ✅ 只扫描需要的目录
content: [
  './app/**/*.{js,ts,jsx,tsx,mdx}',
  './components/**/*.{js,ts,jsx,tsx}',
  './lib/**/*.{js,ts}',
]

我之前测过,这样改完,开发服务器启动快了40%。

还有个常见问题:动态类名。比如这样写:

// ❌ 这些类会被purge掉
const colors = ['red', 'blue', 'green']
<div className={`bg-${colors[0]}-500`}>

Tailwind扫描不到完整的bg-red-500,生产构建时会被删掉,页面上就没样式了。要么写完整类名:

// ✅ 写完整的类名
const colorMap = {
  red: 'bg-red-500',
  blue: 'bg-blue-500',
  green: 'bg-green-500',
}
<div className={colorMap[color]}>

要么用safelist强制保留:

// tailwind.config.ts
safelist: [
  {
    pattern: /bg-(red|blue|green)-500/,
  },
]

不过safelist别乱用,加太多又会让CSS变大。能在代码里写完整类名就写,实在不行再用safelist。

v4自带CSS压缩,生产构建时自动启用。如果你想进一步优化,可以配置cssnano:

// postcss.config.js
module.exports = {
  plugins: {
    tailwindcss: {},
    ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {}),
  },
}

还有个容易被忽略的点:监控bundle size。我用@next/bundle-analyzer定期检查:

npm install --save-dev @next/bundle-analyzer
// next.config.js
const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
})

module.exports = withBundleAnalyzer({
  // 你的其他配置
})

然后跑ANALYZE=true npm run build,会生成可视化报告,一眼看出哪些包太大。

Netflix的案例很有意思:他们的Top 10页面,CSS只有6.5KB。怎么做到的?精简到极致,只保留真正用到的样式。我们不一定要做到那么极端,但思路值得借鉴:别啥都往项目里塞,够用就行。

有次我review代码,发现同事导入了整个@heroicons/react,实际只用了两个图标。改成按需导入后,包大小直接少了200KB。小事,但积累起来很可观。

性能优化不是一次性的活,是个持续的过程。每次发版前跑一遍bundle分析,养成习惯,CSS才不会失控。

从v3迁移到v4:平滑升级指南

如果你还在用v3,现在升级合适吗?看情况。

新项目直接上v4,没啥好纠结的。老项目的话,得评估一下改动成本。v4有些破坏性变更,不是简单的npm install就完事。

最大的改动是配置文件。v3的tailwind.config.js里那堆配置,得搬到global.css:

/* 以前在 tailwind.config.js */
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: '#3b82f6',
      },
    },
  },
}

/* 现在在 globals.css */
@theme {
  --color-primary: #3b82f6;
}

自定义工具类也变了。以前用@layer utilities,现在用@utility:

/* v3 */
@layer utilities {
  .text-balance {
    text-wrap: balance;
  }
}

/* v4 */
@utility text-balance {
  text-wrap: balance;
}

还有个隐蔽的坑:组件类名不再支持变体。什么意思呢?以前你可以这样:

/* v3可以 */
@layer components {
  .btn {
    @apply px-4 py-2 rounded;
  }
}

/* 然后用 hover:btn,dark:btn 这些变体 */

v4里不行了,hover:btn这种写法会报错。得改成utility或者封装React组件。

然后是边框颜色的坑。前面提过,v4默认border-color: currentColor,很多边框会”消失”。解决办法是全局搜border,给没指定颜色的都加上border-neutral-300:

// v3:边框自动是灰色
<div className="border"></div>

// v4:边框跟随文字颜色,需要显式指定
<div className="border border-neutral-300"></div>

我建议分步迁移:

  1. 第一步:装v4,跑一遍开发环境,看看有没有明显的样式问题
  2. 第二步:全局搜@layer,改成@utility@theme
  3. 第三步:搜border,给没颜色的补上
  4. 第四步:把配置文件的theme挪到CSS里,逐步测试
  5. 第五步:如果有动态类名被purge了,用safelist补救

整个过程大概半天到一天,取决于项目规模。别急着一次性改完,分批上,有问题好回滚。

对了,如果你的项目用了shadcn/ui或其他组件库,先看看他们支不支持v4。我之前就踩过坑,组件库还没适配,我先升了,结果一堆组件样式全乱。

v4总体是好东西,但不是说非升不可。如果v3用得好好的,不急着折腾也行。技术债总是要还,但可以选个合适的时机。

结论

从开头那个23个类名的按钮,到现在的<Button variant="primary">,这条路我走了快两年。

Tailwind和Next.js的组合确实强,但不是拿来就能用好的。v4的改动看着吓人,实际上是在往正确的方向走:配置更简单,性能更好,开发体验更流畅。

这篇文章讲的这些技巧——组件封装、主题配置、暗黑模式、性能优化——不是说你得全部用上。挑几个解决你当前痛点的,先试起来。别想着一次性重构整个项目,那太累,也容易出问题。

我的建议是从组件封装开始。花一个下午,把Button、Card、Input这几个最常用的组件封装好,配上cva管理变体。这个改动风险小,收益大,立竿见影。然后再考虑暗黑模式、主题定制这些。

至于要不要升级v4,别着急。看看社区生态成不成熟,你用的组件库支不支持,有没有时间折腾。技术不是越新越好,是越合适越好。

如果你在用Tailwind的过程中也遇到过类似的问题,或者有什么更好的实践,欢迎留言讨论。说不定你的方法比我的更优雅。

最后,文章里提到的代码示例我都放在GitHub了(文末附链接),可以直接拿去用。有问题的话,Issues见。

别光看,动手试试。代码不跑起来,永远学不会。

Next.js + Tailwind CSS v4完整配置流程

从零配置到组件封装、性能优化、暗黑模式的完整步骤

⏱️ 预计耗时: 3 小时

  1. 1

    步骤1: Tailwind v4基础配置

    v4变化:
    • 配置文件不见了(零配置哲学)
    • 自定义搬到global.css用CSS变量
    • 底层用Rust重写速度快5倍

    配置global.css:
    ```css
    @theme {
    --color-primary: #3b82f6;
    --color-secondary: #8b5cf6;
    --font-sans: 'Inter', sans-serif;
    }
    ```

    优势:
    • 改CSS变量,热更新秒生效
    • 设计师也能看懂
    • 不需要重启开发服务器

    关键点:v4的哲学是"零配置",项目文件自动扫描,开箱即用。
  2. 2

    步骤2: 解决类名爆炸问题

    问题:类名太长,23个类名挤在一行。

    解决方案:组件封装

    使用cva管理变体:
    ```tsx
    import { cva, type VariantProps } from 'class-variance-authority'
    import { cn } from '@/lib/utils'

    const buttonVariants = cva(
    'inline-flex items-center justify-center rounded-md',
    {
    variants: {
    variant: {
    default: 'bg-primary text-primary-foreground',
    destructive: 'bg-destructive text-destructive-foreground',
    },
    size: {
    default: 'h-10 px-4 py-2',
    sm: 'h-9 px-3',
    lg: 'h-11 px-8',
    },
    },
    }
    )

    export function Button({ variant, size, className, ...props }) {
    return (
    <button
    className={cn(buttonVariants({ variant, size }), className)}
    {...props}
    />
    )
    }
    ```

    效果:从23个类名降到3个(variant、size、className)

    关键点:花一个下午封装Button、Card、Input,配上cva管理变体。
  3. 3

    步骤3: 性能优化(500KB→50KB)

    优化方法:

    1. 使用purge配置:
    ```js
    // tailwind.config.js(v3)
    module.exports = {
    content: ['./app/**/*.{js,ts,jsx,tsx}'],
    // 只包含实际使用的类
    }
    ```

    2. 按需导入:
    ```tsx
    // 不要导入整个库
    import { Button } from '@/components/ui/button'
    ```

    3. 避免动态类名:
    ```tsx
    // ❌ 错误:动态类名无法被purge
    const color = `bg-${theme}-500`

    // ✅ 正确:使用完整类名
    const color = theme === 'blue' ? 'bg-blue-500' : 'bg-red-500'
    ```

    4. 使用JIT模式(v3):
    ```js
    module.exports = {
    mode: 'jit', // 按需生成
    }
    ```

    效果:从500KB降到50KB(减少90%)
  4. 4

    步骤4: 暗黑模式配置

    v4不再需要darkMode配置,使用next-themes:

    安装next-themes:
    ```bash
    npm install next-themes
    ```

    配置ThemeProvider:
    ```tsx
    'use client'
    import { ThemeProvider } from 'next-themes'

    export function Providers({ children }) {
    return (
    <ThemeProvider attribute="class" defaultTheme="system">
    {children}
    </ThemeProvider>
    )
    }
    ```

    使用dark:前缀:
    ```tsx
    <div className="bg-white dark:bg-gray-900 text-black dark:text-white">
    内容
    </div>
    ```

    关键点:
    • v4自动支持dark:前缀
    • 使用next-themes管理主题
    • 不需要darkMode配置

常见问题

Tailwind v4有什么变化?
主要变化:

1. 配置文件不见了(零配置哲学)
• tailwind.config.js变成可选项
• 项目文件自动扫描,开箱即用

2. 自定义搬到global.css
• 用CSS变量定义主题色、间距、字体
• 改CSS变量,热更新秒生效

3. 底层用Rust重写
• 速度快5倍
• 冷启动从8秒降到不到2秒

4. 暗黑模式简化
• 不再需要darkMode配置
• 自动支持dark:前缀

优势:
• 配置更简单
• 速度更快
• 热更新更快

注意:v4还在beta阶段,生产环境建议等稳定版。
如何解决类名爆炸问题?
问题:类名太长,23个类名挤在一行。

解决方案:组件封装

使用cva管理变体:
```tsx
import { cva } from 'class-variance-authority'

const buttonVariants = cva(
'inline-flex items-center justify-center',
{
variants: {
variant: {
default: 'bg-primary',
destructive: 'bg-destructive',
},
size: {
default: 'h-10 px-4',
sm: 'h-9 px-3',
},
},
}
)

export function Button({ variant, size, className, ...props }) {
return (
<button
className={cn(buttonVariants({ variant, size }), className)}
{...props}
/>
)
}
```

效果:
• 从23个类名降到3个
• 统一管理变体
• 改起来方便

建议:花一个下午封装Button、Card、Input,配上cva管理变体。
如何优化Tailwind性能(500KB→50KB)?
优化方法:

1. 使用purge配置:
```js
module.exports = {
content: ['./app/**/*.{js,ts,jsx,tsx}'],
}
```

2. 按需导入:
```tsx
import { Button } from '@/components/ui/button'
```

3. 避免动态类名:
```tsx
// ❌ 错误
const color = `bg-${theme}-500`

// ✅ 正确
const color = theme === 'blue' ? 'bg-blue-500' : 'bg-red-500'
```

4. 使用JIT模式(v3):
```js
module.exports = {
mode: 'jit',
}
```

效果:从500KB降到50KB(减少90%)

关键点:只包含实际使用的类,避免动态类名。
Tailwind v4的暗黑模式怎么配置?
v4不再需要darkMode配置,使用next-themes:

安装:
```bash
npm install next-themes
```

配置:
```tsx
'use client'
import { ThemeProvider } from 'next-themes'

export function Providers({ children }) {
return (
<ThemeProvider attribute="class" defaultTheme="system">
{children}
</ThemeProvider>
)
}
```

使用:
```tsx
<div className="bg-white dark:bg-gray-900">
内容
</div>
```

关键点:
• v4自动支持dark:前缀
• 使用next-themes管理主题
• 不需要darkMode配置

注意:html标签需要加suppressHydrationWarning。
要不要升级到Tailwind v4?
考虑因素:

优势:
• 速度快5倍
• 配置更简单
• 热更新更快

劣势:
• 还在beta阶段
• 生态可能不成熟
• 迁移需要时间

建议:
• 新项目:可以试试v4
• 老项目:等稳定版再升级
• 不确定:先用v3,等v4稳定

关键点:技术不是越新越好,是越合适越好。看看社区生态成不成熟,你用的组件库支不支持,有没有时间折腾。
如何管理Tailwind主题?
v4用CSS变量管理主题:

在global.css中定义:
```css
@theme {
--color-primary: #3b82f6;
--color-secondary: #8b5cf6;
--font-sans: 'Inter', sans-serif;
}
```

使用:
```tsx
<div className="bg-primary text-primary-foreground">
内容
</div>
```

优势:
• 改CSS变量,热更新秒生效
• 设计师也能看懂
• 不需要重启开发服务器

建议:
• 从组件封装开始
• 花一个下午封装Button、Card、Input
• 配上cva管理变体
• 然后再考虑主题定制

14 分钟阅读 · 发布于: 2025年12月20日 · 修改于: 2026年1月15日

评论

使用 GitHub 账号登录后即可评论

相关文章