UnoCSS 快是因为跳过编译:直接正则提取类名、查表注入CSS,响应仅1–2ms;Tailwind需全量AST解析,HMR常超400ms。

UnoCSS 为什么快:它根本没在“编译”
UnoCSS 的快不是“编译得快”,而是跳过了编译环节。Tailwind CSS v3 JIT 仍需通过 PostCSS 解析整个 AST,再遍历节点匹配类名、查表、生成规则;UnoCSS 默认不碰 AST,只对源码字符串做轻量正则提取(比如从 直接替换插件不会自动兼容,因为 UnoCSS 不继承 Tailwind 的运行时逻辑。以下配置若保留,会导致静默失效: 这不是“换壳”,而是语义层兼容。它复刻了 Tailwind 的类名映射逻辑,但底层规则是重写的。迁移只需三步,且可渐进: 两者都支持运行时拼接,但提取机制不同,容易漏提: 最易被忽略的是缓存污染:迁移后务必清掉 text-blue-500),匹配后查预置规则表注入 CSS。这导致两个关键差异:
import 的模块路径;Tailwind 依赖 glob 全量扫描,I/O 开销随文件数线性增长迁移前必须关掉的 Tailwind 行为
dark: 变体不会自动生效——Tailwind 依赖 class="dark" 自动检测,UnoCSS 需手动注入 dark 类到 标签,或启用 @unocss/preset-dynamic
hover:underline 这类变体默认启用,但如果你在 uno.config.ts 中禁用了 variants 插件,或设了 preflight: false,它就完全不工作,且无报错提示bg-gradient-to-r 在 Tailwind 中需显式配置 gradientColorStops 才能生成;UnoCSS 默认支持,但自定义的 theme.colors 不会自动注入到渐变逻辑里,得手动补 rules
用
@unocss/preset-wind 实现 99% 兼容迁移
pnpm add -D @unocss/preset-wind @unocss/transformer-directives(后者用于支持 @apply)uno.config.ts:
import { defineConfig } from 'unocss'
import presetWind from '@unocss/preset-wind'
export default defineConfig({
presets: [presetWind()],
transformers: [
// 启用 @apply 支持(否则会忽略)
import('@unocss/transformer-directives').then(m => m.default())
],
})
tailwind.config.js 和所有 PostCSS 相关插件(如 postcss、autoprefixer)——UnoCSS 自带 autoprefixer 行为,多加反而干扰动态类名和安全白名单的实际处理
class={`text-${color}-500`}:UnoCSS 的 @unocss/extractor-regex(默认启用)能提取字面量部分(如 text-red-500),但无法推断 color 变量值;Tailwind 需配 content.safeList 或正则白名单class={\`p-\${size} \${isActive ? 'bg-blue-500' : 'bg-gray-200'}\`} —— UnoCSS 仅提取静态分支,bg-blue-500 和 bg-gray-200 都会被捕获;Tailwind 则可能全漏,除非你把整个表达式写进 safeList
shortcuts,比如 btn-primary → text-white bg-blue-500 hover:bg-blue-600,既可控又免白名单维护.unocss-cache 和 Vite 的 .vite/deps,否则旧规则可能残留,导致 HMR 失效或样式不更新。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











