前言
在前面的两篇文章中,我们聊到了组件库的样式选型,以及如何通过插件化架构将 CLI 与模板解耦。今天,我们聊聊这套系统的核心——模板开发本身。
很多脚手架工具在追求“强大”的路上,往往会陷入复杂度的陷阱:要么需要开发者学习复杂的 AST 转换,要么需要编写晦涩的配置。而我一直坚持的原则是:一个好的工程化方案,应该让开发者感觉不到“新知识”的负担。
这就是为什么我最终选择了 Markdown 代码块 + Lodash Template 作为插件化的最后一公里。
一、 零学习成本:回归最原始的“所见即所得”
在我的插件系统中,开发一个新模板插件的过程极其自然。
- 像写代码一样写模板
如果你想定义一个 Sass 模板,你不需要操作任何 JSON 对象,只需要在一个 .md 文件里写下:
markdown
### Sass 样式模板
```scss
$prefix: '<%= prefix %>';
.#{$prefix}-<%= kebabCaseName %> {
display: flex;
color: var(--primary-color);
}
```
请谨慎使用此类代码。
为什么这样做?
- 天然高亮: 你在写这段模板时,编辑器会根据
scss标记提供完美的高亮和缩进。 - 无需逃逸: 你不需要处理复杂的字符串转义。Markdown 的代码块容器就像一个“沙箱”,它保护了模板语法的纯粹性。
- Lodash Template:老牌但无敌的动力源
我没有发明新的模板语法,而是直接使用了 Lodash Template。
它支持标准的 <%= %> 插值,也支持 <% if (...) { %> 逻辑判断。对于任何熟悉 JavaScript 的开发者来说,这几乎是零学习成本的。你可以在模板中自由使用 toUpperCase()、replace() 等原生 JS 方法来处理你的组件名。
二、 核心实现:极致轻量的字符串解析
正如前文所说,我并没有使用 AST,而是采用了字符串切割的策略。
- 为什么“字符串切割”就够了?
组件模板的本质是片段拼接。我们只需要识别出 Markdown 中的代码块起始位(```),提取中间的内容,然后将其作为原始字符串丢给 Lodash 处理。
这种实现方式不仅代码量极少(通常几十行正则或字符串逻辑即可搞定),而且极其稳健。它不关心你的 TS 语法是否合法,也不关心你的 Sass 是否用了最新的提案,它只负责变量替换。
- 格式化的“最后一步”
字符串拼接最容易产生的问题就是缩进混乱。
为了解决这个问题,我的 CLI 工具在完成模板渲染后,并不会直接退出,而是会调用宿主环境的 Prettier(如果存在)对生成的文件进行一次静默格式化。
- 结果: 模板插件只需关注逻辑,最终产出的代码依然整洁如手写。
三、 插件系统的价值:自由选择的权利
通过这一整套基于 Markdown 的插件化设计,我真正实现了选型的自由:
- 样式自由: 如果你想用 Sass,安装
@my-ui/plugin-sass;想换成 UnoCSS,只需切换到@my-ui/plugin-unocss。 - 框架自由: 逻辑模板(
.tsx/.vue)同样封装在 MD 插件中,CLI 核心逻辑无需改动一行代码。
这种 “样式可插拔、模板可视化、逻辑零成本” 的状态,才是理想中的组件库基础设施。
四、 总结:工程化的尽头是务实
回顾这三篇文章,我们从样式选型聊到架构解耦,再到模板载体的选择。这其中贯穿始终的逻辑只有一条:解决实际痛点,拒绝过度设计。
- 选型上: 我们选择 Sass + UnoCSS + CSS 变量,是因为它们在 2026 年的性能与灵活性之间达到了最佳平衡。
- 架构上: 我们借鉴 ESLint 实现插件化,是为了让 CLI 保持轻量,让模板获得自由。
- 实现上: 我们坚持使用 Markdown + 字符串解析,是为了保证模板的最优开发体验和可读性。
写在最后:
技术方案没有绝对的对错,只有是否契合当前的工程语境。这一套架构是我在长期实践中沉淀出的、最符合我直觉的解法。希望这些关于“解耦”与“务实”的思考,能给你在构建自己的工具链时带来一点启发。
本专栏到此结束。如果你对这套基于 Markdown 的组件生成方案有任何实现上的细节疑问,欢迎在评论区与我交流