svg-icon在项目中的使用

1、通过 https://www.iconfont.cn 下载资源,引入iconfont.js文件

  • icon/index.js
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg component

import '@/icons/iconFonts/iconfont.js'

Vue.component('svg-icon', SvgIcon)

  • scgIcon组件
<template>
  <svg class="icon" aria-hidden="true" v-on="$listeners">
    <use xlink:href="#icon-user" />
  </svg>
</template>
<script>
export default {
  name: 'svgIcon',
  props: {
    iconClass: {
      type: String,
      required: true,
    },
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`
    },
  },
}
</script>
<style lang="less">
.icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>
  • 使用
<svg-icon icon-class="user"></svg-icon>

2、使用 svg-sprite

接下来我们就要自己来制作 svg-sprite 了。这里要使用到 svg-sprite-loader 这个神器了, 它是一个 webpack loader ,可以将多个 svg 打包成 svg-sprite

我们来介绍如何在 vue-cli 的基础上进行改造,加入 svg-sprite-loader

我们发现vue-cli默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候我们引入svg-sprite-loader 会引发一些冲突。

//默认`vue-cli` 对svg做的处理,正则匹配后缀名为.svg的文件,匹配成功之后使用 url-loader 进行处理。
 {
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
      limit: 10000,
      name: utils.assetsPath('img/[name].[hash:7].[ext]')
    }
}

解决方案有两种,最简单的就是你可以将 test 的 svg 去掉,这样就不会对svg做处理了,当然这样做是很不友善的。

  • 你不能保证你所有的 svg 都是用来当做 icon的,有些真的可能只是用来当做图片资源的。
  • 不能确保你使用的一些第三方类库会使用到 svg。

所以最安全合理的做法是使用 webpack 的 excludeinclude ,让svg-sprite-loader只处理你指定文件夹下面的 svg,url-loaer只处理除此文件夹之外的所以 svg,这样就完美解决了之前冲突的问题。 代码如下

    // set 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()

这样配置好了,只要引入svg之后填写类名就可以了

import '@/src/icons/qq.svg; //引入图标

<svg><use xlink:href="#qq" /></svg>  //使用图标
  • 自动导入
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

参考https://juejin.cn/post/6844903517564436493

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 网页图标展示方式大概可以分为以下几类 img 标签。最原始的方式,不支持改变颜色 css sprites。其...
    雨翼195阅读 6,179评论 0 1
  •    之前大部分 icon 是png图片,当有两种状态时就需要两种图片的替换,占用的体积也是比较大的,后来接触到了...
    前端新阳阅读 13,162评论 2 14
  • 前言 在做前端后台项目的时候经常会用到很多 icon 图标,刚开始还好,但随着项目的不断迭代,每次修改添加图标会变...
    张先觉阅读 4,183评论 0 0
  • 今天在vue3+vite项目练习中,在使用svg时,发现之前的写法不能用,之前的使用方法参考:vue2中优雅的使用...
    azi__阅读 11,143评论 2 9
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,748评论 28 53

友情链接更多精彩内容