@iconify/tailwind4——一个纯构建时的 CSS 图标方案。
一句话原理
两个关键概念
Data URI:把图片塞进字符串
通常加载一张图需要发 HTTP 请求:%3C 就是 <,%3E 就是 >——标准的 URL 编码。每个图标大约 200–500 bytes,几十个图标对 CSS 体积的影响可以忽略。
Mask 模式:喷漆模板
这是理解整个方案的核心。mask-image 的原理就像喷漆模板:
- 在纸上剪出一个星星形状的洞(mask = SVG 图标形状)
- 盖在墙上喷漆(background-color = currentColor)
- 墙上出现一个有颜色的星星(最终渲染结果)
text-red-500 能改图标颜色——currentColor 跟随文本色变化,相当于换了一种喷漆颜色。
对于彩色图标(如 Emoji),插件会自动切换为 background-image 模式,直接展示原始 SVG 颜色。不过主流图标集(MDI、Lucide、Tabler)都是单色的,全部走 mask 模式。
插件怎么判断用哪种模式?
判断逻辑在@iconify/utils 的源码中,核心就一行:
| 条件 | 模式 | 原因 |
|---|---|---|
SVG 中有 currentColor | mask | 单色图标,用遮罩实现可变色 |
SVG 中没有 currentColor | background | 彩色图标,直接展示原始颜色 |
浏览器里实际长什么样?
在 DevTools 里看,一个图标就是一个普通的<span>:
性能与方案对比
先看优势:| 方面 | 说明 |
|---|---|
| 零运行时 JS | 纯 CSS,不加载任何 JavaScript |
| 按需生成 | 只有用到的图标才进入 CSS,天然 tree-shaking |
| 无网络请求 | SVG 内联在 CSS 的 Data URI 中 |
| 缓存友好 | 图标随 CSS 文件一起被浏览器缓存 |
| GPU 渲染 | mask-image 由浏览器原生 GPU 加速 |
| 方案 | 运行时 JS | 网络请求 | 可变色 | 体积控制 |
|---|---|---|---|---|
| @iconify/tailwind4 | 无 | 无 | 支持 | 按需生成 |
| @iconify/react | 有 | 无 | 支持 | 按需导入 |
| SVG sprite | 无 | 1 次 | 支持 | 需手动管理 |
| Icon font | 无 | 1 次 | 仅单色 | 全量加载 |
什么时候适合用?
如果你的项目满足以下条件,@iconify/tailwind4 是一个很好的选择:
- 使用 Tailwind CSS 4
- 以单色图标为主
- 追求零运行时开销
- 希望图标和样式统一管理,一个类名搞定
选对工具,少写代码。希望这篇文章帮你理解了 CSS 图标方案背后的原理。
