UnoCSS基础配置记录

1,288 阅读1分钟

最近开始实习了,下班后写点小玩具项目练练手,顺便学点新东西,之前用TailwindCSS挺多,这段时间打算学一学另一个原子化CSS引擎——anfu大佬的号称比TailwindCSS更快,功能更强的UnoCSS。文档的的基础配置写的比较齐全,可以直接去看UnoCSS英文官方文档,UnoCSS的原子样式并没有像TailwindCSS那样详细地写在文档里,不过它的原子样式和WindCSS很像,并且官方也提供了交互式文档,可以直接查阅,另外,官方还提供了一个练习场,学习或者写demo测试,可以在练习场进行,很方便。

写下这篇记录时,我使用的UnoCSS版本是: 0.58.2

其实官方文档在配置这块还是写得比较清楚了,基本配置时候就照着官方文档一个一个写就行,注意别手瓢把配置文件名打错了。

目前的简单配置文件模板

uno.config.ts

import {
    defineConfig,
    presetAttributify,
    presetTypography,
    presetIcons,
    presetUno,
    transformerDirectives,
    transformerVariantGroup,
} from 'unocss'

import { IconifyIconCustomisations } from '@iconify/utils'

export default defineConfig({
    content: {
        pipeline: {
            // 将.vue、.ts文件纳入UnoCSS扫描, 这样就可以在其中动态使用原子样式、包括动态icon
            include: [
                /\.(vue|ts)($|\?)/,
            ]
        }
    },
    // 自定义一组样式的缩写
    shortcuts: {
        "wh-full": "w-full h-full",
        "f-col": "flex flex-col",
        'f-row': 'flex flex-row',
    },
    // 配置规则
    rules: [

    ],
    // 设置一些主题, 比如, 你可以在颜色里设置全局通用的颜色并取别名
    theme: {
        colors: {
            // ...
            // 设置color上, 你可以使用各种颜色编码
            success: '#1cdd74',
            // 你也可以使用一系列根元素上定义好的CSS变量
            error: 'rgb(var(--error-color))'
        },
        // 设置断点, 用于移动端适配, 不考虑适配PC,因为这个项目只是移动端,所以只考虑H5和平板
        // 但需要注意的是, 这里的设置会覆盖全局, 如果这里没有设置, 那么可以使用默认的所有断点
        // 如果这里进行了设置, 那么就只能使用这里设置的断点, 例如, 这里没有配置xl,开发中就不可以使用xl断点了
        breakpoints: {
            sm: '640px',
            md: '768px',
            lg: '1024px',
        }
    },
    presets: [
        presetUno(),
        // 令样式可属性化, 不用全部写在class里, 便于组织
        presetAttributify(),
        // 预设图标, 可用图标集npm包需要自己去npm查找
        /**
         * @description 支持使用的图标集
         * @link https://www.npmjs.com/search?q=%40iconify-json
         */
        presetIcons({
            // 自定义图标样式的前缀
            prefix: ['i-'],
            collections: {
                // 使用tabler图标集: https://icones.js.org/collection/tabler
                // 配置集合缩写名为tb
                // 图标使用格式: i-tb-<icon> 或者 i-tb:<icon>
                tabler: () => import('@iconify-json/tabler/icons.json').then(i => i.default)
            },
            extraProperties: {
                'display': "inline-block",
                'vertical-align': 'middle'
            },
            /**
             * @description 图标自定义配置项的类型文档
             * @link https://iconify.design/docs/libraries/utils/icon-customisations.html
             */
            customizations: {
                // 在这里配置图标的全局通用基本样式, 比如统一宽高
                customize(props: Required<IconifyIconCustomisations>) {
                    props.width = '2em';
                    props.height = '2em'
                    return props
                },
                // 对特定的图标自定义
                iconCustomizer(collection, icon, props) {
                    // 判断collect和icon, 然后设置props, 不需要返回值
                }
            }
        }),
        presetTypography(),
    ],
    transformers: [
        // 配置需要的转换器, 比如使用类似TailwindCSS的@apply指令、比如支持jsx/tsx文件等
        transformerDirectives(),
        transformerVariantGroup(),
    ],
})

注意事项

其他的都好说,跟着文档按需配置就行,主要是图标集需要注意,因为官方文档没有给出哪些图标集对应的json包的名字是什么,也没有给出支持的图标集的缩写名是什么,不过既然需要从npm下载,那我们就可以去npm官网找到答案

图标集

相关资源

动态设置icon

当我们需要动态渲染侧边栏或者tabbar时,免不了动态渲染图标。对于这个需求,比较推荐以下两种方案:

  • 在ts文件顶部使用// @unocss-include将其中的图标集纳入UnoCSS扫描范围,再将其引入main.ts,这样配置的动态图标集就可以正常使用

    // @unocss-include
    // 动态绑定到class上的图标
    const iconsList = [
        'i-tabler:brand-google-home',
        'i-tabler:align-box-left-stretch'
    ]
    
  • 在配置文件中将需要使用动态图标的文件纳入扫描范围, 可以使用正则进行匹配,也可以写需要被扫描的文件的路径

    // uno.config.ts
    export defineConfig({
        // ...
        content:{
            pipeline:{
                include:[
                    "src/views/hello/index.vue",  // 可以直接写指定文件的路径
                    /\.(vue|ts)($|\?)/, // 也可以配置正则匹配规则
                ]
            }
        }
    })
    

暂时先这样吧,占坑