通用svg图标组件——SvgIcon
实现一个通用的svg图标组件
1.可以使用项目内部的svg图标
2.也可以使用外部传入的svg图标
SvgIcon.vue:
validate.js:
/**
* 判断是否为外部资源
*/
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path)
}
批量引入svg并且注册svg-icon组件
@/icons/index.js:
import SvgIcon from '../components/SvgIcon.vue'
// 批量引入项目内的.svg文件
const svgRequire = require.context('./svg', false, /.svg$/)
svgRequire.keys().forEach(svgIcon => svgRequire(svgIcon))
// 全局注册 SvgIcon 组件
export default app => {
app.component('svg-icon', SvgIcon)
}
在mani.js中安装svg-icon组件为全局组件
main.js:
import installIcons from './icons/index
installIcons(app)
安装svg-loader让svg得以显示
安装:
npm i --save-dev svg-sprite-loader@6.0.9
在vue.config.js中对svg进行修改
const path = require('path')
function resolve(dir) {
return path.join(__dirname, dir)
}
// https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F
module.exports = {
chainWebpack(config) {
// 设置 svg-sprite-loader
config.module
.rule('svg')
.exclude.add(resolve('src/icons'))
.end()
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
}
}