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),仅供参考

相关新闻

GKE 日志查询实战:基于 Cloud Logging LQL 的 GKE 资源类型、审计日志与 58 个可复用查询模式

GKE 日志查询实战:基于 Cloud Logging LQL 的 GKE 资源类型、审计日志与 58 个可复用查询模式

GKE 日志查询实战:基于 Cloud Logging LQL 的 GKE 资源类型、审计日志与 58 个可复用查询模式 【免费下载链接】skills Agent Skills for Google products and technologies 项目地址: https://gitcode.com/GitHub_Trending/skills29/skills 在 Google Kuber…

2026/9/13 21:44:16 阅读更多 →
以编程方式运行 marimo 后端:基于 ASGI 与 FastAPI 的应用集成部署指南

以编程方式运行 marimo 后端:基于 ASGI 与 FastAPI 的应用集成部署指南

以编程方式运行 marimo 后端:基于 ASGI 与 FastAPI 的应用集成部署指南 【免费下载链接】marimo A reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure…

2026/9/13 21:44:16 阅读更多 →
客服自动化实战:用Dify与浏览器自动化优化流程

客服自动化实战:用Dify与浏览器自动化优化流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 21:44:16 阅读更多 →

最新新闻

Authelia 官方路线图深度解析:从已落地特性到未来规划的完整技术演进指南

Authelia 官方路线图深度解析:从已落地特性到未来规划的完整技术演进指南

Authelia 官方路线图深度解析:从已落地特性到未来规划的完整技术演进指南 【免费下载链接】authelia The Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready. 项目地址: https://gitcode.com/GitHub_Tre…

2026/9/13 22:44:55 阅读更多 →
WGCLOUD支持哪些告警方式

WGCLOUD支持哪些告警方式

WGCLOUD支持企业微信、钉钉、飞书、邮件、Telegram机器人等方式 具体说明如下 告警通知和报警配置说明 - WGCLOUD

2026/9/13 22:44:55 阅读更多 →
Authelia 配置键生成命令 authelia-gen code keys 完全指南

Authelia 配置键生成命令 authelia-gen code keys 完全指南

Authelia 配置键生成命令 authelia-gen code keys 完全指南 【免费下载链接】authelia The Single Sign-On Multi-Factor portal for web apps. OpenID Certified™ and Post-Quantum Cryptography Ready. 项目地址: https://gitcode.com/GitHub_Trending/au/authelia 导…

2026/9/13 22:44:55 阅读更多 →
Wave Terminal 文档站点构建指南:基于 Docusaurus 的本地开发、生产构建与自动化部署

Wave Terminal 文档站点构建指南:基于 Docusaurus 的本地开发、生产构建与自动化部署

Wave Terminal 文档站点构建指南:基于 Docusaurus 的本地开发、生产构建与自动化部署 【免费下载链接】waveterm An open-source, AI-integrated, cross-platform terminal for seamless workflows 项目地址: https://gitcode.com/GitHub_Trending/wa/waveterm …

2026/9/13 22:44:55 阅读更多 →
用最自然的思路理解红黑树——第一章:解构Insert

用最自然的思路理解红黑树——第一章:解构Insert

摘要:本文系统讲解红黑树插入操作中的调整方法,围绕节点命名、黑色高度(bh)等基础概念,重点分析插入后可能出现的六种情况。文章以叔叔节点(u)的存在性与颜色、以及相对位置(同侧异侧…

2026/9/13 22:44:55 阅读更多 →
turbovec 2-bit 搜索性能爬山优化(Hill-Climb):目标度量、三道闸门与验证方法论

turbovec 2-bit 搜索性能爬山优化(Hill-Climb):目标度量、三道闸门与验证方法论

turbovec 2-bit 搜索性能爬山优化(Hill-Climb):目标度量、三道闸门与验证方法论 【免费下载链接】turbovec A vector index built on TurboQuant, written in Rust with Python bindings 项目地址: https://gitcode.com/GitHub_Trending/tu…

2026/9/13 22:43:55 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →