一、构建本地SVG图标详细步骤
1、安装开发依赖
在 webpack 中加载 svg 资源可以使用 svg-sprite-loader,而 vite 中可以使用插件 vite-plugin-svg-icons。
npm add vite-plugin-svg-icons -D
npm install --force
或者
直接在package.json中的devDependencies里添加上依赖:
"vite-plugin-svg-icons": "^2.0.1"
接着执行安装依赖命令。
2、配置vite
2.1、配置vite.config.js
在vite.config.js中配置创建插件,这里进行封装一下:
import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = loadEnv(mode, process.cwd())
const { VITE_APP_ENV } = env
return {
base: './', // 打包的静态资源引用路径
plugins: createVitePlugins(env, command.includes('build')), // 放插件用的
resolve: {
alias: {
// 设置路径
'~': path.resolve(__dirname, './'),
// 设置别名
'@': path.resolve(__dirname, './src')
},
// https://cn.vitejs.dev/config/#resolve-extensions
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
}
}
})
对应编写内容如下:

2.2、封装vite引入插件脚本
创建.vite目录,编写引入插件:

svg-icon.js:
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default function createSvgIcon(isBuild) {
return createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
symbolId: 'icon-[dir]-[name]',
svgoOptions: isBuild
})
}
这里src/assets/icons/svg就是指向我们的svg目录。
index.js:
import vue2 from '@vitejs/plugin-vue2'
import { viteCommonjs } from '@originjs/vite-plugin-commonjs' // 让浏览器支持commonjs语法
import createSvgIcon from './svg-icon'
export default function createVitePlugins(viteEnv, isBuild = false) {
const vitePlugins = [vue2()]
vitePlugins.push(viteCommonjs())
vitePlugins.push(createSvgIcon(isBuild))
return vitePlugins
}
核心如下:

解决报错:can not find package 'fast-glob' imported
若是出现报错:

安装依赖:
cnpm i fast-glob -D
在main.js中添加导入依赖:
import 'virtual:svg-icons-register'
二、实际应用
应用1:未封装,直接vue应用
<svg class="svg-icon card-panel-icon" aria-hidden="true">
<use xlink:href="#icon-bug" :fill="color" />\
</svg>
注意:这里#icon-project,对应的就是在svg目录下的bug.svg。

效果:

应用2:封装vue组件使用
封装SvgIcon组件
创建vue组件:

<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName" :fill="color" />
</svg>
</template>
<script>
import { isExternal } from '@/utils/validate'
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
},
color: {
type: String,
default: ''
},
},
computed: {
iconName() {
return `#icon-${this.iconClass}`;
},
svgClass() {
return this.className ? `svg-icon ${this.className}` : 'svg-icon';
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.svg-external-icon {
background-color: currentColor;
mask-size: cover!important;
display: inline-block;
}
</style>
main.js注册全局组件
import SvgIcon from '@/components/SvgIcon'
Vue.component('svg-icon', SvgIcon)
vue页面使用组件
在vue中如何使用:
<svg-icon icon-class="project" class-name="card-panel-icon" />
参考文章
[1]. vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶续篇:https://zhuanlan.zhihu.com/p/570630648
文章标签+摘要+封面图
博客摘要: 本文详细介绍了在Vite项目中构建本地SVG图标的详细步骤。首先,通过安装vite-plugin-svg-icons插件来处理SVG资源。接着,在vite.config.js中配置插件,并创建了.vite目录下的插件封装脚本。文章还解决了安装过程中可能出现的fast-glob包缺失的问题,并在项目中演示了如何直接在Vue应用中使用SVG图标以及如何封装Vue组件来使用SVG图标。
文章标签:
- Vite项目配置
- SVG图标构建
- 前端工程化
博客展示首图描述: 主标题:Vite项目中的SVG图标构建 副标题:详细步骤与实践应用 描述:掌握在Vite项目中构建和使用SVG图标的完整流程。

评论区请在客户端页面查看