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

完整教程:Vite React项目引入unocss 及 @unocss/preset-icons的使用

完整教程:Vite React项目引入unocss 及 @unocss/preset-icons的使用

文章目录

    • 安装相关npm包
    • 启用unocss
    • 重中之重!!!
    • 网上大部分的教程都没有指出来!!!
    • 一定要在全局引入unocss的样式文件 !!!
    • 一定要在全局引入unocss的样式文件 !!!
    • 一定要在全局引入unocss的样式文件 !!!
    • 创建unocss 配置文件 uno.config.ts
    • 使用svg图标

安装相关npm包

pnpm add -D unocss @unocss/preset-icons @iconify/utils

启用unocss

// vite.config.ts
import { defineConfig
} from "vite";
import react from "@vitejs/plugin-react-swc";
import unocss from "unocss/vite";
export default defineConfig({
plugins: [
react(),
unocss()
]
});

重中之重!!!

网上大部分的教程都没有指出来!!!

一定要在全局引入unocss的样式文件 !!!

一定要在全局引入unocss的样式文件 !!!

一定要在全局引入unocss的样式文件 !!!

import { createRoot
} from 'react-dom/client'
import App from './App.tsx'
import 'virtual:uno.css';
createRoot(document.getElementById('root')!).render(<App />)

创建unocss 配置文件 uno.config.ts

// uno.config.ts
import {
defineConfig,
presetAttributify,
presetIcons,
presetTypography,
presetWind3,
presetWebFonts,
transformerDirectives,
transformerVariantGroup,
} from "unocss";
import { FileSystemIconLoader
} from "@iconify/utils/lib/loader/node-loaders";
import fs from "fs";
// 本地SVG图标目录
const iconsDir = "./src/assets/icons";
// 读取本地 SVG 目录,自动生成 safelist
const generateSafeList = () =>
{
try {
return fs
.readdirSync(iconsDir)
.filter((file) => file.endsWith(".svg"))
.map((file) =>
`i-svg:${file.replace(".svg", "")
}`);
} catch (error) {
console.error("无法读取图标目录:", error);
return [];
}
};
export default defineConfig({
// 自定义快捷类
shortcuts: {
"wh-full": "w-full h-full",
"flex-center": "flex justify-center items-center",
"flex-x-center": "flex justify-center",
"flex-y-center": "flex items-center",
"flex-x-start": "flex items-center justify-start",
"flex-x-between": "flex items-center justify-between",
"flex-x-end": "flex items-center justify-end",
},
theme: {
colors: {
primary: "var(--el-color-primary)",
primary_dark: "var(--el-color-primary-light-5)",
},
breakpoints: Object.fromEntries(
[640, 768, 1024, 1280, 1536, 1920, 2560].map((size, index) =>
[
["sm", "md", "lg", "xl", "2xl", "3xl", "4xl"][index],
`${size
}px`,
])
),
},
presets: [
presetWind3(),
presetAttributify(),
presetIcons({
// 额外属性
extraProperties: {
display: "inline-block",
width: "1em",
height: "1em",
},
// 图表集合
collections: {
// svg 是图标集合名称,使用 `i-svg:图标名` 调用
svg: FileSystemIconLoader(iconsDir, (svg) =>
{
// 如果 `fill` 没有定义,则添加 `fill="currentColor"`
return svg.includes('fill="')
? svg
: svg.replace(/^<svg /, '<svg fill="currentColor" ');
}),
},
}),
presetTypography(),
presetWebFonts({
fonts: {
// ...
},
}),
],
safelist: generateSafeList(),
transformers: [transformerDirectives(), transformerVariantGroup()],
});

使用svg图标

下载的svg文件,放在src\assets\icons\add.svg
在这里插入图片描述

<div className="i-svg:add w-[10px] h-[10px]"></div>
http://www.sczhlp.com/news/9090/

相关文章:

  • 4.3 数据类型内置方法_可变类型(1)_列表
  • 数论进阶刷题柱
  • 数据湖与数据仓库的未来之争
  • 使用Redis 注意事项
  • DAY12 闭包函数 装饰器
  • 【转载】50个顶级的ChatGPT学术论文指令,强烈建议收藏!
  • The 2025 ICPC China Zhejiang Province Programming Contest
  • 构成回文数组
  • 视觉五阶段
  • 详细介绍:从0开始的中后台管理系统-5(userList动态展示以及上传图片和弹出创建用户表单)
  • CF1406D Three Sequences
  • 迪杰斯特拉
  • ESP32-WIFI-WebUI控制LED
  • 物联网架构全解析:华为“1+2+1”与格行随身WiFi,技术如何定义未来生活? - 教程
  • 2025.7.21 【B】CSP-J模拟赛8
  • 编译安装低版本的vapor toolbox
  • 如何运行matllab程序
  • 集训内容总结 day12:模拟赛 Round5
  • 机器学习公平性研究进展
  • 微PE工具箱制作PE系统以及解决所遇到的问题
  • MySQL的COUNT()方法慢的原因及优化方案
  • matlab开发最佳实践
  • 集训内容总结 day11:模拟赛 Round4
  • 贪吃蛇
  • 集训内容总结 day10:模拟赛 Round3
  • 设计备忘录
  • 洛谷P3722 [AHOI2017/HNOI2017] 影魔
  • 4.2 数据类型内置方法--不可变类型
  • 8.2每周总结
  • 故障处理:ORA-troubleshooting not JPPD cause View is a set query block