下载svgloader、配置svgloader
下载
npm i --save-dev svg-sprite-loader@6.0.9
vue.config.js中配置svg--loader
// vue.config.js
// ele-p 按需加载
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
const path = require('path');
function resolve(dir) {
return path.join(__dirname, dir)
}
const webpack = require('webpack')
module.exports = {
transpileDependencies: true,
configureWebpack: config => {
config.plugins.push(AutoImport({
resolvers: [ElementPlusResolver()],
})),
config.plugins.push(Components({
resolvers: [ElementPlusResolver()],
}))
},
chainWebpack(config) {
// 设置 svg-sprite-loader
// config 为 webpack 配置对象
// config.module 表示创建一个具名规则,以后用来修改规则
config.module
// 规则
.rule('svg')
// 忽略
.exclude.add(resolve('src/icons'))
// 结束
.end()
// config.module 表示创建一个具名规则,以后用来修改规则
config.module
// 规则
.rule('icons')
// 正则,解析 .svg 格式文件
.test(/\.svg$/)
// 解析的文件
.include.add(resolve('src/icons'))
// 结束
.end()
// 新增了一个解析的loader
.use('svg-sprite-loader')
// 具体的loader
.loader('svg-sprite-loader')
// loader 的配置
.options({
symbolId: 'icon-[name]'
})
// 结束
.end()
config
.plugin('ignore')
.use(
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn$/)
)
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
}
}
新建svg组件
<template>
<!--svg组件
@/components/SvgIcon
-->
<svg class="svg-icon" aria-hidden="true">
<use :xlink:href="iconName"></use>
</svg>
</template>
<script setup>
import { defineProps, computed } from 'vue'
const props = defineProps({
icon: {
type: String,
required: true
}
})
const iconName = computed(() => {
return `#icon-${props.icon}`
})
</script>
<style lang="scss" scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
新建icons目录以及icons/index.js文件(平级,不要放在assets目录下)
/*
*icons
**svgs (这是svg文件)
**index.js
*/
// /icons/index.js
import SvgIcon from '@/components/SvgIcon'
const svgRequired = require.context('./svg', false, /\.svg$/)
svgRequired.keys().forEach((item) => svgRequired(item))
export default (app) => {
app.component('svg-icon', SvgIcon)
}
入口文件导入
import SvgIcon from '@/icons'
const app = createApp(App)
SvgIcon(app)
使用
<svg-icon icon="user" class="svg-container"></svg-icon>
tips
组件svgIcon接收的icon名是svg格式的名字(不含后缀),比如: