@fuxishi/svg-icon:一个 Vue 3 svg本地图标+iconify图标组件库,让图标管理不再头疼

@fuxishi/svg-icon:一个 Vue 3 图标组件库,让图标管理不再头疼

前言

在 Vue 3 项目中使用图标,你是不是也遇到过这些问题:

  • Element Plus 图标、Ant Design 图标、本地 SVG 图标......各用各的组件,用法不统一
  • 想做一个图标选择器,得自己从零写搜索、分页、弹窗逻辑
  • 本地 SVG 图标散落在各处,没有统一的命名规范和类型提示
  • 切换 UI 框架时,图标相关的代码基本要重写一遍
  • vite-plugin-svg-icons 等插件封装本地 SVG 图标组件,需要手动写注册逻辑、封装组件、处理命名,配置繁琐
  • unplugin-icons 虽然能自动导入图标,但和本地 SVG 图标、图标选择器是割裂的,还得自己拼方案
  • 现有方案要么只解决图标渲染,要么只解决本地 SVG 加载,缺少一个覆盖「渲染 + 本地 SVG + 图标选择器 + 类型提示」的完整方案

如果你有以上痛点,那 @fuxishi/svg-icon 可能正是你需要的。

GitHub:https://github.com/Fuxi-zy/fx-svg-icons

npm:https://www.npmjs.com/package/@fuxishi/svg-icon

在线文档:https://fuxi-zy.github.io/fx-svg-icons/

它是什么

@fuxishi/svg-icon 是一个 Vue 3 图标组件库,核心解决三个问题:

  1. 统一图标使用方式 --- 不管是 Iconify 图标集还是本地 SVG,都用同一个 <FxIcon> 组件
  2. 开箱即用的图标选择器 --- 内置 Element Plus、Naive UI、AntDv Next、TDesign 四套预设,自动检测当前 UI 框架
  3. Vite 插件自动生成类型 --- 精确到每一个图标名的 TypeScript 类型声明,IDE 输入 ep: 就能提示所有 Element Plus 图标

核心特性

1. 统一的图标组件 FxIcon

所有图标用同一个组件,通过 name 属性区分来源:

vue 复制代码
<template>
  <!-- Iconify 图标集 -->
  <FxIcon name="ep:edit" />
  <FxIcon name="ant-design:home-outlined" />

  <!-- 本地 SVG 图标 -->
  <FxIcon name="svg:star" />

  <!-- 自定义大小和颜色 -->
  <FxIcon name="ep:delete" :size="24" color="#f56c6c" />
  <FxIcon name="svg:heart" size="48px" />
</template>

size 支持数字和字符串,数字自动加 pxcolor 默认跟随文字颜色(currentColor)。

2. 本地 SVG 自动加载

只需要把 SVG 文件放到指定目录,Vite 插件会自动扫描并注册:

复制代码
src/assets/svgs/
  ├── star.svg              → svg:star
  ├── heart.svg             → svg:heart
  ├── common/
  │   └── batch-processing  → svg:common-batch-processing
  ├── statusCode/404/
  │   └── not-found-01.svg  → svg:statusCode-404-not-found-01
  └── editor/
      └── bold.svg          → svg:editor-bold

目录层级用 - 连接,多深的目录结构都能自动映射。不需要手动 import 每一个 SVG 文件。

3. 图标选择器 FxIconSelect

这是我最喜欢的功能。一个组件搞定图标选择,而且会自动检测你用的是哪个 UI 框架:

vue 复制代码
<template>
  <FxIconSelect v-model="selectedIcon" placeholder="请选择图标" />
</template>

<script setup>
import { ref } from 'vue'
const selectedIcon = ref('')
</script>

就这一行代码,它会自动:

  • 检测 UI 框架:Element Plus / Naive UI / AntDv Next / TDesign,自动匹配对应的组件预设
  • 按 Tab 分组:不同来源的图标自动分组(Element Plus 图标、Ant Design 图标、本地 SVG......)
  • 搜索过滤:支持模糊搜索图标名
  • 分页展示:每页 30 个图标,滚动加载

如果你用的 UI 框架不在预设列表中,也没关系。FxIconSelect 采用 Headless 架构,核心逻辑通过 useIconSelect composable 暴露,你可以完全自定义 UI。

4. Vite 插件自动生成类型

这是开发体验最好的部分。配置好插件后:

ts 复制代码
// vite.config.ts
import { fxDtsPlugin } from '@fuxishi/svg-icon/vite'

export default defineConfig({
  plugins: [
    vue(),
    fxDtsPlugin({
      svgGlobPattern: '/src/assets/svgs/**/*.svg',
      dtsDir: '@/types',
      splitDts: true,
    }),
  ],
})

插件会自动:

  1. 扫描 @iconify-json/*:读取你安装的所有图标集
  2. 扫描本地 SVG:根据 glob 模式扫描本地 SVG 文件
  3. 生成精确的类型声明:为每个图标名生成字面量类型

效果就是:在模板中输入 name="ep:" 后,IDE 会自动列出所有 Element Plus 图标名。不是 string 类型,而是精确到 "ep:edit" | "ep:delete" | "ep:search" | ... 的字面量联合类型。

安装了 @iconify-json/ep 就会生成 Element Plus 的类型,安装了 @iconify-json/ant-design 就会生成 Ant Design 的类型,完全按需。

5. 支持 Iconify 海量图标集

Iconify 是目前最大的开源图标集合,包含 100+ 图标集、200,000+ 图标。@fuxishi/svg-icon 支持所有 @iconify-json/* 包:

bash 复制代码
# 安装你需要的图标集
pnpm add @iconify-json/ep           # Element Plus 图标
pnpm add @iconify-json/ant-design   # Ant Design 图标
pnpm add @iconify-json/mdi          # Material Design 图标
pnpm add @iconify-json/carbon       # Carbon 图标
# ... 更多图标集

安装后在模板中就能直接使用,类型提示也会自动更新。

快速上手

安装

bash 复制代码
pnpm add @fuxishi/svg-icon

配置 Vite 插件

ts 复制代码
// vite.config.ts
import { fxDtsPlugin } from '@fuxishi/svg-icon/vite'

export default defineConfig({
  plugins: [
    vue(),
    fxDtsPlugin({
      svgGlobPattern: '/src/assets/svgs/**/*.svg', // 本地 SVG 目录
      dtsDir: '@/types',                            // 类型声明输出目录
      splitDts: true,                               // 按图标集拆分类型文件
    }),
  ],
})

注册组件

ts 复制代码
// main.ts
import { createApp } from 'vue'
import { setupIcons } from 'virtual:fx-svg-icon'
import App from './App.vue'

const app = createApp(App)
setupIcons(app) // 一行搞定:注册组件 + 加载图标数据 + 加载本地 SVG
app.mount('#app')

setupIcons 是由 Vite 插件生成的虚拟模块,它会自动:

  • 注册 FxIconFxIconSelect 全局组件
  • 加载所有已安装的 @iconify-json/* 图标数据
  • 通过 import.meta.glob 加载本地 SVG 图标

开始使用

vue 复制代码
<template>
  <FxIcon name="ep:home-filled" :size="32" color="#409eff" />
  <FxIcon name="svg:star" size="32px" />
  <FxIconSelect v-model="icon" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
const icon = ref('')
</script>

在线示例

以下是不同 UI 框架下的图标选择器效果:

适用场景

  • 后台管理系统 --- 图标选择器非常适合权限配置、菜单编辑等需要选择图标的场景
  • 组件库 / 设计系统 --- 统一的图标组件,支持多框架预设
  • 低代码平台 --- Headless composable 方便自定义 UI
  • 任何需要大量使用图标的 Vue 3 项目

总结

@fuxishi/svg-icon 的核心价值在于:

能力 说明
统一接口 Iconify 图标 + 本地 SVG 用同一个组件
图标选择器 内置 4 套 UI 框架预设,自动检测,Headless 可扩展
自动类型 Vite 插件扫描生成精确到图标名的 TypeScript 类型
零配置 SVG 放文件到目录即可使用,自动扫描和命名

如果你正在寻找一个 Vue 3 图标解决方案,不妨试试。

链接

相关推荐
Rkgua1 小时前
ESModule和Commonjs模块的区别
前端·javascript
江南十四行1 小时前
ReAct Agent 基本理论与项目实战(二)
前端·react.js·前端框架
用户600071819101 小时前
【翻译】React 如何乱序流式输出 UI,却仍保持最终顺序
前端
江南十四行2 小时前
AI Agent应用类型及Function Calling开发实战(三)
服务器·前端·javascript
GISer_Jing2 小时前
AI原生全栈架构理论体系:从分布式范式演进到全链路工程化理论基石
前端·人工智能·学习·ai编程
GISer_Jing2 小时前
从“切图仔”到“增长架构师”:AI时代营销前端的范式革命
前端·人工智能·ai编程
广州华水科技2 小时前
单北斗GNSS在水库变形监测中的应用与系统安装解析
前端
xingpanvip2 小时前
星盘接口开发文档:组合三限盘接口指南
android·开发语言·前端·python·php·lua
阿拉丁的梦2 小时前
blender最好的多通道吸色工具(拾取纹理颜色排除灯光)
前端·html