程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

  • Vue3

  • vue3 + TS 项目集成

    • 集成element-plus
    • 项目配置 src 别名
    • 项目配置环境变量
    • 项目集成 SVG 图标
      • 1. 安装 SVG 插件
      • 2. 在 Vite 中配置 SVG 插件
        • 修改 `vite.config.ts`
      • 3. 在项目入口 `main.ts` 中引入插件
      • 4. 创建 SVG 全局组件
      • 5. 全局注册 SVG 组件
      • 6. 在 Vue 组件中使用 SVG 图标
    • 项目集成 SASS(SCSS)
    • 项目集成 Mock 数据
    • 项目集成axios二次封装
    • 项目集成 vite调试工具
    • 项目集成自动注册组件
    • 项目集成自动导入 API
  • Vue全家桶
  • vue3 + TS 项目集成
scholar
2025-04-30
目录

项目集成 SVG 图标

# 项目集成 SVG 图标

在项目开发过程中,我们经常会用到 SVG 矢量图标,相比传统的 img 图片,SVG 图标具有以下优势:

  • 更小的体积,减少资源占用,提升页面性能。
  • 支持 CSS 颜色、大小修改,无需重新加载资源。
  • 可作为组件使用,支持动态变化,扩展性更强。

在 Vue3 + Vite 项目中,我们可以使用 vite-plugin-svg-icons 插件来高效管理 SVG 图标库,并封装成 全局组件 供项目使用。


# 1. 安装 SVG 插件

首先,我们需要安装 vite-plugin-svg-icons 这个 Vite 插件:

pnpm install vite-plugin-svg-icons -D
1

如果你的项目使用 npm 或 yarn,可以使用:

npm install vite-plugin-svg-icons -D
# 或
yarn add vite-plugin-svg-icons -D
1
2
3

📌 说明

  • vite-plugin-svg-icons 允许我们将 SVG 文件 作为 组件 直接使用,而不需要额外的 img 标签。

# 2. 在 Vite 中配置 SVG 插件

我们需要在 vite.config.ts 中注册插件并指定 SVG 图标的存放目录。

# 修改 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({
      // 指定存放 SVG 图标的目录
      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
      // 定义 symbolId 格式
      symbolId: 'icon-[dir]-[name]',
    }),
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

📌 说明

  • iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')]
    
    1
    • 指定存放 SVG 图标 的目录,所有 SVG 图标文件必须放入 src/assets/icons/ 目录下。
  • symbolId: 'icon-[dir]-[name]'
    
    1
    • 生成的 <symbol> ID 规则

      ,例如

      src/assets/icons/user.svg
      
      1

      在 HTML 里会被注册为:

      <symbol id="icon-user"></symbol>
      
      1

# 3. 在项目入口 main.ts 中引入插件

在 main.ts 中,我们需要注册 SVG 图标库,让 vite-plugin-svg-icons 生效。

修改 main.ts

import { createApp } from 'vue';
import App from './App.vue';
import 'virtual:svg-icons-register'; // 引入 vite-plugin-svg-icons 生成的图标
const app = createApp(App);
app.mount('#app');
1
2
3
4
5

📌 说明

  • 'virtual:svg-icons-register' 这个虚拟模块用于加载 SVG 图标,必须在入口文件 main.ts 中引入。

# 4. 创建 SVG 全局组件

为了让 SVG 图标在项目中更加易用、可复用,我们可以封装成全局组件。

创建 src/components/SvgIcon/index.vue

<template>
  <svg :style="{ width: width, height: height }">
    <use :xlink:href="prefix + name" :fill="color"></use>
  </svg>
</template>

<script setup lang="ts">
defineProps({
  // SVG 图标的前缀(vite-plugin-svg-icons 生成)
  prefix: {
    type: String,
    default: '#icon-'
  },
  // SVG 图标名称
  name: {
    type: String,
    required: true
  },
  // 颜色
  color: {
    type: String,
    default: ''
  },
  // 宽度
  width: {
    type: String,
    default: '16px'
  },
  // 高度
  height: {
    type: String,
    default: '16px'
  }
});
</script>

<style scoped></style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

📌 说明

  • prefix: '#icon-' 需要与 vite-plugin-svg-icons 配置的 symbolId 规则一致。
  • 组件支持 传递颜色、大小,以便适应不同需求。

# 5. 全局注册 SVG 组件

为了在项目的任意组件中都能使用 SvgIcon,我们需要全局注册它。

创建 src/components/index.ts

import SvgIcon from './SvgIcon/index.vue';
import type { App, Component } from 'vue';

// 需要全局注册的组件
const components: { [name: string]: Component } = { SvgIcon };

export default {
  install(app: App) {
    Object.keys(components).forEach((key: string) => {
      app.component(key, components[key]);
    });
  },
};
1
2
3
4
5
6
7
8
9
10
11
12
13

在 main.ts 中安装全局组件

import globalComponent from './components/index';
app.use(globalComponent);
1
2

# 6. 在 Vue 组件中使用 SVG 图标

完成以上步骤后,我们可以在任何组件中 直接使用 SvgIcon。

<template>
  <div>
    <SvgIcon name="user" width="30px" height="30px" color="blue" />
    <SvgIcon name="home" width="40px" height="40px" color="red" />
  </div>
</template>
1
2
3
4
5
6

📌 说明

  • name="user" 表示 src/assets/icons/user.svg
  • width="30px" 设置 SVG 宽度
  • color="blue" 设置 SVG 颜色
编辑此页 (opens new window)
项目配置环境变量
项目集成 SASS(SCSS)

← 项目配置环境变量 项目集成 SASS(SCSS)→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式