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

tailwindcss 究竟比 unocss 快多少?

bg

tailwindcss 究竟比 unocss 快多少?

前言

大家好,我是去年一篇测评 《unocss 究竟比 tailwindcss 快多少?》 的作者 icebreaker

一晃到了 2025 年tailwindcss@4 也正式发布了,现在最新版本是 4.1.13

新版本不仅在功能和性能上大升级,甚至定位也发生了变化: 从一个 PostCSS 插件变成了样式预处理器

与此同时,unocss 也一直在进步,一路也更新到了 66.5.1,新的 preset-wind4 写法上也对 tailwindcss@4 做了一定的兼容。

但有一点还是不一样:它还没办法像 tailwindcss@4 一样,把所有配置都直接写在 css 里。

开始测试

这次测试,我还是沿用了去年的基准用例,不过加了更多场景。

比如,我在里面加入了等量的 @apply 指令,来模拟真实开发时的情况。这样一来,不管是 tailwindcss 还是 unocss,都得老老实实去解析 CSS AST,算是“加点负重”。

测试环境保持一致,依旧还是我的老伙计 MacBook M1 Pro (2021)(想换新的 M4 Pro了)

200 次,提取并生成 1656 个工具类,取 75% 分位数(避免极端值干扰)。

测试代码大家也可以自己跑跑 👉 源代码。

测试报告

测试结果如下:

2025/9/10 16:41:50
1656 utilities | x200 runs (75% build time)none                                         14.03 ms / delta.      0.00 ms
@tailwindcss/vite        v4.1.13            114.44 ms / delta.    100.41 ms (x1.00)
@tailwindcss/postcss     v4.1.13            229.34 ms / delta.    215.31 ms (x2.14)
unocss/vite              v66.5.1            330.98 ms / delta.    316.95 ms (x3.16)
tailwindcss3             v3.4.17            710.17 ms / delta.    696.14 ms (x6.93)
@unocss/postcss          v66.5.1            864.50 ms / delta.    850.47 ms (x8.47)

分析结果

从数据里可以很直观地看出几个结论:

  • 最快的是 tailwindcss@vite,平均 114ms
  • 最慢的是 @unocss/postcss,接近 864ms
  • @tailwindcss/vite vs unocss/vite
    • unocss/vite(330ms)对比 tailwindcss@vite(114ms),大概 慢 3 倍
  • postcss 模式的开销真的很大
    • tailwindcss@postcss 比 vite 版本慢一倍(229ms)。
    • @unocss/postcss 更是接近 vitetailwindcss@47.5 倍
  • 老的 tailwindcss@3710ms)基本没法和新版本比,性能差距太明显。

因为这个结果,所以这篇文章起了这个标题 tailwindcss 究竟比 unocss 快多少?,正好和去年的反过来了。

为什么会这样?

个人总结了一些原因:

  1. tailwindcss@4 的技术升级

    • 它的 Token 提取器用 Rust 重写,效率高很多。(可能这点加了大分)
    • 定位从 PostCSS 插件转为“预处理器”,内部对 AST 解析和构建做了深度优化。
    • Vite 集成模式下,性能直接拉满。
  2. unocss 的灵活性代价

    • unocss 胜在灵活和可扩展,但灵活带来额外性能开销。
    • 特别是 runtime 动态生成规则、插件抽象这些地方,都会拖慢速度。
    • PostCSS 模式下表现更差。
  3. vite 的加成

    • vite 本身 HMR 和插件体系就很快。
    • tailwindcss@vite 能直接吃到 vite 的缓存和优化红利。

我们应该选用哪个方案?

从生态的角度考虑

从生态上来说,tailwindcss 基本上是“既成事实的标准”

无论是前端社区里大大小小的 UI 组件库,还是各种脚手架、模版项目,AI 生成的代码,大多数都优先支持 tailwindcss。

比如:

  • UI 组件库:像 shadcn/uidaisyUIflowbite 等,几乎全是基于 tailwindcss 打造。
  • 框架模版Next.jsNuxtRemixAstro 的官方或社区 starter 里,大多数开箱即配好 tailwindcss
  • 文档和教程tailwindcss 的学习资料、视频课程、最佳实践文章,数量远超 unocss

换句话说,如果你用 tailwindcss,几乎可以无缝接入整个生态,不用自己花太多心思去适配。

所以,如果你项目需要稳定的生态支持、丰富的组件库,首选 tailwindcss 基本没悬念

从自定义和灵活性的角度考虑

但如果你追求的是极致的灵活性,那 unocss 依旧是很强的选项。

unocss 的特点是:

  1. 规则引擎化:你可以像写正则一样,自定义规则来生成工具类。
  2. 预设体系:除了官方的 @unocss/preset-uno,还能叠加 attributifyiconstypography 等预设,甚至自己写预设。
  3. 任意属性模式:不仅仅是类名,甚至可以用类似 text="red-500" 这样的写法。

这类灵活性,在 tailwindcss 里要么需要写 plugin,要么使用内联样式。而在 unocss 里就是一条正则规则的事情。

而且 unocss 能够使用 Attributify 模式

<!-- unocss 支持直接在属性里写 -->
<div flex="~ col" text="center gray-700" m="y-4"><p>Hello World</p>
</div>

这种写法比 tailwindcss 的“长串 class”要简洁很多,特别适合喜欢 HTML 语义化的人。

不过 unocss 的灵活性,导致 unocss-merge 相对难产, https://www.npmjs.com/package/unocss-merge 这个包没人用,个位数下载量。

不像 tailwind-merge 已经成为各个 tailwindcss 组件库的标配了。(Weekly Downloads 将近1千200万次)

所以结论是:

  • tailwindcss = 生态第一,几乎是“官方标配”。
  • unocss = 灵活度第一,适合“想自己捏规则”的场景。

结语

今天的数据用一句话总结:

  • tailwindcss 的性能全面超越 unocss

所以,如果你追求开发体验 + 构建速度,那现在毫无疑问是 tailwindcss@4 + vite 最优解。

最后,也再期待一波 unocss 的大更新,再和 tailwindcss 它们之间相互卷起来,未来给我们开发者带来更多的惊喜!


文章转载自:

http://qVuAsmiA.ktcrr.cn
http://WT11X8CH.ktcrr.cn
http://2VhiW9jW.ktcrr.cn
http://VxcZPHLs.ktcrr.cn
http://r0DqlgOW.ktcrr.cn
http://q8hbO0xv.ktcrr.cn
http://rLHbtBhy.ktcrr.cn
http://wBngHVP0.ktcrr.cn
http://njMHGY1o.ktcrr.cn
http://YK6UlVqV.ktcrr.cn
http://FKHJES8Y.ktcrr.cn
http://QoXHip3S.ktcrr.cn
http://LxDB52xG.ktcrr.cn
http://lZK1XZgZ.ktcrr.cn
http://zZNpDnEY.ktcrr.cn
http://8WOkPSSv.ktcrr.cn
http://Jaw0DNv8.ktcrr.cn
http://xpOu3yeh.ktcrr.cn
http://S20FfLhv.ktcrr.cn
http://svS6VNJV.ktcrr.cn
http://Atwlqzel.ktcrr.cn
http://KmqHpz5E.ktcrr.cn
http://K1ciZqE3.ktcrr.cn
http://9zaNp7rK.ktcrr.cn
http://h5esjree.ktcrr.cn
http://tQQmfsjM.ktcrr.cn
http://hmUIBCTR.ktcrr.cn
http://rpbZ7gqy.ktcrr.cn
http://kybYt2Lq.ktcrr.cn
http://H9AHbxFA.ktcrr.cn
http://www.dtcms.com/a/376526.html

相关文章:

  • 排序---希尔排序(Shell Sort)
  • Windows系统下,配置VScode的git以及git终端
  • 机器学习实战(一): 什么是机器学习
  • Google SEO 优化里,AWS 的隐藏优势
  • 微信推客小程序系统开发技术实践
  • git下载、安装、使用
  • Transformer实战(17)——微调Transformer语言模型进行多标签文本分类
  • 单例模式(C++)详解(3)
  • Eyeshot 2025.3 3D 图形工具包
  • 【Linux手册】信号量与建造者模式:以 PV 操作保证并发安全,分步组装构建复杂对象
  • 【展厅多媒体】VR虚拟现实,构建展厅沉浸体验的重要技术
  • 京东京造K2 蓝牙/有线双模键盘键盘快捷键
  • Figma Make 输入指令浏览器无响应
  • 【设计模式】【观察者模式】实例
  • 【Linux手册】消息队列从原理到模式:底层逻辑、接口实战与责任链模式的设计艺术
  • 学习React-10-useTransition
  • Hive中的3种虚拟列以及Hive如何进行条件判断
  • 基于 C++ 的 IEC60870-5-104 规约的主从站模拟数据通信
  • css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。
  • 一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞
  • 容器问答题上
  • uniapp发布成 微信小程序 主包内 main.wxss 体积太大
  • Uniapp中使用renderjs实现OpenLayers+天地图的展示与操作
  • 鸿蒙HAP包解包、打包、签名及加固全流程解析
  • [Leetcode 算法题单] 1456. 定长子串中元音的最大数目
  • 基于Springboot + vue实现的高校大学生竞赛项目管理系统
  • 为什么 socket.io 客户端在浏览器能连上,但在 Node.js 中报错 transport close?
  • Windows 命令行:切换盘符
  • 论文阅读记录之《VelocityGPT 》
  • 微服务通信实战篇:基于 Feign 的远程调用与性能优化