# 在vue项目中使用SVG
> 本文包含了在vue项目中使用SVG的方法, 包含vue2.x和vue3.x
## vue2.x使用
#c 依赖组件介绍
我们主要使用 `svg-sprite-loader` 来引入组件
使用webpack中的require.context来批量引入svg文件
#d 新旧vue cli 差异
> [新版本vue cli项目无法生效参考文章](https://juejin.cn/post/7133523073680015396)
在新版本的vue cli项目中更改了svg文件的加载方式
所以我们需要将新版本的svg加载项进行更改, 删除新增的内容
#e 配置svg文件的加载
vue.config.js 配置如下
```js
const path = require('path')
function resolve(dir) {
// console.log(dir);
return path.join(__dirname, dir);
}
module.exports = defineConfig({
...outherConfig,
chainWebpack: config => {
config.plugin('define').tap(args=>{
const argv = process.argv
const icourt = argv[argv.indexOf('--icourt-mode') + 1]
args[0]['process.env'].MODE = `"${icourt}"`
return args
})
const svgRule = config.module.rule('svg')
svgRule.uses.clear()
// 清除已有的svg loader https://juejin.cn/post/7133523073680015396
svgRule.delete('type');
svgRule.delete('generator');
svgRule.exclude.add(/noe_modules/)
svgRule
.test(/\.svg/)
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
const imagesRule = config.module.rule('images')
imagesRule.exclude.add(resolve('./src/assets/svg'))
// console.log('imagesRule',imagesRule)
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
}
})
```
#c 注册并引用svg组件
使用 webpack 中的require.context来批量引入svg文件,
并将svg组件注册为vue组件, 这样我们就可以在项目中使用svg了
为了能够同时使用网络上的svg图标, 设置组件参数`svgHref`属性,
用于直接引入网络上的svg图标
#e 注册与组件
这里我们将svg文件统一放置于`src/assets/svg`目录中, `@`为`src`的别名(alias)
iconIndex.js
```js
import Vue from 'vue'
import SvgIcon from './iconSvg' // svg组件
// 注册到全局
Vue.component('svg-icon', SvgIcon)
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('@/assets/svg', false, /\.svg$/)
requireAll(req)
```
svg-icon.vue
```vue
```
#e 使用组件
在对应的svg目录放置好svg文件后, 在需要使用的地方直接调用组件即可
例如放置 user.svg, 在使用的时候只需要使用如下代码即可,
`icon-class`属性填写svg文件的文件名即可
```vue
```