一、安装依赖
npm i svg-sprite-loader -D
二、修改规则和新增规则,vue.config.js
// resolve定义一个绝对路径获取函数
const path = require('path')
function resolve (dir) { return path.join(__dirname, dir) }
module.exports = {
chainWebpack (config) {
// 配置svg规则排除icons目录中svg文件处理
// 目标给svg规则增加一个排除选项
exclude: ['path/to/icon']
config.module.rule("svg")
.exclude.add(resolve("src/icons"))
// 新增icons规则,设置svg-sprite-loader处理icons目录中的svg
config.module.rule('icons').test(/\.svg$/)
.include.add(resolve('./src/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({ symbolId: 'icon-[name]' })
}
}
三、使用
<template>
<svg>
<use xlink:href="#icon-wx" />
</svg>
</template>
<script>
import "@/icons/svg/wx.svg";
export default {};
</script>
四、自动导入
// context第一个参数为图标目录
const req = require.context('./svg', false, /\.svg$/)
req.keys().map(req);
五、组件化
<template>
<svg :class="svgClass" v-on="$listeners">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
export default {
name: "SvgIcon",
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ""
}
},
computed: {
iconName() {
return `#icon-${this.iconClass}`;
},
svgClass() {
if (this.className) {
return "svg-icon " + this.className;
} else {
return "svg-icon";
}
}
}
};
</script>
<style lang="scss" scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill:currentColor;
overflow: hidden;
}
</style>
六、使用 在main中全局注册svg-icon组件
import svgIcon from '@/component/svgIcon'
vue.component('svg-icon',svgIcon)
网友评论