Slidev 图标完全指南:在 Markdown 中直接调用任意开源图标库
2026/9/8 21:29:20 网站建设 项目流程

Slidev 图标完全指南:在 Markdown 中直接调用任意开源图标库

【免费下载链接】slidevPresentation Slides for Developers项目地址: https://gitcode.com/GitHub_Trending/sl/slidev

本文以 docs/features/icons.md 为主线,讲解 Slidev 如何基于unplugin-icons与 Iconify 数据源,让你安装对应@iconify-json/*包后即可在 Markdown 幻灯片里直接以<collection-icon />组件形式使用几乎全部开源图标集,并结合 packages/slidev/node/vite/icons.ts、packages/slidev/node/setups/unocss.ts 等源码说明其默认类名slidev-icon、集合解析路径与i-工具类机制的底层实现,帮助你在演示文稿中快速、可离线地嵌入并精细控制图标样式。

1. 工作原理:unplugin-icons + Iconify 数据源

Slidev 官方文档的原文定位是:安装对应包之后,你就能在 Markdown 中直接访问几乎所有开源图标集,能力由unplugin-icons与 Iconify 提供。

从源码结构看,这条链路的组成如下:

  • packages/slidev/node/vite/icons.ts 中,createIconsPlugin返回的就是unplugin-icons/viteIcons插件,并固定了两个默认配置:
    • defaultClass: 'slidev-icon':每个被解析出的图标组件都会自动带上这个 class;
    • collectionsNodeResolvePath: options.utils.iconsResolvePath:指定图标集合包(@iconify-json/*)的 Node 解析路径。
  • iconsResolvePath在 packages/slidev/node/options.ts 中初始化为[resolved.clientRoot, ...resolved.roots].reverse(),即优先在入口项目(你的 slides 目录)中查找已安装的图标集合包,找不到时再回退到主题等上层 roots——这就是“你在自己的dependencies里装了哪个集合,就能用哪个集合”的原因。
  • 该插件由 packages/slidev/node/vite/index.ts 在 Vite 插件链中统一挂载,属于 Slidev 内置插件之一(见 docs/custom/config-vite.md 中列出的内置插件清单)。

换句话说:Markdown 中写一个<mdi-account-circle />,构建时unplugin-icons会把它转换成一个渲染 SVG 的 Vue 组件,SVG 内容来自本地已安装的@iconify-json/mdi包,而非运行时请求任何 CDN——因此导出 PDF、离线放映场景下图标依然可用。

2. 命名规范与常用示例

图标命名遵循 Iconify 的{collection-name}-{icon-name}约定,即组件名 = 集合名 + 连字符 + 图标名。文档给出的代表性示例:

  • <mdi-account-circle />—— Material Design Icons,对应@iconify-json/mdi
  • <carbon-badge />—— Carbon Design 图标,对应@iconify-json/carbon
  • <uim-rocket />—— Unicons Monochrome,对应@iconify-json/uim
  • <twemoji-cat-with-tears-of-joy />—— Twemoji,对应@iconify-json/twemoji
  • <logos-vue />—— SVG Logos,对应@iconify-json/logos

此外文档提示:@iconify-json/tabler对应 Tabler 等集合;所有可用集合可通过 Icônes 与 Iconify 的在线目录检索(本仓库 skills/slidev/references/style-icons.md 中也给出了mdicarbonlogostwemoji等常见集合的速查清单)。

值得一提的是,Slidev 自身就在用这套机制:仓库 pnpm-workspace.yaml 的iconscatalog 固定了@iconify-json/carbon@iconify-json/mdi@iconify-json/ph@iconify-json/ri@iconify-json/svg-spinners五个集合的版本,并被 packages/slidev/package.json 与 packages/client/package.json 引用——这既保证了 Slidev 客户端内置 UI 图标可正常构建,也侧面说明了“装包即可用”这一前提在真实工程中的落地方式。

3. 安装:把图标集合放进 dependencies

文档提供了全平台包管理器的一键安装命令(把[the-collection-you-want]换成你要的集合名):

pnpm add @iconify-json/[the-collection-you-want]
npm install @iconify-json/[the-collection-you-want]
yarn add @iconify-json/[the-collection-you-want]
bun add @iconify-json/[the-collection-you-want]
deno add jsr:@iconify-json/[the-collection-you-want]

关键前提是:包必须安装在你幻灯片入口所在项目的dependencies中(与第 1 节iconsResolvePath的解析顺序一致)。安装完成后无需任何额外注册,直接在.md幻灯片或.vue布局/组件里书写<collection-icon />即可。

4. 样式控制:像普通 HTML 元素一样写 class

文档“Styling Icons”一节的原文示例是:

<uim-rocket /> <uim-rocket class="text-3xl text-red-400 mx-2" /> <uim-rocket class="text-3xl text-orange-400 animate-ping" />

图标本质是一个内联 SVG 元素,因此可以像其他 HTML 元素一样使用 UnoCSS 工具类控制大小、颜色、间距乃至动画。

其基线行为由默认类名决定:unplugin-icons注入的defaultClass: 'slidev-icon'(见 packages/slidev/node/vite/icons.ts)对应 packages/client/styles/index.css 中的样式:

.slidev-icon { display: inline-block; vertical-align: sub; line-height: 1em; }

这保证图标在文字行中呈内联块级显示并轻微下沉对齐,与正文混排时不会出现明显错位。你的class属性会追加在这个默认类之上,所以text-3xltext-red-400animate-ping等工具类都能直接生效——这正是官方示例中火箭图标能显示为 3xl 字号、红色、并做 ping 脉冲动画的机制。

5. 进阶:类名式图标(i- 前缀)与虚拟导入

除了组件语法,Slidev 的 UnoCSS 配置同样启用了图标能力。packages/slidev/node/setups/unocss.ts 在内置 UnoCSS 配置中注入了presetIcons,并复用同一个utils.iconsResolvePath解析集合路径,同时还内置了一个slidev集合(将 packages/client/assets/logo.svg 暴露为slidev:logo图标)。由此带来两种等价写法:

  1. 工具类写法:在任意class中写i-{collection}-{icon},例如class="i-carbon-logo-github"。Slidev 官方脚手架模板 packages/slidev/template.md 与演示 demo/starter/slides.md 中都同时出现了<carbon:edit />组件式与i-carbon:edit类名式两种用法(i-carbon:edit中的冒号分隔是 UnoCSS 的等价写法);
  2. 虚拟模块导入:在 TypeScript/Vue 文件中通过~icons/{collection}/{icon}导入组件。例如 docs/custom/config-context-menu.md 展示了在 setup 文件中import Icon3DCursor from '~icons/carbon/3d-cursor',再把它注册进右键菜单项——这说明图标不仅是 Markdown 语法糖,也可以作为普通 Vue 组件参与二次开发(布局、全局组件、setup 文件等)。

6. 高级定制:通过 slidev.icons 覆盖插件配置(可选)

unplugin-icons的完整选项通过SlidevPluginOptions.icons透传。packages/types/src/vite.ts 中其类型为ArgumentsType<typeof Icons>[0],即unplugin-icons插件本身的全部配置项;在 packages/slidev/node/vite/icons.ts 中,...pluginOptions.icons展开在默认配置之后,意味着你的自定义项可以覆盖默认值。

写法是在项目vite.config.ts中:

import { defineConfig } from 'vite' export default defineConfig({ slidev: { icons: { /* unplugin-icons 的选项,如 defaultLang、compiler 等 */ }, }, })

这与 docs/custom/config-vite.md 中“Configure Internal Plugins”一节属于同一机制。需要注意文档对该机制的明确警告:这是高级功能,覆盖内置插件的默认配置(包括第 4 节提到的defaultClass)可能导致应用行为变化,仅在明确需要时再调整。

7. 小结

能力语法前提
组件式图标(Markdown/Vue)<mdi-account-circle />项目dependencies安装@iconify-json/mdi
工具类式图标class="i-carbon-logo-github"同上(UnoCSSpresetIcons已内置启用)
TS/Vue 中导入组件import I from '~icons/carbon/3d-cursor'同上
样式控制class="text-3xl text-red-400 animate-ping"依赖slidev-icon默认内联对齐 + UnoCSS 工具类
覆盖插件行为vite.config.tsslidev.icons高级功能,会覆盖默认配置

整条链路——Markdown 组件语法 →unplugin-icons解析为 SVG 组件(默认带slidev-icon类)→ UnoCSSpresetIcons提供类名式等价物——全部围绕同一份本地@iconify-json/*数据源构建。理解这一点后,你在幻灯片、主题、布局乃至 setup 文件中都能以最低成本复用任意开源图标集,并且因为 SVG 在构建期内联,产物天然支持离线放映与 PDF 导出。

【免费下载链接】slidevPresentation Slides for Developers项目地址: https://gitcode.com/GitHub_Trending/sl/slidev

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询