Vite Plugin
Vite 插件随 unocss 包一起提供。
安装
pnpm add -D unocss
yarn add -D unocss
npm install -D unocss
安装插件:
// vite.config.ts
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
UnoCSS(),
],
})
创建 uno.config.ts
文件:
// uno.config.ts
import { defineConfig } from 'unocss'
export default defineConfig({
// ...UnoCSS options
})
将 virtual:uno.css
导入到你的main.ts
文件中:
// main.ts
import 'virtual:uno.css'
模式
Vite 插件附带了一组可实现不同行为的模式。
global(默认)
这是插件的默认模式:在此模式下,你需要在入口点添加 uno.css
的导入。
此模式为 build
和 dev
启用一组 Vite 插件,并支持 HMR
。
生成的 css
将是注入到 index.html
上的全局样式表。
vue-scoped
此模式会将生成的 CSS 注入到 Vue 单文件组件(SFC)的 <style scoped>
中以进行隔离。
svelte-scoped
svelte-scoped
模式已移至其自己的包中,请参阅 @unocss/svelte-scoped/vite。
shadow-dom
由于 Web Components
使用 Shadow DOM
,因此无法直接从全局样式表设置内容样式(除非你使用 CSS custom properties
,否则这些内容会渗透到 Shadow DOM
),你需要将插件生成的 CSS 内联到 Shadow DOM
样式中。
要内联生成的 CSS,你只需将插件模式配置为 shadow-dom
,并在每个 Web 组件样式的 CSS 块上添加 @unocss-placeholder
占位符。如果你在 Vue 的单文件组件(SFC)中定义 Web 组件,并希望与 UnoCSS 一起定义自定义样式,则可以将占位符包含在 CSS 注释中,以避免 IDE 中出现语法错误。
per-module
(实验性)
此模式将为每个模块生成一个 CSS 表,可以限定作用域。
dist-chunk
(实验性)
此模式将为构建时的每个代码块生成一个 CSS 表,非常适合 MPA。
在 开发者工具(DevTools) 中编辑类
由于“按需加载(on-demand)”的限制,开发者工具(DevTools)无法识别那些你在源代码中尚未使用的类。因此,如果你想通过在开发者工具中直接更改类来尝试效果,只需在主入口文件中添加以下几行代码。
import 'uno.css'
import 'virtual:unocss-devtools'
WARNING
请谨慎使用它,在幕后我们使用 MutationObserver
来检测类更改。这意味着不仅你的手动更改,而且你的脚本所做的更改都将被检测到并包含在样式表中。当你根据脚本标记中的某些逻辑添加动态类时,这可能会导致开发和生产构建之间出现一些不一致。如果可能,我们建议将动态部件添加到 safelist 或为你的生产版本设置 UI 回归测试。
构架
某些 UI/App 框架有一些警告,必须修复这些警告才能使其正常工作,如果你使用以下框架之一,只需应用建议即可。
VanillaJS / TypeScript
使用 VanillaJS 或 TypeScript 时,需要添加 js 和 ts 文件扩展名以允许 UnoCSS 读取和解析内容,默认情况下排除 js 和 ts 文件,请查看 从构建工具管道中提取 部分。
React
如果你使用的是 @vitejs/plugin-react
:
// vite.config.js
import UnoCSS from 'unocss/vite'
import React from '@vitejs/plugin-react'
export default {
plugins: [
React(),
UnoCSS(),
],
}
如果你使用的是 @unocss/preset-attributify
,则应从 build
脚本中删除 tsc
。
如果你将 @vitejs/plugin-react
与 @unocss/preset-attributify
一起使用,则必须在 @vitejs/plugin-react
之前添加该插件。
// vite.config.js
import UnoCSS from 'unocss/vite'
import React from '@vitejs/plugin-react'
export default {
plugins: [
UnoCSS(),
React(),
],
}
你在 examples/vite-react 目录下有一个使用这两个插件的 React
示例项目,请检查 package.json
上的脚本及其 Vite 配置文件。
Preact
如果你使用的是 @preact/preset-vite
:
// vite.config.js
import Preact from '@preact/preset-vite'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS(),
Preact(),
],
}
或者如果你使用的是 @prefresh/vite
:
// vite.config.js
import Prefresh from '@prefresh/vite'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS(),
Prefresh(),
],
}
如果你使用的是 @unocss/preset-attributify
,则应从 build
脚本中删除 tsc
。
你在 examples/vite-preact 目录下有一个使用这两个插件的 Preact
示例项目,请检查 package.json
上的脚本及其 Vite 配置文件。
Svelte
你必须在 @sveltejs/vite-plugin-svelte
之前添加该插件。
要支持 class:foo
和 class:foo={bar}
,请添加插件并在 extractorSvelte
选项上配置 extractors
。
You can use simple rules with class:
, for example class:bg-red-500={foo}
or using shortcuts
to include multiples rules, see src/App.svelte
on linked example project below. 你可以将简单规则与 class:
一起使用,例如 class:bg-red-500={foo}
或使用 shortcuts
来包含多个规则,请参阅下面链接示例项目中的 src/App.svelte
。
// vite.config.js
import { svelte } from '@sveltejs/vite-plugin-svelte'
import UnoCSS from 'unocss/vite'
import extractorSvelte from '@unocss/extractor-svelte'
export default {
plugins: [
UnoCSS({
extractors: [
extractorSvelte(),
],
/* more options */
}),
svelte(),
],
}
Sveltekit
要支持 class:foo
和 class:foo={bar}
,请添加插件并在 extractors
选项上配置 extractorSvelte
。
你可以将简单规则与 class:
一起使用,例如 class:bg-red-500={foo}
或使用 shortcuts
来包含多个规则,请参阅下面链接示例项目中的 src/routes/+layout.svelte
。
// vite.config.js
import { sveltekit } from '@sveltejs/kit/vite'
import UnoCSS from 'unocss/vite'
import extractorSvelte from '@unocss/extractor-svelte'
/** @type {import('vite').UserConfig} */
const config = {
plugins: [
UnoCSS({
extractors: [
extractorSvelte(),
],
/* more options */
}),
sveltekit(),
],
}
Web Components
要使用 Web 组件,你需要在插件上启用 shadow-dom
模式。
不要忘记删除 uno.css
的导入,因为 shadow-dom
模式不会公开它并且应用将无法工作。
// vite.config.js
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS({
mode: 'shadow-dom',
/* more options */
}),
],
}
在每个 web component
上,只需将 @unocss-placeholder
添加到其样式 CSS 块中:
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
`
// ...
}
你在 examples/vite-lit 目录中有一个 Web Components
示例项目。
::part
内置支持
你可以使用 ::part
,因为该插件通过 shortcuts
支持它并使用 preset-mini
中的 part-[<part-name>]:<rule|shortcut>
规则,例如将其与 part-[<part-name>]:bg-green-500
等简单规则一起使用或使用某些 shortcut
: 检查下面链接的示例项目中的 src/my-element.ts
。
part-[<part-name>]:<rule|shortcut>
仅适用于使用 shadow-dom
模式的此插件。
该插件使用 nth-of-type
来避免与同一 Web 组件中的多个部分发生冲突,并且对于不同 Web 组件上的相同部分,你无需担心它,该插件会照顾你。
// vite.config.js
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 components 中:
// 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
你需要在 UnoCSS 插件之后添加 vite-plugin-solid
插件。
// vite.config.js
import solidPlugin from 'vite-plugin-solid'
import UnoCSS from 'unocss/vite'
export default {
plugins: [
UnoCSS({
/* options */
}),
solidPlugin(),
],
}
Elm
你需要在 UnoCSS 插件之前添加 vite-plugin-elm
插件。
// vite.config.js
import { defineConfig } from 'vite'
import Elm from 'vite-plugin-elm'
import UnoCSS from 'unocss/vite'
export default defineConfig({
plugins: [
Elm(),
UnoCSS(),
],
})
许可
- MIT 许可证 © 2021 年至今 Anthony Fu