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/11 10:01:53
1656 utilities | x200 runs (75% build time)none                                         14.42 ms / delta.      0.00 ms
@tailwindcss/vite        v4.1.13            268.90 ms / delta.    254.48 ms (x1.00)
unocss/vite              v66.5.1            362.08 ms / delta.    347.66 ms (x1.37)
@tailwindcss/postcss     v4.1.13            438.63 ms / delta.    424.21 ms (x1.67)
tailwindcss3             v3.4.17            739.27 ms / delta.    724.85 ms (x2.85)
@unocss/postcss          v66.5.1            912.33 ms / delta.    897.91 ms (x3.53)

分析结果

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

  • 最快的是 tailwindcss@vite,平均 268ms
  • 最慢的是 @unocss/postcss,接近 912ms
  • @tailwindcss/vite vs unocss/vite
    • unocss/vite(362ms)对比 tailwindcss@vite(268ms),大概 慢 1.37 倍
  • postcss 模式的开销真的很大
    • tailwindcss@postcssvite 版本慢将近一倍(438ms)。
    • @unocss/postcss 更是接近 vitetailwindcss@44倍
  • 老的 tailwindcss@3739ms)基本没法和新版本比,性能差距太明显。

因为这个结果,所以这篇文章起了这个标题 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://www.pswp.cn/news/921909.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法练习——55.跳跃游戏

1.题目描述给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。示例 1&#xff…

Django 项目6:表单与认证系统

目录 1、form 表单 2、session 保存状态 3、Admin 后台 4、Auth 系统 1、form 表单 &#xff08;1&#xff09;创建 form.py 文件&#xff0c;并完善 from django import forms# 定义一个表单类 class Register(forms.Form):user forms.CharField(max_length30, label用…

tvm/triton/tensorrt比较

1.tvm的主线感觉更新太慢&#xff0c;文档太落后&#xff0c;在自动驾驶领域不支持Blackwell平台&#xff0c;跨平台其实吹牛的更多。我觉得自动驾驶用不起来。2.性能最快的还是tensorrt/tensorrt_llm这条路&#xff0c;纯cuda路线面临大量cuda算子开发&#xff0c;比如vllm ll…

Transform 和BERT、GPT 模型

目录 Transform的由来 Seq2seq 模型 Transform 的内部结构 语言模型 BERT 介绍 BERT 模型的组成 分词器 位置编码 Softmax 残差结构 BERT 模型总结 Transform的由来 传统的语⾔模型&#xff0c;⽐如RNN&#xff08;循环神经⽹络&#xff09;&#xff0c;就像⼀个“短…

2025高教社国赛数学建模A题参考论文35页(含代码和模型)

2025国赛数学建模竞赛A题完整参考论文 目录 摘要 1 问题背景与重述 2 问题分析 2.1 问题一分析 2.2 问题二分析 2.3 问题三分析 2.4 问题四分析 2.5 问题五分析 3 符号说明 4 模型假设 5 模型建立与求解 5.1 问题一 烟幕有效遮蔽时长…

【Linux】常用命令汇总

【Linux】常用命令【一】tar命令【1】可用参数【2】常用案例&#xff08;1&#xff09;创建归档&#xff08;打包&#xff09;&#xff08;2&#xff09;查看归档内容&#xff1a;​​&#xff08;3&#xff09;解包归档 (提取)&#xff1a;​​【二】日志查看命令【1】基础命令…

软考系统架构设计师之软件系统建模

一、软件系统建模 系统建模流程包括如下&#xff1a; 二、人机交互设计 黄金三法则&#xff1a; 1、置于用户控制之下以不强迫用户进入不必要的或不希望的动作的方式来定义交互方式 提供灵活的交互 允许用户交互可以被中断和撤销 当技能级别增加时可以使交互流水化并允许定制交…

Linux系统学习之注意事项及命令基本格式

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01;你要是翻过历史文章的话&#xff0c;肯定特别疑惑&#xff1a;这神经病搞得这个号到底是啥定位&#xff0c;究竟是分享啥类型的&#xff0c;咋乱七八糟的啥都有。真是个杂货铺啥都有&#xff0c;咋又开始分享Linux系统了…

0基础Java学习过程记录——枚举、注解

一、枚举1.基本介绍&#xff08;1&#xff09;枚举对应英文 enumeration&#xff0c;简写为 enum&#xff08;2&#xff09;枚举是一组常量的集合&#xff08;3&#xff09;可以理解为&#xff1a;枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象2.实现方式&a…

高效计算的源泉:深入浅出冯诺依曼模型与操作系统的管理艺术 —— 构建稳定、高效的应用基石 【底层逻辑/性能优化】

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

性能测试-jmeter9-逻辑控制器、定时器压力并发

课程&#xff1a;B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter逻辑控制器、定时器妙用IF控制器**IF 控制器的作用**循环控制器循环控制器的作用ForEach控制器ForEach 控制器的作用…

T:线段树入门(无区间更新)

线段树.线段树介绍.线段树框架.理解线段树.图式整个过程.线段树代码逐层解析.代码汇总.leetcode练习.线段树介绍 线段树(SegmentTree)\;\;\;\;\;\;\;\;线段树(SegmentTree)线段树(SegmentTree) is 用于高效处理区间查询和单点修改的数据结构&#xff0c;和树状数组很像&#xf…

【ISP】Charlite工具实操

实习一周了&#xff0c;参与了客观拍摄和测试&#xff0c;复习一下nv工具 BLACK LEVEL&#xff08;黑电平&#xff09; eg&#xff1a; $ nv_ob 0 in_dir <input directory> out_name <ob file> nv_ob 0 in_dir D:\study\nvraw\ob1 out_name D:\study\nvraw\my_out…

普蓝机器人 AutoTrack-IR-DR200 外设配置全指南

为什么外设配置对机器人研究如此重要&#xff1f;在当今机器人技术飞速发展的时代&#xff0c;高校学生研究团队正成为创新的重要力量。无论是参加机器人竞赛、开展毕业设计&#xff0c;还是进行学术研究&#xff0c;正确配置和使用外设设备都是成功的关键。尤其学生组装一个服…

8、Python性能优化与代码工程化

学习目标&#xff1a;掌握Python程序性能分析和优化的通用方法&#xff0c;建立工程化开发的规范意识&#xff0c;为后续AI项目开发奠定坚实的编程基础在数据科学和AI开发中&#xff0c;代码性能往往决定了项目的可行性。一个处理时间从几小时缩短到几分钟的优化&#xff0c;可…

【算法--链表】117.填充每个节点的下一个右侧节点指针Ⅱ--通俗讲解

通俗算法讲解推荐阅读: 【算法–链表】83.删除排序链表中的重复元素–通俗讲解 【算法–链表】删除排序链表中的重复元素 II–通俗讲解 【算法–链表】86.分割链表–通俗讲解 【算法】92.翻转链表Ⅱ–通俗讲解 【算法–链表】109.有序链表转换二叉搜索树–通俗讲解 【算法–链…

分词器(Tokenizer)总结(89)

分词器(Tokenizer)总结 分词器(Tokenizer) 分词器的词表(vocabulary)长度通常短于模型嵌入层(embedding layer)的长度。 结束标记(EOS token)应仅用于标记文本结尾,不可用于其他用途。 填充标记(PAD token)通常未预先定义,但你仍可能需要用到它: 对于生成式模型…

19 webUI应用中 Controlnet精讲(05)-图像修复与编辑

前面的篇章已经详细讲解了线条约束、三维关系与空间深度、人体姿态等几类controlnet的功能与应用&#xff0c;本节内容将对通过controlnet对图像修复与编辑进行讲解。 通过controlnet也可以对图片进行编辑、重绘及放大等操作&#xff0c;具体包括Recolor、Inpaint、Tile等&…

消息推送的三种常见方式:轮询、SSE、WebSocket

摘要&#xff1a;本文介绍消息推送的三种常见方式&#xff1a;轮询&#xff08;定时请求&#xff0c;易增负担&#xff09;与长轮询&#xff08;阻塞请求至有数据 / 超时&#xff0c;减少请求&#xff09;、SSE&#xff08;HTTP 单向实时传输&#xff0c;纯文本、自动重连&…

论文阅读:ACL 2024 Stealthy Attack on Large Language Model based Recommendation

总目录 大模型相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2402.14836 https://www.doubao.com/chat/19815566713551106 文章目录速览攻击方法速览一、攻击核心目标与前提1. 核心目标2. 攻击前提二、模型无关的简单…