news 2026/5/4 23:39:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
@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属性区分来源:

<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 框架:

<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 架构,核心逻辑通过useIconSelectcomposable 暴露,你可以完全自定义 UI。

4. Vite 插件自动生成类型

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

// vite.config.tsimport{fxDtsPlugin}from'@fuxishi/svg-icon/vite'exportdefaultdefineConfig({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/*包:

# 安装你需要的图标集pnpmadd@iconify-json/ep# Element Plus 图标pnpmadd@iconify-json/ant-design# Ant Design 图标pnpmadd@iconify-json/mdi# Material Design 图标pnpmadd@iconify-json/carbon# Carbon 图标# ... 更多图标集

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

快速上手

安装

pnpmadd@fuxishi/svg-icon

配置 Vite 插件

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

注册组件

// main.tsimport{createApp}from'vue'import{setupIcons}from'virtual:fx-svg-icon'importAppfrom'./App.vue'constapp=createApp(App)setupIcons(app)// 一行搞定:注册组件 + 加载图标数据 + 加载本地 SVGapp.mount('#app')

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

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

开始使用

<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 框架下的图标选择器效果:

  • Element Plus 示例
  • Naive UI 示例
  • AntDv Next 示例
  • TDesign 示例

适用场景

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

总结

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

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

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

链接

  • GitHub:https://github.com/Fuxi-zy/fx-svg-icons
  • npm:@fuxishi/svg-icon
  • 在线文档:https://fuxi-zy.github.io/fx-svg-icons/
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 23:35:34

ESP8266 AT指令连接网络时间服务器,给你的DIY时钟项目一个精准心跳(含常见错误码解析)

ESP8266 AT指令连接网络时间服务器&#xff1a;打造高精度DIY时钟的终极指南 当我在工作室调试第三个自制网络时钟时&#xff0c;突然意识到一个被多数教程忽略的关键问题——不同NTP服务器的响应速度差异能达到300ms以上。这个发现促使我系统性地测试了12个主流时间服务器&…

作者头像 李华
网站建设 2026/5/4 23:34:34

数据结构 时间空间复杂

目录 一、数据结构前言 1&#xff0c;数据结构 2&#xff0c;算法 3&#xff0c;数据结构和算法的重要性 二、算法效率 1&#xff0c;复杂度的概念 三、时间复杂度 1&#xff0c;大O 的渐进表示法 2&#xff0c;时间计算例题 四、空间复杂度 1&#xff0c;空间计算例…

作者头像 李华
网站建设 2026/5/4 23:32:28

百度网盘直链解析:3步告别限速,免费享受高速下载

百度网盘直链解析&#xff1a;3步告别限速&#xff0c;免费享受高速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的非会员下载速度烦恼吗&#xff1f;每…

作者头像 李华
网站建设 2026/5/4 23:27:33

2025届毕业生推荐的五大AI辅助论文网站实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现今学术环境当中&#xff0c;论文写作压力持续增大&#xff0c;好多研究者跟学生开始找寻AI…

作者头像 李华
网站建设 2026/5/4 23:27:30

2026最权威的十大AI辅助写作方案实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于当下的学术写作范畴之内&#xff0c;AI工具的运用展现出愈发广泛的情形。其应用范畴包含了…

作者头像 李华