github demo: github地址 若是對您有用,請順手給個star...html
本文主要以vue-cli3
搭建的項目爲例,來聊一下如何在項目中更優雅的使用svg
。vue
衆所周知,vue-cli3
已經推出很長一段時間了,你們能夠感覺一下vue-cli3
帶來的零配置體驗。But,也相應帶來了一些弊端,就是若是須要修改默認的loader
時,會比較麻煩。node
好了,上正題,建議看此文章以前先去看一下張鑫旭大神的將來必熱:SVG Sprite技術介紹,那麼咱們接下來主要使用的就是上文中提到的svg
的 use
,先上一張vue-cli3
搭建的項目的目錄,能夠看到根目錄下只保留了public/
以及src/
,能夠說很是乾淨,你們能夠本身建立一個。webpack
src/components/
下建立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/
下建立一個icons
目錄,目錄結構以下:svg
目錄主要用於存放svg
文件,來看一下index.js
的內容,功能就是把組件註冊到全局,方便使用:git
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)
複製代碼
固然,若是你有本身的想法或需求,能夠單獨引入,無需非要註冊到全局。github
main.js
中引入好了,接下來是最重要的一步:web
loader
:你們能夠去vue-cli3官網去查看具體教程,這裏我只說須要修改的loader
以及具體的代碼實現。vue-router
首先須要注意的是,經過vue-cli3
構建的項目能夠初始化進行不少選擇,我構建的目錄更多的是以*.config.js
的形式存在的。vuex
在根目錄下建立一個名爲vue.config.js
文件,接下來的操做都和它有關,先來看一下它完整的代碼:vue-cli
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
目錄。
src/icons/svg
目錄下;svg
查看源碼,修改fill
屬性, fill="currentColor"
,或者fill=""
,若是無此屬性,就不用管,這樣作是可讓外部控制icon的顏色,或隨父元素的color;src/icons/svg/go-back.svg
文件。以上講的比較糙,奈何文字功底是硬傷,最後附上github demo 代碼示例: 此項目也能夠當作項目初始架構,內置了vue-router、vuex等。
本文以vue-cli3建立的項目爲例,以前的項目能夠直接去手動修改對應的loader便可。
github地址 若是對您有用,請順手給個star...
本文是在掘金上發佈的第一篇帖子,新人入駐,還請各位前輩多關懷...