这套教程讲怎么从零做一个 sag-icons——一个多色调、状态感知、Web Component 的 SVG 图标库。
整套教程以 sag-icons 实际代码为例,每一步都能在仓库里找到对应文件。你读这套教程的目的不是"复制 sag-icons",而是理解它背后那些可以搬到任何图标库的设计决策。
sag-icons 的代码里有不少没写在注释里的决策:
data-tone 属性而不是 props 传色这些决策很难从代码反推。如果你只看 sag-icon.ts 那个不到 100 行的类,会觉得"就这?我也能写"——但真正难的是这些代码没写的部分:当时考虑过哪些方案、为什么放弃、踩过哪些坑。
这套教程就是把这些代码之外的东西讲清楚。
viewBox / stroke)sag-icons 的教程反过来:
vite.config.ts 只讲库模式那点配置是一个决策档案——把 sag-icons 做对的事和做错的事整理出来,让你在做自己的图标库时少走两年弯路。
data-* 属性做主题系统的套路exports 字段怎么设计才能既支持全量又支持按需| # | 章节 | 解决的问题 |
|---|---|---|
| 02 | 图标设计·Figma | 一个多色图标是怎么被画出来的 |
| 03 | 图标设计·Path | Figma 的 SVG 怎么变成 TS 里的字符串 |
| 04 | 包工程基础 | package.json / tsconfig / 打包工具怎么选 |
| 05 | Web Component 核心 | 自定义元素怎么写才"够用" |
| 06 | CSS 多色调系统 | 一个 CSS 文件驱动所有颜色状态 |
| 07 | 类型系统 | 让 <sag-icon name="..." /> 有自动补全 |
| 08 | 构建与发布 | 从 tsc 到 npm publish 的完整流水线 |
| 09 | 发布后迭代 | 加一个新图标的清单 + 后续路线 |
一句话:为"多色调 + 状态感知"UI 场景做的专项图标库。
具体来说,它解决一个非常具体的问题:
默认灰色。加个类激活:
激活的那个变成全彩色。整个状态切换不靠 props、不靠 JS 状态机、不靠 wrapper 组件——就一个 CSS 类。
这个看似简单的特性,背后其实是一整套设计决策:
data-tone 选择器,is-active 触发布尔变量)as const 派生 IconName,JSX 增强独立 .d.ts)每一章都会围绕一个这样的设计决策展开。
为了避免误会,先说清楚它不做的事:
react-sag-icons / vue-sag-icons / svelte-sag-icons)这些"不做的事"是有意的取舍,不是能力不够。教程每一章都会讲到取舍的理由。
如果你想自己做一个图标库:
如果你只是想知道"Web Component 怎么做图标库"或者"CSS 变量主题系统怎么搭":
可以单独读这两章,不必按顺序。
教程所有示例都对应 sag-icons 仓库的实际文件。每个章节末尾的"对应文件"小节会给出路径和行号。
仓库地址:github.com/JujiuYey/sag-icons
准备好就往下走。下一章我们从图标本身开始——一个多色图标是怎么在 Figma 里被画出来的。