ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

UnoCSS Autocomplete 引擎详解:@unocss/autocomplete 的模板 DSL、建议生成流程与 IDE 集成原理

UnoCSS Autocomplete 引擎详解:@unocss/autocomplete 的模板 DSL、建议生成流程与 IDE 集成原理 UnoCSS Autocomplete 引擎详解unocss/autocomplete 的模板 DSL、建议生成流程与 IDE 集成原理【免费下载链接】unocssThe instant on-demand atomic CSS engine.项目地址: https://gitcode.com/GitHub_Trending/un/unocssunocss/autocomplete是 UnoCSS 的自动补全工具包Autocomplete utils for UnoCSS它被内嵌于 UnoCSS Playground 和 VS Code 扩展中为 UnoCSS 类名提供实时的输入建议。读完本文你将掌握该包的公共 API 与可选参数、自动补全模板的 DSL 语法静态规则、动态规则meta配置、$theme推断、建议结果的生成与排序机制以及它在 Language Server / Playground 中的实际调用方式。包定位与基本信息根据 packages-engine/autocomplete/README.md 的说明unocss/autocomplete的定位是一句话UnoCSS 的自动补全工具集内嵌于 Playground 与 VS Code 扩展。官方使用文档位于 docs/tools/autocomplete.md。从 package.json 可以看到包的工程信息以当前仓库为准包名unocss/autocomplete当前仓库版本为66.10.0ESM 包type: module入口./dist/index.mjs类型声明./dist/index.d.mts运行时依赖只有两个fzffuzzy 匹配与lru-cache建议结果缓存均通过 pnpmcatalog:utils锁定版本对unocss/core仅作为devDependenciesworkspace:*引用因为createAutocomplete接受的是 core 生成的UnoGenerator实例。入口 src/index.ts 只做再导出create、parse、types、utils四个模块的公共 API 全部从这里暴露。核心 APIcreateAutocomplete包的唯一工厂函数是 src/create.ts 中的createAutocomplete(uno, options)参数与返回结构定义在 src/types.ts。选项 AutocompleteOptions选项类型默认值说明matchTypeprefix \| fuzzyprefix前缀匹配或模糊匹配。fuzzy模式基于fzf库tiebreakers 为byStartAsc匹配起始位置靠前优先与byLengthAsc更短优先throwErrorsbooleantrue模板解析出错误时是否抛出异常。Language Server 等长期运行场景通常传false见下文集成部分返回对象 UnocssAutocompleteexport interface UnocssAutocomplete { suggest: (input: string, allowsEmptyInput?: boolean) Promisestring[] suggestInFile: (content: string, cursor: number) PromiseSuggestResult | undefined templates: (string | AutoCompleteFunction)[] cache: LRUCachestring, string[] errorCache: Mapstring, AutocompleteParseError[] reset: () void enumerate: () PromiseSetstring }各成员的职责对应 src/types.ts#L35-L43suggest(input)给定一个正在输入的 token返回建议列表。空输入默认直接返回空数组除非显式传allowsEmptyInput truesuggestInFile(content, cursor)给定整个文件内容与光标位置定位当前正在编辑的 class 片段并给出带替换区间的建议IDE 补全的真正入口templates收集到的全部模板字符串模板 自定义函数可按需追加运行时动态模板cache容量为 5000 条的 LRU 缓存src/create.ts#L12避免对同一输入重复计算errorCache模板解析错误缓存配合throwErrors控制报错时机reset()清空全部缓存并重新从uno.config收集静态工具类与模板配置热更新后需要调用enumerate()以aa–zz及双字母组合为探针批量调用suggest并对命中结果再做一轮xxx-后缀展开用于穷举当前配置下可能存在的全部工具类。建议数据的四条来源通道suggest()的核心逻辑在 src/create.ts#L67-L114。它并非只做“字符串前缀过滤”而是分四条并行通道取建议再统一合并排序const result processSuggestions( await Promise.all([ suggestSelf(processed), // 1. 真实可解析 token suggestStatic(processed), // 2. 静态规则 静态快捷方式 suggestUnoCache(processed), // 3. 生成器已命中的缓存 token suggestFromTemplates(processed), // 4. 模板 DSL 展开 ]), variantPrefix, variantSuffix, )suggestSelf调用uno.parseToken(input, -)真实解析一次若 token 能产出 CSS则说明输入本身就是一个完整合法工具类直接把它列为首条建议这也是测试中ac.suggest(m-1)第一个结果就是m-1的原因见 test/autocomplete.test.ts#L46-L53suggestStaticreset()时从uno.config.rulesStaticMap的键与字符串形式的 shortcuts 收集出的静态工具类名默认按前缀过滤fuzzy模式下直接全量交给Fzf匹配suggestUnoCache通过uno.getCachedTokens(input)查询生成器内存中已经生成过 CSS 的 token——即“你在项目里用过的类”天然获得补全优先级suggestFromTemplates对reset()阶段解析好的全部模板逐一调用其suggest并额外执行用户以函数形式注册的自定义模板。这里用Promise.allSettled容错单个模板失败不会拖垮整个补全。Variant 的剥离与还原输入往往带有 variant 前缀如hover:m-。suggest先通过uno.matchVariants(_input)匹配出已存在的 variant把输入拆成variantPrefix 主体 variantSuffix三段只对“主体”做补全最后由processSuggestions把前后缀拼回src/create.ts#L81-L104。若 variant 会改写主体部分导致无法逆向定位源码中会回退到idx 0处理。此外若配置了unocss/preset-attributify会先根据 preset 的prefix选项剥离或还原 attributify 前缀。排序规则processSuggestionssrc/create.ts#L222-L233先uniq去重、过滤以-结尾和uno.isBlocked(i)命中 blocklist 的结果再用预编译的Intl.Collator(numeric: true)排序并让不含数字的建议排在含数字的建议之前——这解释了文档示例中输入b-时b-x、b-y会先于b-1、b-2出现。自动补全模板 DSL这部分是官方文档 docs/tools/autocomplete.md 的核心内容实现位于 src/parse.ts。静态规则零配置生效rules: [ [flex, { display: flex }] ]静态规则不需要任何额外配置——它们的名称会进入rulesStaticMap自动成为suggestStatic的数据源。动态规则meta 中的 autocomplete 字段动态规则正则匹配无法枚举需要在规则的第三个参数meta中提供补全模板rules: [ [ /^m-(\d)$/, ([, d]) ({ margin: ${d / 4}rem }), { autocomplete: m-num }, // -- 关键 ], ]从 core 的类型定义 看模板的合法来源有四处reset()时统一收集src/create.ts#L193-L198rules的meta.autocompleteshortcuts的meta.autocomplete同样支持数组variants的meta.autocomplete用户配置项config.autocomplete.templates。模板语法模板使用一套简单 DSL解析过程在parseAutocomplete(template, theme, extraShorthands)中完成(...|...)逻辑或分组以|分隔的候选值命中其中任意一项即可参与匹配...内建简写当前支持num、percent与directions。源码中的实际取值是src/parse.ts#L19-L24num展开为(0|1|2|3|4|5|6|8|10|12|24|36)percent展开为(0|10|20|…|100)percentage展开为(10%|20%|…|100%)directions展开为(x|y|t|b|l|r|s|e)$...theme 推断例如$colors会列出 theme 中colors对象的全部属性还支持点路径$colors.red之类的嵌套访问与|组合多个 theme 对象。解析时会过滤掉DEFAULT键与_前缀的私有键ignoredThemeKeys与getValuesFromPartTemplate中的过滤逻辑。另外theme 中嵌套的对象会被递归展开成key-subKey形式参与组合getValuesFromPartTemplate对对象值递归处理这就是bg-gradient-$colors之类模板能推出多级色阶的原因。自定义简写config.autocomplete.shorthands允许注册项目级简写值为字符串或数组——数组会用|连接并包上括号见 core 类型注释在parseAutocomplete中与内建简写合并后统一替换key占位符。遇到未知简写会记录Unknown template shorthand错误。官方文档示例以下示例完整继承自 docs/tools/autocomplete.md示例 1模板(border|b)-(solid|dashed|dotted|double|hidden|none)输入b-do建议b-dotted、b-double示例 2模板m-num输入m-建议m-1、m-2、m-3…示例 3模板text-$colors输入text-r建议text-red、text-rose…示例 4多模板[(border|b)-num, (border|b)-directions-num]输入b-得到b-x、b-y、b-1、b-2…输入b-x-得到b-x-1、b-x-2…注意排序上无数字项在前。解析后的模板被编译为ParsedAutocompleteTemplate一组partsstatic/group/theme三种类型加一个suggest闭包。前缀匹配走一套逐 part 状态机对 static 段做双向 startsWith 校验、group 段做精确前缀消费、theme 段支持嵌套对象回插fuzzy模式下则直接基于getAllCombination(parts)对各 part 取值做笛卡尔积见 src/utils.ts#L70-L83 的cartesian预生成全部组合再交给Fzf打分。错误处理模板解析错误封装为AutocompleteParseErrorsrc/parse.ts#L7-L17携带出错模板文本throwErrors: true时在reset()末尾把所有错误合并为一个 Error 抛出便于开发期尽早暴露配置问题。文件内补全suggestInFile 与提取器suggestInFile(content, cursor)src/create.ts#L116-L147是 Language Server 等集成方真正调用的入口流程为用searchAttrKey判断光标是否处于 HTML 属性值内部影响是否允许空输入依次尝试config.autocomplete.extractors中的自定义提取器extractor.extract({ content, cursor })提取器可以额外提供transformSuggestions与resolveReplacement把 class 风格建议转换成属性风格提取器未命中时走常规边界探测searchUsageBoundarysrc/utils.ts#L1-L61以空白、引号、、;等为界向外扩展出当前 token若启用 attributify preset 则直接返回该边界否则还要向前校验该 token 确实位于class、className或apply上下文中避免在无关文本里弹补全调用suggest得到建议并返回SuggestResult——包含[原始建议, 显示建议]对与一个resolveReplacement回调回调给出替换区间的start/end/replacementIDE 据此完成文本替换。配置侧对应config.autocomplete的三个字段packages-engine/core/src/types.ts#L519-L535templates自定义模板/函数、extractors自定义提取器、shorthands自定义简写。在 UnoCSS 生态中的实际调用从源码结构看仓库内有三类消费方Language ServerVS Code 扩展后端packages-integrations/language-server/src/capabilities/completion.ts 为每个UnocssPluginContext缓存一个createAutocomplete(ctx.uno, { matchType, throwErrors: false })实例matchType由用户设置决定并暴露resetAutoCompleteCache在配置变更时清理缓存。VS Code 扩展本体位于 packages-integrations/vscodePlaygroundplayground/src/composables/uno.ts 中同样基于该包构建实时补全文档站内搜索virtual-shared/docs/src/search.ts 使用它按配置枚举可用的工具类。测试与验证包的测试位于packages-engine/autocomplete/test/可在仓库根目录用 vitest 运行验证autocomplete.test.ts用presetWind3presetAttributify构建生成器验证m-1首条建议为自身、非法输入不被建议、blocklist 生效并对约 50 个前缀m-、bg-、text-red-等的建议快照做了断言快照文件在 test/snapshots/autocomplete.test.ts.snapautocomplete-fuzzy.test.ts验证matchType: fuzzy行为autocomplete-parse.test.ts覆盖模板 DSL 解析含错误模板用例autocomplete-utils.test.ts覆盖searchUsageBoundary/searchAttrKey的边界探测。其中主测试还演示了 shortcuts 携带动态模板的写法[/^bg-mode-(.)$/, ([, mode]) \bg-blend-${mode}, { autocomplete: [bg-mode-(color|normal)] }]与上文“动态规则”一节完全对应。许可unocss/autocomplete采用 MIT 许可MIT License © 2021-PRESENT Anthony Fu与仓库整体一致见 LICENSE。【免费下载链接】unocssThe instant on-demand atomic CSS engine.项目地址: https://gitcode.com/GitHub_Trending/un/unocss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表