ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

UnoCSS Svelte Extractor:从 Svelte `class:` 指令中提取原子类

UnoCSS Svelte Extractor:从 Svelte `class:` 指令中提取原子类 UnoCSS Svelte Extractor从 Svelteclass:指令中提取原子类【免费下载链接】unocssThe instant on-demand atomic CSS engine.项目地址: https://gitcode.com/GitHub_Trending/un/unocss导读在 Svelte / SvelteKit 项目中class:指令是条件式切换 CSS 类的惯用语法如class:text-orange-400{foo}而 UnoCSS 默认的extractorSplit基于空白与符号切分 token无法正确处理这类以class:开头、以{表达式}结尾的片段。unocss/extractor-svelte正是为此而生的专用提取器它只对.svelte文件生效把被默认提取器遗漏的class:指令还原为可用的原子类名。读完本文你将掌握该提取器的安装与配置、底层实现原理、在 SvelteKit 项目中的落地方式以及它与其他提取器的协作关系。class:指令Svelte 场景下需要专门提取器Svelte 提供class:指令用于按条件绑定类名div class:text-orange-400{foo} /class:text-orange-400表示当foo为真时为元素添加text-orange-400这个类。对于 UnoCSS 而言这行代码的真正意图是生成如下 CSS 规则.text-orange-400 { color: #f6993f; }问题在于UnoCSS 默认的extractorSplit实现在 split.ts使用正则/[\\:]?[\s;{}]/g按空白与引号、分号、花括号等符号把源码切成 token因此class:text-orange-400{foo}会被切分成class:text-orange-400与{foo}这类残缺片段——text-orange-400 永远不会作为独立 token 出现对应的样式也就不会被生成。这正是 Svelte Extractor 存在的意义。安装与配置安装以开发依赖的方式安装unocss/extractor-svelte四种主流包管理器均支持pnpm add -D unocss/extractor-svelteyarn add -D unocss/extractor-sveltenpm install -D unocss/extractor-sveltebun add -D unocss/extractor-svelte配置在项目根目录的uno.config.ts中通过extractors数组注册import extractorSvelte from unocss/extractor-svelte import { defineConfig } from unocss export default defineConfig({ extractors: [ extractorSvelte(), ], })需要注意与extractorDefault覆盖默认提取器的机制不同详见 config.tsextractors数组中的提取器会与默认的extractorSplit一起执行而不是替换它。也就是说默认切分逻辑仍然保留负责普通class...属性的提取Svelte 专用逻辑是叠加在之上的补充处理。关于提取器体系与extractorDefault的更多说明可参考 docs/config/extractors.md。底层原理一次针对.svelte文件的 token 二次加工从源码看unocss/extractor-svelte的实现非常精简完整源码见 src/index.tsimport type { Extractor } from unocss/core const rightTrimRe /$/ function extractorSvelte(): Extractor { return { name: svelte, order: 100, extract({ id, extracted }) { if (id id.endsWith(.svelte)) { const items Array.from(extracted) items.forEach((r) { if (r.startsWith(class:)) { extracted.add(r.slice(6).replace(rightTrimRe, )) extracted.delete(r) } }) } }, } } export default extractorSvelte逐段拆解其工作方式按文件类型过滤extract回调首先检查id参数只有以.svelte结尾的文件如App.svelte、SvelteKit 中的page.svelte才会进入后续处理其他文件一律跳过不影响其原有提取结果。读取已提取 tokenextracted是当前文件中所有已提取候选 token 的集合此时已经过默认extractorSplit的处理。识别class:前缀遍历每个 token命中class:开头的项——例如默认切分产生的class:text-orange-400。还原类名r.slice(6)去掉前 6 个字符即class:前缀再用rightTrimRe/$/裁掉末尾可能残留的等号得到干净的text-orange-400重新加入集合同时删除原始残缺 token。需要特别强调的是该提取器不参与token 的初次切分它是在extracted集合上做的二次加工。这解释了为什么它能正确处理class:text-[32px]{true}、class:data-[a~b]:text-red{cond}这类带任意值与变体的写法——切分阶段已经把它们整体保留为class:...形式的 token本提取器只需剥离前缀与尾缀。此外order: 100决定了它在提取器执行序列中的优先级默认extractorSplit的order为 0见 split.ts确保它在默认切分结果产出之后运行。提取器接口本身的完整定义name、order、extract(ctx)可参见 types.ts。测试用例印证行为与边界仓库自带的两组单元测试见 extractor-svelte.test.ts非常清晰地划定了该提取器的行为边界针对非.svelte文件走常规切分路径普通classtext-red border仍能提取出text-red变体写法sm:text-lg、带引号的class\bg-white\均不受影响而class:text-orange-400{foo}在这种情况下只会得到残缺的class:text-orange-400不会还原出text-orange-400。针对.svelte文件启用 Svelte 专用处理class:text-orange-400{foo}正确还原为text-orange-400含复杂表达式的class:text-gray-800{$page.url.pathname.startsWith(/test)}还原为text-gray-800任意值写法class:text-[32px]{true}还原为text-[32px]带数据属性变体的classdata-[a~b]:text-red依然正常保留。从测试可以确认一个关键事实该提取器不影响非.svelte文件的提取行为引入它是完全增量、无副作用的。在 SvelteKit 项目中的实战落地仓库的examples/sveltekit示例项目是官方给出的完整落地范本其 README.md 明确说明UsesextractorSvelteto be able to useclass:red-bg-200{true}in components。在 examples/sveltekit/src/routes/layout.svelte 中可以找到真实用例span class:logo{showLogo} in:fly{{ y: 200, duration: 2000 }} out:fade/span div class:bg-red-400{red}My BG Color should change/divclass:logo与class:bg-red-400这类写法正是依赖unocss/extractor-svelte才能被 UnoCSS 识别并产出对应样式。在实际项目中典型的工作流是在 SvelteKit / Vite Svelte 项目中安装unocss/extractor-svelte以及unocss主包在uno.config.ts中通过extractors数组注册extractorSvelte()在组件中直接使用class:util-name{condition}的条件类语法构建或启动开发服务器后条件类的原子样式即被自动提取、按需生成。注意事项仅对.svelte文件生效该提取器依据id后缀判断对.svelte.js、.svelte.ts或普通.js/.ts文件中的class:字符串不会处理如确有需要可参考 extractor-pug 等其他专用提取器的思路自行扩展。与默认提取器并存注册extractorSvelte()并不会禁用extractorSplit两类提取逻辑叠加运行请勿重复注册或误以为需要关闭默认提取器。适用版本前提本提取器以当前仓库源码版本号见 package.json为基准源码位于packages-presets/extractor-svelte构建产物为dist/index.mjs属零副作用sideEffects: false的纯函数模块可放心在 SSR 与构建期使用。小结unocss/extractor-svelte用约 20 行代码解决了 Svelte 生态中最典型的类名提取痛点它以.svelte文件为作用域在默认切分结果之上剥离class:前缀与尾部等号从而让条件类指令与 UnoCSS 的按需生成模型无缝衔接。无论是class:text-orange-400{foo}这种简单条件还是class:text-[32px]任意值与复杂表达式都能被正确还原为可用的原子类。【免费下载链接】unocssThe instant on-demand atomic CSS engine.项目地址: https://gitcode.com/GitHub_Trending/un/unocss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表