Vite 插件
该插件随 unocss 包一同发布。
安装
pnpm add -D unocssyarn add -D unocssnpm install -D unocss安装插件:
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
UnoCSS(),
],
})创建一个 uno.config.ts 文件:
import { defineConfig } from 'unocss'
export default defineConfig({
// ...UnoCSS 选项
})在主入口中导入 virtual:uno.css:
import 'virtual:uno.css'模式
该插件内置多种模式以实现不同的行为。
global(默认)
默认模式下,需要在入口文件中导入 uno.css。此模式为 build 与支持 HMR 的 dev 环境启用了多种 Vite 插件,生成的 CSS 会以全局样式注入到 index.html 中。
vue-scoped
该模式会将生成的 CSS 注入到 Vue SFC 的 <style scoped> 中,从而实现样式隔离。
svelte-scoped
svelte-scoped 模式现已移至独立包,参见 @unocss/svelte-scoped/vite。
shadow-dom
针对 Web 组件,由于 Shadow DOM 无法直接引用全局样式(除非使用 CSS 自定义属性),此模式会将生成的 CSS 内联到 Shadow DOM 中。使用时,只需将插件模式设置为 shadow-dom 并在每个 Web 组件样式块中添加 @unocss-placeholder 占位符即可。如果在 Vue SFC 中定义组件并希望添加自定义样式,可将占位符包裹在 CSS 注释中以避免 IDE 报错。
per-module(实验性)
该模式为每个模块生成独立的 CSS 文件,并可实现样式隔离。
dist-chunk(实验性)
该模式在构建时为每个代码块生成 CSS 文件,适用于多页应用(MPA)。
在开发者工具中编辑类名
由于按需生成机制可能导致开发者工具中暂未显示全部工具类,你可以在入口文件中添加以下代码,从而使开发者工具实时检测类名变化:
import 'uno.css'
import 'virtual:unocss-devtools'WARNING
请谨慎使用。底层使用 MutationObserver 监测类名变化,这可能导致开发环境与生产构建之间出现不一致。建议将动态生成的类添加到 白名单 中,或者为生产构建配置 UI 回归测试。
框架支持
部分 UI/应用框架可能需特殊配置以确保正常工作:
VanillaJS / TypeScript
在使用 VanillaJS 或 TypeScript 时,需要将 .js 与 .ts 文件扩展名加入 UnoCSS 扫描范围,参见从构建工具流水线中提取章节。
React
如果使用 @vitejs/plugin-react:
import React from '@vitejs/plugin-react'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
React(),
UnoCSS(),
],
}若使用 @unocss/preset-attributify,请从 build 脚本中移除 tsc。 且当将 @vitejs/plugin-react 与 @unocss/preset-attributify 同时使用时,务必确保 UnoCSS 插件位于 @vitejs/plugin-react 之前:
import React from '@vitejs/plugin-react'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS(),
React(),
],
}在 examples/vite-react 目录中提供了 React 示例项目,可参考其 package.json 与 Vite 配置。
Preact
如果使用 @preact/preset-vite:
import Preact from '@preact/preset-vite'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS(),
Preact(),
],
}或者使用 @prefresh/vite:
import Prefresh from '@prefresh/vite'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS(),
Prefresh(),
],
}若使用 @unocss/preset-attributify,同样请移除构建时的 tsc,并参考 examples/vite-preact 项目。
Svelte
使用 Svelte 时必须将 UnoCSS 插件置于 @sveltejs/vite-plugin-svelte 之前。 要支持 class:foo 以及 class:foo={bar} 的写法,需在 UnoCSS 配置中添加 extractorSvelte 选项:
import { svelte } from '@sveltejs/vite-plugin-svelte'
import extractorSvelte from '@unocss/extractor-svelte'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS({
extractors: [
extractorSvelte(),
],
/* more options */
}),
svelte(),
],
}SvelteKit
在 SvelteKit 中,同样需要添加 extractorSvelte 以支持 class:foo 与 class:foo={bar}:
import { sveltekit } from '@sveltejs/kit/vite'
import extractorSvelte from '@unocss/extractor-svelte'
import UnoCSS from 'unocss/vite'
/** @type {import('vite').UserConfig} */
const config = {
plugins: [
UnoCSS({
extractors: [
extractorSvelte(),
],
/* more options */
}),
sveltekit(),
],
}Web Components
对于 Web 组件,需要在 UnoCSS 插件中启用 shadow-dom 模式,并移除全局 uno.css 引入,否则应用将无法工作。
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS({
mode: 'shadow-dom',
/* 更多选项 */
}),
],
}在 Web 组件中,在样式块中添加 @unocss-placeholder 占位符:
const template = document.createElement('template')
template.innerHTML = `
<style>
:host { ... }
@unocss-placeholder
</style>
<div class="m-1em">
...
</div>
`如果你使用 Lit:
@customElement('my-element')
export class MyElement extends LitElement {
static styles = css` :host { ... }
@unocss-placeholder`
// ...
}有关 Web Components 示例,请参考 examples/vite-lit。
::part 内置支持
插件支持 ::part,可以使用 part-[<part-name>]:<rule|shortcut> 规则,在 Web 组件中使用(仅在 shadow-dom 模式下有效)。插件会使用 nth-of-type 避免多个 part 冲突。
例如:
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS({
mode: 'shadow-dom',
shortcuts: [
{ 'cool-blue': 'bg-blue-500 text-white' },
{ 'cool-green': 'bg-green-500 text-black' },
],
/* more options */
}),
],
}然后在 Web 组件中:
// my-container-wc.ts
const template = document.createElement('template')
template.innerHTML = `
<style>
@unocss-placeholder
</style>
<my-wc-with-parts class="part-[cool-part]:cool-blue part-[another-cool-part]:cool-green">...</my-wc-with-parts>
`// my-wc-with-parts.ts
const template = document.createElement('template')
template.innerHTML = `
<style>
@unocss-placeholder
</style>
<div>
<div part="cool-part">...</div>
<div part="another-cool-part">...</div>
</div>
`Solid
使用 Solid 时,需要将 vite-plugin-solid 插件放在 UnoCSS 插件之后:
import UnoCSS from 'unocss/vite'
import solidPlugin from 'vite-plugin-solid'
export default {
plugins: [
UnoCSS({
/* 选项 */
}),
solidPlugin(),
],
}Elm
使用 Elm 时,需要将 vite-plugin-elm 插件放在 UnoCSS 插件之前:
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'
import Elm from 'vite-plugin-elm'
export default defineConfig({
plugins: [
Elm(),
UnoCSS(),
],
})Legacy 模式
若使用 @vitejs/plugin-legacy 且配置了 renderModernChunks: false,则需要在 UnoCSS 选项中作相应配置:
import legacy from '@vitejs/plugin-legacy'
import vue from '@vitejs/plugin-vue'
import { presetUno } from 'unocss'
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
vue(),
UnoCSS({
presets: [presetUno()],
legacy: {
renderModernChunks: false,
},
}),
legacy({
targets: ['defaults', 'not IE 11'],
renderModernChunks: false,
}),
],
})许可证
- MIT 许可证 © 2021-PRESENT Anthony Fu