首页 > 其他分享 >UnoCSS 给了我一个不用 tailwindcss 的理由

UnoCSS 给了我一个不用 tailwindcss 的理由

时间:2024-09-24 16:20:21浏览次数:10  
标签:理由 text UnoCSS tailwindcss unocss import 图标 defineConfig

如果你没有听说过 tailwindcss 或者 unocss,请先 return 先去了解一下。

  • 开发上:可能为你甚至你们的前端团队节省很多写样式的时间,也能让你或者你们的项目开发体验有很大提升
  • 生产上:你们的项目打出来的包体积中的样式代码占比将突然骤降然后趋于不变

为什么我换到了UnoCSS

tailwindcss 和 UnoCSS 都是原子化CSS模式实现的一种,为什么现在我更推荐 UnoCSS ,接下来就讲一下 UnoCSS 的杀手级亮点:

极致性能

跳过解析,不使用 AST

从内部实现上看,Tailwind 依赖于 PostCSS 的 AST 进行修改。考虑到在开发过程中,这些工具 CSS 的并不经常变化,UnoCSS 通过非常高效的字符串拼接来直接生成对应的 CSS 而非引入整个编译过程。同时,UnoCSS 对类名和生成的 CSS 字符串进行了缓存,当再次遇到相同的实用工具类时,它可以绕过整个匹配和生成的过程。

完全可定制,不是一个框架,而是引擎

相比于 tailwindcss 必须把原子类写到 class 里面,UnoCSS 提供了更多可选方案,并且兼容多种风格的原子类框架,除了 tailwindcss ,同样支持 Bootstrap, TachyonsWindi CSS

属性化模式

这个模式也是由 Windi CSS 启发而来:

Attributify perset

// install
pnpm add -D @unocss/preset-attributify

// uno.config.ts
import { defineConfig } from 'unocss'
import presetAttributify from '@unocss/preset-attributify'

export default defineConfig({
  presets: [
    presetAttributify({ /* preset options */ }),
    // ...
  ],
})
<div class="m-2 rounded text-teal-400" />
<!-- 现在你可以这么写: -->
<div m-2 rounded text-teal-400 />

前缀组,解决繁琐的多次写前缀的情况

Variant group transformer

// install
pnpm add -D @unocss/transformer-variant-group

// uno.config.ts
import { defineConfig } from 'unocss'
import transformerVariantGroup from '@unocss/transformer-variant-group'

export default defineConfig({
  // ...
  transformers: [
    transformerVariantGroup(),
  ],
})

比如我们在设置字体的时候常常会设置颜色、大小,或者在 hover 的情况下改动多个属性我们就可以这样:

<div class="hover:bg-gray-400 hover:font-medium font-light font-mono"/>
<!-- 简化之后: -->
<div class="hover:(bg-gray-400 font-medium) font-(light mono)"/>

快捷方式和指令

Directives transformer

// install
pnpm add -D @unocss/transformer-directives

// uno.config.ts
import { defineConfig } from 'unocss'
import transformerDirectives from '@unocss/transformer-directives'

export default defineConfig({
  // ...
  transformers: [
    transformerDirectives(),
  ],
})

用过 tailwindcss 的同学都知道,tailwindcss 有指令系统,其中的 @layer components 指令可以把通用的样式 layer 到一个类上:

@layer components {
  .btn-blue {
    @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded;
  }
}

UnoCSS 有类似的更好用快捷方式来快捷实现这个功能:

shortcuts: [
  // you could still have object style
  {
    btn: 'py-2 px-4 font-semibold rounded-lg shadow-md',
  },
  // dynamic shortcuts
  [/^btn-(.*)$/, ([, c]) => `bg-${c}-400 text-${c}-100 py-2 px-4 rounded-lg`],
]

另外还有一个使用很频繁的指令 @apply,这个指令在以下两种情况下比较合适使用:

  • 有一个样式很多,很复杂的元素,直接写到标签里面会影响代码可读性
  • 同样的样式应用到很多元素上
<div text-lg text-pink-400 font-bold border-1 border-gray border-dashed rounded flex flex-warp items-center justify-evenly>
  我的样式很复杂的
</div>
<button text-green-500 rounded hover:text-lg shadow-md>查询</button>
<button text-green-500 rounded hover:text-lg shadow-md>提交</button>
<button text-green-500 rounded hover:text-lg shadow-md>取消</button>

就可以这么优化:

<div class="complex-node">
  我的样式很复杂的
</div>
<button class="btn">查询</button>
<button class="btn">提交</button>
<button class="btn">取消</button>

<style>
.complex-node {
  @apply text-lg text-pink-400 font-bold border-1 border-gray border-dashed rounded flex flex-warp items-center justify-evenly;
}
.btn {
  @apply text-green-500 rounded hover:text-lg shadow-md;
}
</style>

构建合并多个原子类到一个类

Compile class transformer

// install
pnpm add -D @unocss/transformer-compile-class

// uno.config.ts
import { defineConfig } from 'unocss'
import transformerCompileClass from '@unocss/transformer-compile-class'

export default defineConfig({
  // ...
  transformers: [
    transformerCompileClass(),
  ],
})

这个特性一般比较少用,也可以看下是什么作用,通过 :uno: 标记,可以最终编译为一个类:

<div class=":uno: text-center sm:text-left">
  <div class=":uno: text-sm font-bold hover:text-red"/>
</div>

最终编译的结果:

<div class="uno-qlmcrp">
  <div class="uno-0qw2gr"/>
</div>
.uno-qlmcrp {
  text-align: center;
}
.uno-0qw2gr {
  font-size: 0.875rem;
  line-height: 1.25rem;
  font-weight: 700;
}
.uno-0qw2gr:hover {
  --un-text-opacity: 1;
  color: rgba(248, 113, 113, var(--un-text-opacity));
}
@media (min-width: 640px) {
  .uno-qlmcrp {
    text-align: left;
  }
}

检查器,可以详细的预览我们项目中的所有原子类

我们在启动开发服务器之后,可以直接访问 localhost:5173/__unocss ​​​​​​​ 就会看到这个画面:

直接就可以看到所有的原子类,具体某个组件中的原子类,打包后的体积等信息。

你的项目太老也想用?安排!

有些同学可能还在维护很老的前端项目,但是也想用上 UnoCSS 来提升开发体验, UnoCSS 提供了 CDN 版本,在前端的入口 index.html 文件中添加一行代码就可以支持,并且还支持配置:

<script src="https://cdn.jsdelivr.net/npm/@unocss/runtime"></script>
<script>
// pass unocss options
window.__unocss = {
  rules: [
    // custom rules...
  ],
  presets: [
    // custom presets...
  ],
  // ...
}
</script>

VS Code 插件当然也有

UnoCSS - Visual Studio Marketplace

你以为到这里就结束了?

再来给你看个好东西!

Icons perset(unocss.dev)

可以在 UnoCSS 中轻松集成纯 CSS 图标,可以在这里查看所有可用图标,想用哪种就可以安装对应的包即可:

// uno.config.ts
import { defineConfig } from 'unocss'
import presetIcons from '@unocss/preset-icons'

export default defineConfig({
  presets: [
    presetIcons({ /* options */ }),
    // ...other presets
  ],
})

没有你们设计中意的图标,UI 自己设计的图标也可以轻松集成,首先安装工具:

pnpm install -D @iconify/utils

然后把设计老师给的 svg 图标文件放到一个文件夹,我这里就放到 src/assets/svg 中,然后想一个图标名称,这里就叫 icon 吧

// unocss.config.ts
import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders'
import {
  defineConfig,
  presetAttributify,
  presetIcons,
  presetUno,
} from 'unocss'

export default defineConfig({
  presets: [
    presetUno(),
    presetAttributify(),
    presetIcons({
      collections: {
        icon: FileSystemIconLoader(
          './src/assets/svg',
          svg => svg.replace(/#FFF/, 'currentColor'),
        ),
      },
      scale: 1.5,
      warn: true,
    }),
  ],
})

可以看到配置中 collections 里面有一个 icon 对象,这个名称就对应了我们刚才说的 icon 名称,对应的是一个 FileSystemIconLoader 方法,方法的第一个参数是你的图标在项目中的路径,我这里就是 ./src/assets/svg,按照相对路径就可以,也可以通过第二个参数做一些特殊预处理操作,具体可以看这个文档,这样配置完成之后,我们就可以在项目使用了。

比如我在 src/assets/svg 文件夹中放了一个 cancel.svg 的取消图标,我在页面上使用就可以这样写:

<div text-lg text-red inline-block i-icon:cancel />

其中的 i-icon 就是我们前面配置的自定义图标集的名称,冒号后面跟的就是你的 svg 图标的名称,可以通过样式改变图标的大小和颜色,是不是很酷。

丰富、灵活、开放的预设生态

UnoCSS 提供了丰富的预设,以支持不同风格体系的前端开发者,生态很完善,在 UnoCSS 发布之后我在很多项目中都应用实践过,基本可以覆盖所有样式场景。

总结

原子化 CSS 的理念早已不是新鲜事物了,​​​​​​​tailwindcss 、UnoCSS 这类解决方案把这个理念有了一个很好的实践和实现,可以真正的提升开发者体验和编码效率,都是很值得一学的技术。最后,有用请点赞,喜欢请关注,感谢您的关注。

标签:理由,text,UnoCSS,tailwindcss,unocss,import,图标,defineConfig
From: https://blog.csdn.net/2301_80826038/article/details/142492419

相关文章

  • 阅读《AI大模型开发之路》的十大理由
    作为一名技术博主,我最近读完了《AI大模型开发之路》这本书,深感这是一部值得推荐的佳作。如果你对AI大模型感兴趣,或者希望在这个领域有所提升,那么这本书绝对不容错过。以下是我推荐你阅读《AI大模型开发之路》的十大理由:1.全面覆盖AI大模型开发的各个方面从基础理论到实践应......
  • 在 Laravel 项目中使用 SCSS 和 TailwindCSS 代码示例
    在编码领域,人们经常意识到什么有效,什么无效,以及尽管是新事物,但什么可以带来明确的改变。在这个小教程中,我将向您展示将scsstailwindcss一起用于无数web应用程序的最简单的事情。这个强大的组合可以显着增强您的web开发工作流程并创建更易于维护的样式表。所以在开始之前先......
  • 使用 Nextjs Prisma、TailwindCSS 和 Next Auth 进行旅行预订
    旅行预订应用程序使用next.js14、tailwindcss、typescript和prisma进行中的旅行应用程序。允许用户注册、游览浏览、预订和评论提交。对开发过程中的所有贡献开放。入门克隆存储库:gitclonehttps://github.com/saidmounaim/travel-booking.git安装依赖项:npminstall......
  • 开车拒酒的10个理由为你守护生命之途
    酒,在生活中常常散发着独特的魅力。它可以是欢乐聚会中的助兴佳品,可以是朋友畅谈时的情感催化剂,也可以是庆祝成功时的热烈表达。然而,当酒与开车这一行为相遇,却可能引发不可挽回的灾难。在现代社会,汽车成为人们出行的重要工具,而开车拒酒则成为了我们每个人必须坚守的安全底线。......
  • vite tailwindcss@next omi
    pnpmi@tailwindcss/vite@[email protected]:{ "type":"module", "dependencies":{ "@tailwindcss/vite":"4.0.0-alpha.24", "omi":"^7.7.0", "tailwi......
  • tailwindcss学习:2 自定义类的使用和常见的tailwindcss前缀
    1.自定义类的定义在Tailwind CSS中,您可以通过 tailwind.config.js 文件定义自定义类。类似 border-custom-green 这种写法实际上是一个组合类,通常是由自定义类和内置类结合而成的。示例:自定义边框颜色假设您在 tailwind.config.js 中定义了一个自定义颜色://tailwi......
  • 案例库、最高院、法信裁判规则--表见代理中,善意无过失要求相对人有理由相信行为人有代
    1.(2016)赣民再111号 【2024-16-2-111-002】 江西某高速公路工程有限责任公司与献县某建材租赁站、贺某东租赁合同纠纷再审案裁判要旨:不能仅凭第三方在文本中盖章就径直推定其属于合同履约人;【案例库裁判要旨之一】案件事实: 2009年11月21日,租赁站与贺某东签订《碗扣支架租......
  • tailwindcss学习:1. vue项目配置 tailwindcss
    官网的配置是需要一个cli去生成一份CSS,我简单总结一下更加干货的配置办法:1.pnpmipostcssautoprefixertypescript2.配置postcss.config.cjsmodule.exports={plugins:{tailwindcss:{},autoprefixer:{},},};3.执行npxtailwindcssinit4.项目的sr......
  • 【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介
    文章目录前言适配人群专栏简介专栏亮点阅读方法定价理由品质承诺关于更新环境配置去噪概述文章目录资料汇总(持续更新中。。。)问题汇总(持续更新中。。。)前言先思考几个问题:你是否在全网苦寻【图像去噪(ImageDenoising)】的相关资料?你的目标是否是看懂【图像去噪(Image......
  • **为何HTTP请求方法如此重要?5个理由告诉你!**
    HTTP请求方法post向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。get请求指定的页面信息,并返回实体主体。delete请求服务器删除指定的页面。put从客户端向服务器传送的数据......