UnoCSS引擎调研

Daotin 于 2023-07-10 发布 编辑

目前痛点

  1. 之前的版本体验差。项目使用 tailwindcss,由于 tailwind 在v2.1+之后才支持JIT模式,所有很多随意的宽度(比如w-123)啥的不支持,要么在全局样式中的某个位置添加这样一个工具类,要么只能在tailwind.config.js 去定义,但是你又不能穷举所有的数字。
  2. 本地开发会比较慢。tailwind 的PurgeCSS这个清除操作仅在生成构建下有效,而开发环境下仍要使用包含了所有规则巨大的 CSS 文件。这在 Webpack 中表现可能并不明显,但在 Vite 中却有着巨大的影响,毕竟其他内容的加载都非常迅捷。
  3. 性能不是太好。从内部实现上看,Tailwind 依赖于 PostCSS 的 AST 进行修改,并且 Tailwind JIT 依赖于对文件系统的预扫描,并使用文件系统监听器来实现 HMR。文件 I/O 不可避免地会引入开销,而你的构建工具实际上需要再次加载它们。
  4. WindiCSS 已不再维护

UnoCSS 介绍

虽然目前 Tailwind 还不错,但是 UnoCSS 有更大的优势:

UnoCSS和TailWind的区别

UnoCSS 和 Tailwind CSS 都是现代 CSS 解决方案,旨在提高开发效率和体验,但它们在设计理念、功能和工作方式上存在一些关键区别。

1. 核心理念与定位:

2. CSS 生成方式:

我们用一个更具体的例子来说明它们核心理念上的区别,尤其是在 “如何提供和生成CSS” 以及 “灵活性” 这两个方面。

想象一下你要给一个按钮添加样式:红色背景、白色文字、一些内边距。

使用 Tailwind CSS (JIT 模式)

Tailwind CSS 本身提供了一整套预先定义好的功能类名。当你使用它的时候,你是在这些已经存在的类名中进行选择。

<button class="bg-red-500 text-white py-2 px-4 rounded">
  Click Me
</button>

使用 UnoCSS

UnoCSS 更像是一个 CSS 规则生成引擎。它默认情况下不包含任何具体的 CSS 功能类。你需要通过预设 (presets) 或自定义规则来告诉它如何生成你想要的 CSS。

方式一:使用类似 Tailwind 的预设 (@unocss/preset-wind)

你可以选择一个预设,比如 @unocss/preset-wind,这个预设会使 UnoCSS 的行为方式非常接近 Tailwind CSS。

<button class="bg-red-500 text-white py-2 px-4 rounded">
  Click Me
</button>

方式二:极致的灵活性 - 自定义规则或使用特殊预设 (例如 Attributify Mode)

这是 UnoCSS 更能体现其“引擎”特性的地方。

总结核心区别的例子:

我可以这样理解吗?Tailwind 是一个“框架”,而UnoCSS 则是生成“框架”的规则。UnoCSS 可以生成Tailwind ,可以生成xxxWind,yyyWind等等

是的,你这样理解在很大程度上是非常准确的!这是一个很好的方式来抓住它们之间的核心区别。

更进一步说:

所以,你的理解“UnoCSS 可以生成 Tailwind,可以生成 xxxWind,yyyWind 等等”是抓住了 UnoCSS 核心的灵活性和引擎特质。它不是简单地“是”一个框架,而是可以“成为”或“驱动”多种框架风格的底层引擎。

何时使用

新项目直接使用 UnoCSS,使用 tailwind 预设,可以直接上手。

老项目的话,tailwind 目前还不是瓶颈,需要的功能都有,暂不需要更新。