通用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()
  }
}