vue項目中使用Svg的方法
github demo: github地址
閑聊背景
本文主要以 vue-cli3 搭建的項目為例,來聊一下如何在項目中更優(yōu)雅的使用 svg 。
眾所周知, vue-cli3 已經推出很長一段時間了,大家可以感受一下 vue-cli3 帶來的零配置體驗。But,也相應帶來了一些弊端,就是如歸需要修改默認的 loader 時,會比較麻煩。
們接下來主要使用的就是上文中提到的 svg 的 use ,先上一張 vue-cli3 搭建的項目的目錄,可以看到根目錄下只保留了 public/ 以及 src/ ,可以說非常干凈,大家可以自己創(chuàng)建一個。

在 src/components/ 下創(chuàng)建 SvgIcon 組件
<template>
<svg :class="svgClass" aria-hidden="true">
<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 scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
在 src/ 下創(chuàng)建一個 icons 目錄,目錄結構如下:

svg 目錄主要用于存放 svg 文件,來看一下 index.js 的內容,功能就是把組件注冊到全局,方便使用:
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg組件
// 注冊到全局
Vue.component('svg-icon', SvgIcon)
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)
當然,如果你有自己的想法或需求,可以單獨引入,無需非要注冊到全局。
在 main.js 中引入

這一步就沒什么好說的了,如果需要注冊到全局,需要在入口文件中引入。
好了,接下來是最重要的一步:
修改默認的 loader :
大家可以去vue-cli3官網去查看具體教程,這里我只說需要修改的 loader 以及具體的代碼實現(xiàn)。
首先需要注意的是,通過 vue-cli3 構建的項目可以初始化進行很多選擇,我構建的目錄更多的是以 *.config.js 的形式存在的。
在根目錄下創(chuàng)建一個名為 vue.config.js 文件,接下來的操作都和它有關,先來看一下它完整的代碼:
const path = require('path')
function resolve (dir) {
return path.join(__dirname, './', dir)
}
module.exports = {
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
})
// svg rule loader
const svgRule = config.module.rule('svg') // 找到svg-loader
svgRule.uses.clear() // 清除已有的loader, 如果不這樣做會添加在此loader之后
svgRule.exclude.add(/node_modules/) // 正則匹配排除node_modules目錄
svgRule // 添加svg新的loader處理
.test(/\.svg$/)
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]',
})
// 修改images loader 添加svg處理
const imagesRule = config.module.rule('images')
imagesRule.exclude.add(resolve('src/icons'))
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)
},
configureWebpack: {
devServer: {
open: true,
// https: true,
proxy: {
'/user': {
target: 'https://devadminschool.icourt.cc',
},
'/live': {
target: 'https://devadminschool.icourt.cc',
},
},
},
},
}
大家忽略無關緊要的代碼,重點從 svg rule loader 注釋開始,其實注釋已經比較詳細了,就是獲取默認的 loader 并進行相關的修改,主要有 svg-loader 、 images-loader ,從 vue-cli3 基礎loader 中可以找到這兩個 loader 的默認配置。
// 默認的svg loader...
webpackConfig.module
.rule('svg')
.test(/\.(svg)(\?.*)?$/)
.use('file-loader')
.loader('file-loader')
.options({
name: genAssetSubPath('img')
})
// 默認的images loader...
webpackConfig.module
.rule('images')
.test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
.use('url-loader')
.loader('url-loader')
.options(genUrlLoaderOptions('img'))
對比我一開始的代碼可以看出,我把默認的 svg loader 配置中使用的 file-loader 改為了 svg-sprite-loader ,并排除了 node_modules ,把默認的 images-loader 配置添加了 svg ,并排除了 src/icons 目錄。
如何使用?
- 可以把設計大大給的svg 或者從iconfont官網下載開源的icon的svg格式,復制到 src/icons/svg 目錄下;
- 點擊 svg 查看源碼,修改 fill 屬性, fill="currentColor" ,或者 fill="" ,如果無此屬性,就不用管,這樣做是可以讓外部控制icon的顏色,或隨父元素的color;
- 注意svg命名和SvgIcon命名一致,看一下最終使用:

這里就會使用 src/icons/svg/go-back.svg 文件。
總結:
以上講的比較糙,奈何文字功底是硬傷,最后附上github demo 代碼示例:
此項目也可以當做項目初始架構,內置了vue-router、vuex等。
本文以vue-cli3創(chuàng)建的項目為例,之前的項目可以直接去手動修改對應的loader即可。
總結
以上所述是小編給大家介紹的vue項目中使用Svg的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
vue實現(xiàn)全屏滾動效果(非fullpage.js)
這篇文章主要為大家詳細介紹了vue實現(xiàn)全屏滾動效果,非fullpage.js,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03

