提取
UnoCSS通过在代码库中搜索工具的使用情况,并根据需求生成相应的CSS。我们将这个过程称为提取(extracting)。
内容来源
UnoCSS支持从多个来源提取工具的使用情况:
- Pipeline – 从您的构建工具流程中提取正确的部分
- Filesystem – 通过读取和监视文件从您的文件系统中提取
- inline – 从内联的纯文本中提取
来自不同来源的工具使用情况将被合并在一起,并生成最终的CSS。
从构建工具流程中提取内容
这在 Vite 和 Webpack 的集成中得到支持。
UnoCSS将读取通过构建工具流程的内容,并从中提取工具的使用情况。这是最高效和准确的提取方式,因为我们只智能提取实际在您的应用程序中使用的工具使用情况,并且在提取过程中不进行额外的文件IO操作。
默认情况下,UnoCSS将从构建流程中的具有扩展名 .jsx、.tsx、.vue、.md、.html、.svelte、.astro 的文件中提取工具的使用情况,并根据需要生成相应的CSS。默认情况下,不包括 .js 和 .ts 文件。
要进行配置,您可以更新您的 uno.config.ts 文件:
1 | // uno.config.ts |
您还可以在文件中的任何位置添加 @unocss-include 魔术注释,以文件为基础,告诉 UnoCSS 扫描该文件。或者,在配置中添加 *.js 或 *.ts,以将所有 js/ts 文件包括在扫描目标中。
1 | // ./some-utils.js |
类似地,您还可以添加 @unocss-ignore 来跳过对文件的扫描和转换。
如果您希望 UnoCSS 跳过某个代码块而不进行提取,您可以使用成对的 @unocss-skip-start 和 @unocss-skip-end 来实现:
1 | <p class="text-green text-xl"> |
从文件系统中提取
在某些情况下,如果您使用的集成没有访问构建工具流程(例如,PostCSS 插件),或者您正在与后端框架进行集成且代码不经过构建流程,您可以手动指定要提取的文件。
1 | // uno.config.ts |
匹配的文件将直接从文件系统中读取,并在开发模式下进行更改监视。
从内联文本中提取
此外,您还可以从内联文本中提取工具的使用情况,这些文本可能来自其他地方。
您还可以传递一个异步函数来返回内容。但请注意,该函数只会在构建时调用一次。
1 | // uno.config.ts |
局限性
由于 UnoCSS 在构建时运行,这意味着只有静态呈现的工具才会生成并传递到您的应用程序中。在运行时动态使用或从外部资源获取的工具可能不会被应用。
安全列表
有时您可能希望使用动态的拼接,例如:
1 | <div class="p-${size}"></div> <!-- this won't work! --> |
由于 UnoCSS 在构建时使用静态提取,我们无法在编译时知道所有工具的组合情况。因此,您可以配置 safelist 选项来解决这个问题。
1 | // uno.config.ts |
生成对应的 CSS:
1 | .p-1 { padding: 0.25rem; } |
或者更灵活:
1 | // uno.config.ts |
如果您希望在运行时进行真正的动态生成,您可以查看 @unocss/runtime 包
黑名单
类似于 safelist,您还可以配置 blocklist 来排除某些工具的生成。不同于 safelist,blocklist 接受字符串进行精确匹配和正则表达式进行模式匹配。
1 | // uno.config.ts |
这将排除 p-1、p-2、p-3 和 p-4 的生成。这对于排除一些误报非常有用。