当前位置: 首页 > news >正文

vite+vue3 工程-SVG图标配置使用指南——vite-plugin-svg-icons 插件

概述

在 Vite 7 + Vue 3 项目中使用 vite-plugin-svg-icons 插件来管理和使用 SVG 图标的完整解决方案。通过该插件,可以实现 SVG 图标的按需加载、统一管理、自定义样式等功能,提供了一个高效且灵活的 SVG 图标系统。

vite-plugin-svg-icons 插件

vite-plugin-svg-icons 是一个专门为 Vite 打造的 SVG 图标解决方案,具有以下特点:

  • 按需加载: 只加载当前页面需要使用的图标,减少资源请求
  • 自动打包: 将所有 SVG 图标打包成 SVG Sprite,减少网络请求
  • 缓存优化: 支持浏览器缓存,提高加载性能
  • 灵活配置: 提供丰富的配置选项,满足不同场景需求
  • TypeScript: 完整的 TypeScript 类型支持
  • 开发友好: 支持热更新,开发体验优秀

安装依赖

npm install vite-plugin-svg-icons -D

项目结构

src/
├── assets/
│   └── icons/
│       ├── shoucang.svg
│       ├── dianzan.svg
│       └── fenxiang.svg
│       └── dashang.svg
├── components/
│   └── SvgIcon.vue
└── main.js

Vite 配置

// vite.config.js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import path from "path";export default defineConfig({plugins: [vue(),createSvgIconsPlugin({// 指定需要缓存的图标文件夹iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],// 指定symbolId格式symbolId: "icon-[dir]-[name]",// 自定义插入位置inject: "body-last",// 自定义dom idcustomDomId: "__svg__icons__dom__",}),],resolve: {alias: {"@": path.resolve(__dirname, "src"),},},
});

入口文件配置

// main.js
import { createApp } from "vue";
import App from "./App.vue";// 引入svg注册脚本
import "virtual:svg-icons-register";const app = createApp(App);
app.mount("#app");

SVG 图标组件

<!-- components/SvgIcon.vue -->
<template><svg:class="svgClass":style="{ width: size, height: size }"aria-hidden="true"><use :href="iconName" :fill="color" /></svg>
</template><script setup>
import { computed } from "vue";const props = defineProps({name: {type: String,required: true,},size: {type: [String, Number],default: "16px",},color: {type: String,default: "currentColor",},className: {type: String,default: "",},
});const iconName = computed(() => `#icon-${props.name}`);
const svgClass = computed(() => {if (props.className) {return `svg-icon ${props.className}`;}return "svg-icon";
});
</script><style scoped>
.svg-icon {display: inline-block;vertical-align: middle;fill: currentColor;overflow: hidden;
}
</style>

使用示例

<!-- App.vue -->
<template><div class="min-h-screen bg-gray-50 py-8"><div class="max-w-4xl mx-auto px-4"><div class="space-y-2"><!-- 收藏 --><div class="text-center"><h1 class="text-3xl font-bold text-gray-800 mb-4">收藏</h1><div class="flex items-center justify-center gap-8"><SvgIcon name="shoucang" size="32px" color="#ff6b6b" /><SvgIcon name="shoucang" size="64px" color="#ff6b6b" /><SvgIcon name="shoucang" size="96px" color="#ff6b6b" /><SvgIcon name="shoucang" size="128px" color="#ff6b6b" /></div></div><!-- 点赞 --><div class="text-center"><h1 class="text-3xl font-bold text-gray-800 mb-4">点赞</h1><div class="flex items-center justify-center gap-8"><SvgIcon name="dianzan" size="32px" color="#3b82f6" /><SvgIcon name="dianzan" size="64px" color="#3b82f6" /><SvgIcon name="dianzan" size="96px" color="#3b82f6" /><SvgIcon name="dianzan" size="128px" color="#3b82f6" /></div></div><!-- 分享 --><div class="text-center"><h1 class="text-3xl font-bold text-gray-800 mb-4">分享</h1><div class="flex items-center justify-center gap-8"><SvgIcon name="fenxiang" size="32px" color="#10b981" /><SvgIcon name="fenxiang" size="64px" color="#10b981" /><SvgIcon name="fenxiang" size="96px" color="#10b981" /><SvgIcon name="fenxiang" size="128px" color="#10b981" /></div></div><!-- 打赏 --><div class="text-center"><h1 class="text-3xl font-bold text-gray-800 mb-4">打赏</h1><div class="flex items-center justify-center gap-8"><SvgIcon name="dashang" size="32px" color="#f59e0b" /><SvgIcon name="dashang" size="64px" color="#f59e0b" /><SvgIcon name="dashang" size="96px" color="#f59e0b" /><SvgIcon name="dashang" size="128px" color="#f59e0b" /></div></div><!-- 添加类名 --><div class="text-center"><h1 class="text-3xl font-bold text-gray-800 mb-4">打赏</h1><div class="flex items-center justify-center gap-8"><SvgIcon name="shoucang" size="32px" className="custom-icon" /><SvgIcon name="dianzan" size="32px" className="custom-icon" /><SvgIcon name="fenxiang" size="32px" className="custom-icon" /><SvgIcon name="dashang" size="32px" className="custom-icon" /></div></div></div></div></div>
</template><script setup>
import SvgIcon from "@/components/SvgIcon.vue";
</script><style scoped>
:deep(.custom-icon:hover) {transform: scale(1.2);fill: #007bff !important;
}:deep(.custom-icon:hover path) {fill: #007bff !important;
}:deep(.custom-icon:hover *) {fill: #007bff !important;
}
</style>

常见问题

  1. 图标不显示:检查 SVG 文件路径是否正确,确认 vite-plugin-svg-icons 配置正确,检查是否正确引入 virtual:svg-icons-register
  2. 图标颜色无法修改:确保 SVG 文件中没有硬编码的 fill 属性,使用 fill="currentColor" 或移除 fill 属性。

vite+vue3工程-SVG图标配置使用指南——vite-plugin-svg-icons 插件 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

http://www.lryc.cn/news/598968.html

相关文章:

  • Vitest 用法详解及 Coverage Web 工具介绍
  • 工具篇之开发IDEA插件的实战分享
  • Nvidia Isaac Sim机械臂实验
  • Linux命令基础完结篇
  • Mysql大数据架构设计:当表中数据超过800万时,对数据表进行分表操作,以及分页查询优化详解
  • C++STL系列之set和map系列
  • Node.js 中的内置模板path
  • 【时时三省】(C语言基础)怎样定义和使用指向函数的指针变量
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十九天-模拟面试前
  • io_uring:Linux异步I/O的革命性突破
  • Web前端开发:JavaScript reduce() 方法
  • 亚马逊云科技:以云为翼,助你翱翔数字新天空
  • 【高等数学】第五章 定积分——第三节 定积分的换元法和分部积分法
  • Zookeeper的分布式事务与原子性:深入解析与实践指南
  • 暑假集训篇之并发处理①练习题
  • C语言转义字符‘\\‘‘ 解析与常见误区
  • SAP全自动化工具开发:Excel自动上传与邮件通知系统
  • Python字典get方法使用解析
  • Spring之SSM整合流程详解(Spring+SpringMVC+MyBatis)
  • Windows上用于跨平台开发的环境工具
  • 数据集成难在哪?制造企业该怎么做?
  • 神经网络实战案例:用户情感分析模型
  • DPO:大语言模型偏好学习的高效方案
  • 平时遇到的错误码及场景?404?400?502?都是什么场景下什么含义,该怎么做 ?
  • 前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)
  • Linux 磁盘挂载,查看uuid
  • OpenCV图像插值、边缘填充、图像掩膜、噪声消除实战指南
  • Effective Python 第16条:用get处理字典缺失键,避免in与KeyError的陷阱
  • 100条SQL语句分类精讲:从基础到进阶的实操指南
  • OpenGL绘制正方形、错误处理、统一变量、索引缓冲区