如何在uni-app中使用原子化 CSS——UnoCSS

news2024/11/14 14:12:48

原文地址:原文链接

一、前言

UnoCSS是一个即时的原子化 CSS 引擎,旨在灵活和可扩展。核心是不拘一格的,所有的 CSS 工具类都是通过预设提供的。

那么,UnoCSS 与其他框架的有何不同之处呢?

UnoCSS 由 Windi CSS 团队的成员创建,灵感来源于我们在 Windi CSS 中的工作。虽然 Windi CSS 在 2023 年 3 月停止了维护,但您可以将 UnoCSS 看作是 Windi CSS 的"精神继承者"。

UnoCSS 继承了 Windi 的按需自然样式、属性模式、快捷方式、变体组、编译模式等特性,并在此基础上构建了极具可扩展性和性能的 UnoCSS,从而引入了新的功能,如纯 CSS 图标、无值属性模式、标签化、Web 字体等。

最重要的是,UnoCSS 作为一种原子级 CSS 引擎,所有的功能都是可选的,并且可以轻松创建自己的约定、设计系统和预设 - 您可以选择需要的功能组合 。

Windi CSS 和 UnoCSS 都从Tailwind CSS中汲取了很多灵感。由于 UnoCSS 是从头开始构建的,因此我们可以很好地了解原子 CSS 是如何通过前期的艺术和抽象转化为优雅且强大的 API 的。虽然 Tailwind CSS 和 UnoCSS 有不同的设计目标,因此无法直接进行比较,但我们将列举一些差异:

Tailwind CSS 是一个 PostCSS 插件,而 UnoCSS 是一个具有多种一流构建工具集成的同构引擎(包括PostCSS 插件)。这意味着 UnoCSS 可以在不同的地方更加灵活地使用(例如,CDN 运行时,可以动态生成 CSS),并且可以与构建工具深度集成,提供更好的 HMR、性能和开发者体验(例如,Inspector)。

从技术上讲,抛开权衡不谈,UnoCSS 也被设计成完全可扩展和可定制化,而 Tailwind CSS 则更加偏向于一种观点。在 Tailwind CSS 上构建自定义设计系统(或设计令牌)可能会很困难,你无法真正摆脱 Tailwind CSS 的约定。而在 UnoCSS 上,您可以完全控制地构建几乎任何您想要的东西。例如,我们在一个单一的预设中实现了整个与 Tailwind CSS 兼容的工具,而且还有许多其他有趣哲学的社区预设。

UnoCSS 相较于 Tailwind CSS 的缺点是不支持 Tailwind 的插件系统或配置,这意味着从一个定制化程度很高的 Tailwind CSS 项目迁移可能会更加困难。这是一个有意的决策,旨在使 UnoCSS 高性能和可扩展。

二、安装及使用

2.1 环境
请确保您的node版本≥16。

// package.json
"dependencies": {
    "dayjs": "^1.11.12",
    "pinia": "^2.2.0",
    "pinia-plugin-persist-uni": "^1.3.1",
    "vite": "^5.3.5",
    "wot-design-uni": "^1.3.6"
},
"devDependencies": {
    "@uni-helper/vite-plugin-uni-components": "^0.0.9",
    "@unocss/transformer-directives": "^0.61.6",
    "unocss": "^0.61.6",
    "unocss-preset-weapp": "^0.61.1"
}

2.2 创建uno.config.ts

// uno.config.ts
import presetWeapp from 'unocss-preset-weapp'
import { extractorAttributify, transformerClass } from 'unocss-preset-weapp/transformer'
import { presetIcons } from 'unocss'

import transformerDirectives from '@unocss/transformer-directives'

const { presetWeappAttributify, transformerAttributify } = extractorAttributify()

export default {
  presets: [
    // https://github.com/MellowCo/unocss-preset-weapp
    presetWeapp(),
    // attributify autocomplete
    presetWeappAttributify(),
    presetIcons(),
  ],
  shortcuts: [
    {
      'border-base': 'border border-gray-500_10',
      'center': 'flex justify-center items-center',
    },
  ],
  transformers: [
    transformerDirectives({
      enforce: 'pre',
    }),

    // https://github.com/MellowCo/unocss-preset-weapp/tree/main/src/transformer/transformerAttributify
    transformerAttributify(),

    // https://github.com/MellowCo/unocss-preset-weapp/tree/main/src/transformer/transformerClass
    transformerClass(),
  ],
  theme: {
    color: {
      blue: 'rgba(22, 33, 255, 1)',
      red: '#e74c3c',
      sun: '#f1c40f',
      green: '#16a085',
    },
    border: {
      blue: 'rgba(22, 33, 255, 1)',
      red: '#e74c3c',
      sun: '#f1c40f',
      green: '#16a085',
    },
  },
}

2.3 创建vite.config.ts

// vite.config.ts
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import { resolve } from 'path';
import Components from '@uni-helper/vite-plugin-uni-components'
import { WotResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'

export default defineConfig(async() => {
    const UnoCss = await import('unocss/vite').then(i => i.default)
    return {
        plugins: [
            // make sure put it before `Uni()`
            Components({
                resolvers: [WotResolver()]
            }), 
            uni(),
            UnoCss()
        ],
        resolve: {
            alias: {
              '@': resolve(__dirname, './src'),
              '@components': resolve(__dirname, './src/components/'),
            },
        },
    }
});

注意:

unocss版本为0.58(不含)以后的版本在 vite.config.ts 中要使用如下的引入方式:

const UnoCss = await import('unocss/vite').then(i => i.default)

unocss版本为0.58(含)之前的版本使用如下方式引入:

import UnoCSS from 'unocss/vite';

2.4 main.ts中引入
最后在main.ts引入uno.css。

import 'uno.css';

三、使用

<view class="text-area">
    <text class="title text-32px color-red">Hello,uni-app</text>
</view>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142118.html

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

相关文章

奥维互动地图经纬度导入,再导出ovjsn再转化为kml格式

一、使用python将excel表中的经纬度换算成小数格式。 在文件上看到的经纬度是东经 1165′27.78″&#xff0c;北纬 2310′57.18″&#xff0c;要转化为116.09105,23.182550000000003 格式。如果要用vba编写函数&#xff0c;可能比较麻烦&#xff0c;为此我使用python来转化 i…

4.提升客户服务体验:ChatGPT在客服中的应用(4/10)

本文大纲旨在指导撰写一篇全面探讨ChatGPT如何通过优化客户服务流程、提供实际应用案例和用户反馈&#xff0c;以提升客户服务体验的深入博客文章。 引言 在当今竞争激烈的商业环境中&#xff0c;客户服务已成为企业成功的关键因素。优质的客户服务不仅能够增强客户满意度和忠…

编程辅助工具下一个热门应用场景是什么?(二)

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

DFS:深搜+回溯+剪枝实战解决OJ问题

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 排列、子集问题 1.1 全排列I 1.2 子集I 1.3 找出所有子集的异或总和 1.4 全排列II 1.5 字母大小写全排列 1.6 优美的排列 二 组合问题 2.1 电话号码的数字组合 …

Qt | AI+Qt6.5.3+ubuntu20.04+FFmpeg实现音视频编解码(播放一个中秋节快乐视频为例)

点击上方"蓝字"关注我们 01、下载 >>> FFmpeg下载官网:https://ffmpeg.org// 本次选择下载linux版本的 环境准备Qt6.5.3ubuntu+虚拟机FFmpeg

解决Visual Studio中OpenCV链接错误:LNK2019无法解析的外部符号

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 原因分析 错误提示 LNK2019: 无法解析的外部符号 表示在编译过程中&#xff0c;链接器找不到 OpenCV 的相关函数实现。这通常是由于以下原因引起的&#xff1a; 没有正确链接 OpenCV 库&…

[SaaS] FacyTech

Sora还没开源,但这家国产AIGC视频公司已经靠还原现实赚钱了我们找到了朱啸虎说“很酷”的公司https://mp.weixin.qq.com/s/rm_dylLhf4FP01c_hdU3Lw1.tryon 这图ootdiffusion+comfyui工作流吗?lora+controlnet openpose+ipa

数据结构—栈

栈 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;栈…

兰花种类识别系统源码分享

兰花种类识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

打印图案,输入一个整数表示输出的行数,也表示组成x的长度

//打印图案&#xff0c;输入一个整数表示输出的行数&#xff0c;也表示组成x的长度 //打印图案&#xff0c;输入一个整数表示输出的行数&#xff0c;也表示组成x的长度 //5 //*___* //_*_*_ //__* //-*-*- //*---*- #include<stdio.h> int main() {int i 3;int j 0,…

anaconda下载安装教程

anaconda是python的包管理器&#xff0c;通过它来安装python库比较方便快捷&#xff0c;可以使用conda或者pip命令进行安装。 微智启软件工作室最常用的是Anaconda3-2021.11-Windows-x86_64.exe这一个版本&#xff0c;当然如果你使用其他版本也可以&#xff0c;其他版本特别是最…

激光雷达点云处理—学习随记

一、激光雷达基本概念 激光雷达&#xff08;Light Detection and Ranging&#xff0c;LiDAR&#xff09;&#xff0c;是一种发射激光&#xff08;可见光-近红外&#xff09;于被瞄准物体表面并记录反射光被信号接收器接收到的时间以测定距离的方法。激光雷达通过以下公式确定物…

Redis学习以及SpringBoot集成使用Redis

目录 一、Redis概述 二、Linux下使用Docker安装Redis 三、SpringBoot集成使用Redis 3.1 添加redis依赖 3.2 配置连接redis 3.3 实现序列化 3.4 注入RedisTemplate 3.5 测试 四、Redis数据结构 一、Redis概述 什么是redis&#xff1f; redis 是一个高性能的&#xf…

电子电气架构---智能汽车应该是怎么样的架构?

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

rust GTK4 窗口创建与 wayland Subsurface (vulkan 渲染窗口初始化 (Linux) 上篇)

rust 有封装好的 GTK4 库 (gtk4-rs), 有封装好的 wayland 库 (wayland-rs), 有封装好的 vulkan 库 (vulkano), 单独使用其中的每一个, 都很简单. 但是, 把这些一起使用, 崩 !! 大坑出现了 ! 这个问题的难度超出了事先的预计 (所以原计划一篇文章分成了两篇), 而类似的事情在编…

【Elasticsearch系列九】控制台实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

谷粒商城のElasticsearch

文章目录 前言一、前置知识1、Elasticsearch 的结构2、倒排索引 (Inverted Index)2.1、 索引阶段2.2、查询阶段 二、环境准备1、安装Es2、安装Kibana3、安装 ik 分词器 三、项目整合1、引入依赖2、整合业务2.1、创建索引、文档、构建查询语句2.2、整合业务代码 后记 前言 本篇介…

【C/C++】程序的构建(编译)过程概述

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、预处理&#xff08;Preprocessi…

mac安装swoole过程

1.很重要的是得根据自己环境的php版本来选择swoole版本&#xff01;否则都是做无用功。 Swoole 文档 2.通常pecl install swoole是安装最新版本的&#xff0c;当然安装的方式很多种&#xff0c;这里选择编译安装&#xff0c;因为可以选择不同的swoole版本进行安装&#xff0c;…

鸿蒙开发入门day19-使用NDK接口构建UI(二)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 监听组件事件 绑定手势事件 单一手势 组合手势 顺序识别 互斥…