提前准备:
1、一个本地的svg图片
这个直接从网上找一个就行
2、文件整体目录
安装插件
npm i vite-plugin-svg-icons
vite.config.ts中配置插件
完整代码
import { fileURLToPath, URL } from 'node:url'
import { resolve } from 'path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vueDevTools from 'vite-plugin-vue-devtools'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import px2rem from 'postcss-plugin-px2rem'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'const px2remOptions = {rootValue: 19.2, //换算基数, 默认100 ,也就是1920px ,这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多少px了unitPrecision: 5, //允许REM单位增长到的十进制数字,其实就是精度控制// propWhiteList: [], // 默认值是一个空数组,这意味着禁用白名单并启用所有属性。// propBlackList: [], // 黑名单// exclude:false, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值// selectorBlackList: [], //要忽略并保留为px的选择器// ignoreIdentifier: false, //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。// replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。mediaQuery: false, //(布尔值)允许在媒体查询中转换pxminPixelValue: 0 //设置要替换的最小像素值(3px会被转rem)。 默认 0
}// https://vite.dev/config/
export default defineConfig({plugins: [vue(),vueJsx(),vueDevTools(),AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),createSvgIconsPlugin({// 指定需要缓存的图标文件夹iconDirs: [resolve(process.cwd(), 'src/assets/icons')],// 指定symbolId格式symbolId: 'icon-[dir]-[name]',}),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))},},css: {postcss: {plugins: [px2rem(px2remOptions),],},},
})
创建自定义图标组件svgIcon.vue
文件路径:@/components/svgIncos/indexView.vue
<template><svg :style="{ width: size, height: size }"><use :href="prefix+name" :fill="color"></use></svg>
</template><script lang="ts" setup>
defineProps({prefix: {type: String,default: '#icon-',},name: {type: String,required: true,},color: {type: String,default: 'currentColor',},size: {type: String,default: '1em',},
})
</script>
注册一下这个自定义的图标组件:
在@/src/components/index.ts文件中
import SvgIcon from './svgIcons/indexView.vue'const allGloablCom = {SvgIcon,
}
export default {install(app) {Object.keys(allGloablCom).forEach((key) => {app.component(key, allGloablCom[key])})}
}
main.ts文件中引入
截图:
完整代码:
import './assets/main.css'import { createApp } from 'vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import en from 'element-plus/es/locale/lang/en'
//引入vite-plugin-svg-icons的脚本
import 'virtual:svg-icons-register'import './utils/rem.js'import gloalComponent from './components/index.ts' // 引入自定义插件对象:注册整个项目全局组件import App from './App.vue'
import router from './router'const app = createApp(App)app.use(gloalComponent)app.use(createPinia())
app.use(ElementPlus,{size:'small',zIndex:3000,locale:zhCn})
app.use(router)app.mount('#app')
使用:
随便找个文件在其中使用:
当前文件地址(随便新建一个vue文件) @/views/aboutView.vue
<template><SvgIcon name="logo" size="20px" :color="'#0aa1ed'"/>
</template><script setup lang="ts">
</script>