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

Vue3 + Vite + TypeScript SVG图标解决方案

在这里插入图片描述

文章目录

  • 前言
  • 一、安装依赖
  • 二、配置Vite插件 (vite.config.ts)
  • 三、创建SVG图标组件 (src/components/SvgIcon.vue)
  • 四、在main.ts中添加SVG注册
  • 五、图标使用示例
  • 总结


前言

项目中或多或少都会使用到图标,这里介绍一下使用 vite-plugin-svg-icons 插件实现高效管理SVG图标。
方案概述:

  • 使用 vite-plugin-svg-icons插件加载SVG图标
  • 创建可复用的SVG图标组件
  • 支持动态改变图标颜色和大小
  • TypeScript类型支持
  • 图标分类管理和演示页面

一、安装依赖

npm install vite-plugin-svg-icons -D

二、配置Vite插件 (vite.config.ts)

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'})]
})

三、创建SVG图标组件 (src/components/SvgIcon.vue)

<script setup lang="ts">
import { computed } from 'vue';const props = defineProps({name: {type: String,required: true},color: {type: String,default: 'currentColor'},size: {type: [String, Number],default: 16},className: {type: String,default: ''}
});const symbolId = computed(() => `#icon-${props.name}`);
const style = computed(() => {return {color: props.color,width: typeof props.size === 'number' ? `${props.size}px` : props.size,height: typeof props.size === 'number' ? `${props.size}px` : props.size};
});
</script><template><svg :class="className" :style="style"aria-hidden="true"><use :xlink:href="symbolId" /></svg>
</template>

四、在main.ts中添加SVG注册

import { createApp } from 'vue'
import App from './App.vue'
import 'virtual:svg-icons-register'; // 重要:注册SVG图标const app = createApp(App);
app.mount('#app');

五、图标使用示例

将SVG文件放入 src/assets/icons 目录下(文件名将自动作为图标名称)

<SvgIcon name="home" size="24" color="#42b883" class="icon-home" />

Vite会自动加载所有SVG文件并生成symbols


总结

​高性能​:SVG图标以精灵图(sprite)形式加载,减少HTTP请求
​按需使用​:只构建实际使用的图标
​类型安全​:通过TypeScript保证属性类型安全
​灵活定制​:支持动态设置颜色、大小和样式
​易于管理​:只需将SVG文件放入目录即可使用

相关文章:

  • 一款基于 React 的开源酷炫动画库
  • C指针总结复习(结合deepseek)
  • 71-Oracle Undo与Flashback管理(Guarantee设置)深度解析
  • 艾立泰数字化方案重塑汽车包装载具管理
  • oracle 表空间与实例妙用,解决业务存储与权限处理难题
  • C++11 static_assert(基于Boost库)从入门到精通
  • Halcon ——— OCR字符提取与多类型识别技术详解
  • STM32学习笔记
  • 全链接神经网络,CNN,RNN各自擅长解决什么问题
  • DataWhale-零基础络网爬虫技术(三、爬虫进阶技术)
  • 使用 catthehacker/ubuntu Docker 镜像部署 GitHub Actions 本地运行环境
  • SpringSecurity6(认证-前后端分离)
  • MATLAB GUI界面设计 第四章——图像的绘制与显示
  • 电路图识图基础知识-塔式起重机控制电路识图与操作要点(三十五)
  • 深入解析 Windows 文件查找命令(dir、gci)
  • 窗口函数的概念
  • 为什么android要使用Binder机制
  • 顶级思维方式——认知篇九(经典语录)《约翰·克利斯朵夫》
  • LangChain4j从入门到实战(一)
  • DeepSeek今天喝什么随机奶茶推荐器
  • 基于dijango的网站开发/网站怎么做优化排名
  • php旅游网站cms/营销型网站建设排名
  • 做地方网站论坛/品牌推广策略有哪些
  • 现在装修流行什么样的风格/seo优化推广工程师
  • 吉林票务通app/seo是什么意思电商
  • 模版网站可以做排名嘛/百度ai搜索引擎