1、安装依赖
npm install --save-dev svg-sprite-loader
2、 新建svg资源文件夹 src/assets/svg
将svg资源放入此目录,接下来会在配置文件中该路径
3、vue-cli 脚手架项目3.x 以上配置 vue.config.js
1 const path = require('path')
2 module.exports = {
3 chainWebpack: config => {
4 // svg rule loader
5 const svgRule = config.module.rule('svg') // 找到svg-loader
6 svgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后
7 svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录
8 svgRule // 添加svg新的loader处理
9 .test(/\.svg$/)
10 .use('svg-sprite-loader')
11 .loader('svg-sprite-loader')
12 .options({
13 symbolId: 'icon-[name]',
14 })
15 // 修改images loader 添加svg处理
16 const imagesRule = config.module.rule('images')
17 imagesRule.exclude.add(path.resolve(__dirname, 'src/assets/svg')) //注意这个路径,为svg资源文件的路径
18 config.module
19 .rule('images')
20 .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
21 }
22 }
4、创建组件 SvgIcon.vue ( src/compoments/SvgIcon.vue )
1 <template>
2 <svg :class="svgClass" aria-hidden="true">
3 <use :xlink:href="iconName"></use>
4 </svg>
5 </template>
6
7 <script>
8 export default {
9 name: 'svg-icon',
10 props: {
11 iconClass: {
12 type: String,
13 required: true
14 },
15 className: {
16 type: String
17 }
18 },
19 computed: {
20 iconName () {
21 return `#icon-${this.iconClass}`
22 },
23 svgClass () {
24 if (this.className) {
25 return 'svg-icon ' + this.className
26 } else {
27 return 'svg-icon'
28 }
29 }
30 }
31 }
32 </script>
33
34 <style scoped>
39 </style>
5、组件注册(全局) (src/utils/iconsSvg.js)
1 import Vue from 'vue'
2 import SvgIcon from '@/components/SvgIcon' //引入第四步的组件
3
4 // 全局注册组件
5 Vue.component('svg-icon', SvgIcon)
6 // 定义一个加载目录的函数
7 const requireAll = requireContext => requireContext.keys().map(requireContext)
8 const req = require.context('@/assets/svg', false, /\.svg$/) //为svg资源文件的路径
9 // 加载目录下的所有 svg 文件 10 requireAll(req)
6、引入组件 main.js
import './utils/iconsSvg'
7、使用svg组件
iconClass: svg文件的文件名
className: svg图标的样式类名
1 <template>
2 <div>
3 <p>小明同学的大头贴</p>
4 <svg-icon iconClass="boy" className="boy"></svg-icon>
5 </div>
6 </template>
7
8 <style scoped>
9 .boy {
10 width: 200px;
11 height: 200px;
12 }
13 </style>