提前準備:
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>