本指南将引导您如何在 uni-app (Vue 3 版本) 项目中集成并配置 UnoCSS,一个即时、按需的原子化 CSS 引擎。
前置选择:项目类型
在开始之前,请根据您的项目需求做出选择:
- 独立前端项目: 如果您的项目仅包含前端部分,选择
uni-app即可。 - 包含后端管理: 如果您计划构建一个包含后端管理平台的完整项目,推荐直接使用
uni-admin,它已经集成了权限控制等多种常用功能。
注意,记得选择 vue3 的项目。
注意: 本指南默认您已创建了一个基于 Vue 3 的 uni-app 项目。
第一步:安装 unocss
首先,将 unocss 添加到您的项目开发依赖中。
pnpm add unocss -D
第二步:在 vite.config.ts 中引入
从 0.59.x 版本开始,UnoCSS 仅支持 ESM (ECMAScript Modules)。因此,我们需要在 Vite 配置文件中进行相应的调整。
// vite.config.ts
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
export default defineConfig(async () => {
// 动态导入 unocss/vite 插件
const UnoCSS = (await import('unocss/vite')).default
return {
plugins: [
uni(),
UnoCSS(), // 添加 UnoCSS 插件
],
}
});
注解: 此处使用
async/await和动态import()是因为unocss@0.59.x及以上版本已不再支持 CommonJS,必须以 ESM 的方式异步加载。
第三步:在 main.ts 中导入样式
为了让 UnoCSS 生成的样式在整个应用中生效,您需要在项目的主入口文件 main.ts 中导入虚拟的样式文件。
// main.ts
import { createSSRApp } from "vue";
import App from "./App.vue";
// 关键:导入由 UnoCSS 生成的虚拟 CSS 文件
import "virtual:uno.css";
export function createApp() {
const app = createSSRApp(App);
return {
app,
};
}
注解:
import "virtual:uno.css";这一行非常重要。它并非一个真实存在的文件,而是由UnoCSS插件在内存中生成的一个虚拟模块,包含了所有根据您的 class 名称按需生成的 CSS 规则。
第四步:创建并配置 unocss.config.ts
在项目根目录下创建一个 unocss.config.ts 文件,这是 UnoCSS 的核心配置文件。主要的配置项有 presets, transformers, rules, 和 shortcuts。
presets(预设) : 提供基础的原子化类名集合,例如presetUno提供了类似 Tailwind CSS 的默认工具类。transformers(转换器) : 提供额外的功能,如属性化模式 (<div text-center>) 等。rules(自定义规则) : 允许您创建自己的原子化类。您可以将一个或多个 CSS 声明定义为一个新的类名。shortcuts(快捷方式) : 这是rules的一个强大补充,允许您将多个已有的原子化类组合成一个新的、更语义化的类名,极大地提高开发效率和可维护性。
配置文件示例:
// unocss.config.ts
import { defineConfig, presetUno, presetAttributify, presetIcons } from "unocss";
export default defineConfig({
// 预设集合
presets: [
presetUno(),
presetAttributify(), // 启用属性化模式
presetIcons() // 启用图标预设
],
// 自定义规则
rules: [
// 在这里可以添加您的自定义规则,例如:
// ['m-1', { margin: '0.25rem' }]
],
// 自定义快捷方式
shortcuts: {
// 基础布局与标题
'section-box': 'p-[10px] bg-white rounded-[10px] shadow-[0px_5px_2px_0px_#F5F5F5] mb-[20px]',
'section-title': 'py-[12px] px-0 flex items-center justify-start',
'title-h2': 'text-[18px] text-[#333] mx-[6px] my-0',
'title-line': 'w-[4px] h-[12px] rounded-[10px] bg-[#2979ff]',
'font-universal-head': 'pt-[20px] pr-0 pb-[30px] pl-[20px] h-[85px] text-[26px] font-["PingFangSC-Semibold,_PingFang_SC"] font-semibold text-[#1c1c1c] leading-[37px] flex items-center',
// 常用组件样式及覆盖
'universal-background': 'bg-[#f8fafc]!', // ! 表示 !important
'uni-card-rounded': 'rounded-[10px]!', // 覆盖 uni-card 的圆角
'uni-section-forms-item': 'mb-[30px]!',
'table-content': 'mt-[16px]!',
'uni-repair-table-scroll': 'min-h-[calc(100vh-417px)]! box-border', // 简化复杂的 calc 计算
// 交互与状态
'u-image-pointer': 'cursor-pointer',
'opt-button': 'cursor-pointer p-2',
'enable-scroll': 'overflow-y-auto!',
}
});
注解:
shortcuts是 UnoCSS 的精髓之一。通过定义如section-box这样的快捷方式,您可以用一个类名来代替一长串的原子化类,使模板代码更加简洁、易读。这有助于在项目中形成一套统一的设计规范。