vue使用icon图标:svg-sprite-loader

本文介绍如何使用svg-sprite-loader简化SVG图标管理,包括安装配置、组件创建、全局注册和动态引入,让项目中的图标使用更加高效便捷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每次在项目中使用icon的图标时,总是觉得引入很长的路径很麻烦,或许需要将它们写成一个个伪元素。最近发现了svg-sprite-loader可以解决你的烦恼。

工作原理

svg-sprite-loader实际上是把所有的svg打包成一张雪碧图,类似下图。每一个symbol装置对应的icon,
再通过<use xlink:href="#xxx"/>来显示你所需的icon。

clipboard.png
symbolzhuan


1.安装依赖及修改配置

1.1 npm i svg-sprite-loader
1.2 在bulid/webpack.base.conf.js配置文件中增加一条rules

    {
        test: /\.svg$/,
        loader: 'svg-sprite-loader',
        include: [resolve('src/icons')],
        options: {
          symbolId: 'icon-[name]'
        }
      }

注意在vue-cli构建的项目中会默认有一条包含有svg格式的图片转成base64的rules,所以需要再稍作修改

修改前,如果同时使用这两条规则会使项目启动失败。
{
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
      limit: 10000,
      name: utils.assetsPath('img/[name].[hash:7].[ext]')
    }
  }

如果一个项目中有需要.svg用作图片也有用作icon的可以这样修改

用作图片的

{
  test: /\.svg$/,
  loader: 'url-loader',
  outputPath: path.resolve(__dirname, ./assets/images/svg)//存放icon的路径
}

用作icon的.
include:存放icon的路径

{
  test: /\.svg$/,
  loader: 'svg-sprite-loader',
  include: [resolve('src/icons')],
  options: {
      symbolId: 'icon-[name]'
    }
}

2.在components/svgIcon 创建组件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>

3.保存svg图片和全局注册svgIcon

3.1 icons/svg 用来保存图片
3.2 index.js 动态引入svg。作用在于虽然全局组册了svg但是在当前组件调用某个svg还是需要import这个文件,
我们可以通过webpack的context.require()来解决这个问题
require.context('./svg', false, /.svg$/),第一个参数是引入文件所在的文件夹,第二个是否引入子文件夹,第三个是匹配规则,
通过这个方法就可以动态的引入svg文件了。
.keys()返回svg数组
.map()再获取和上下文匹配的svg文件

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg组件
// register globally
Vue.component('svg-icon', SvgIcon)

const requireAll = requireContext => requireContext.keys().map(requireContext)
// (requireContext) => {
//    requireContext.keys().map(requireContext)
// }
// require
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

4.在入口文件引入 @/icons


5.引用组件

<svg-icon icon-class="name"/> name为svg文件名

阅读这篇文章后再试着写demo,可以让你的理解更加透彻
懒人神器:svg-sprite-loader实现自己的Icon组件

### 使用 Vite 和 `svg-sprite-loader` 处理 Vue 3 中的 SVG 图标 对于在 Vue 3 项目中使用 Vite 构建工具并结合 `svg-sprite-loader` 来处理 SVG 图标的场景,可以按照如下方式实现。 #### 安装依赖包 安装必要的插件以支持 SVG 图标作为雪碧图加载: ```bash npm install vite-plugin-svg-icons -D ``` #### 配置 Vite 插件 编辑项目的 `vite.config.js` 文件,在 plugins 数组内加入创建好的配置对象: ```javascript import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import path from 'path'; import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; export default defineConfig({ plugins: [ vue(), createSvgIconsPlugin({ iconDirs: [path.resolve(process.cwd(), 'src/components/svgIcon/svg')], symbolId: 'icon-[name]', inject: 'body-last', customDomId: '__svg__icons__dom__' }) ] }); ``` 上述设置指定了图标所在的文件夹路径以及如何生成 `<symbol>` 的 ID 属性[^3]。 #### 创建和使用 SVG 组件 为了方便复用这些图标,建议封装一个通用的 SVG Icon 组件。该组件可以根据传入的名字动态渲染对应的图标实例。 ```html <template> <svg class="svg-icon" aria-hidden="true"> <use :xlink:href="'#' + iconName"></use> </svg> </template> <script setup lang="ts"> defineProps<{ iconName: string; }>(); </script> <style scoped> .svg-icon { width: 1em; height: 1em; } </style> ``` 此模板中的 `iconName` 是父级传递给子组件的一个属性,用于指定要显示的具体图标名称[^2]。 当需要展示某个特定的图标时,只需简单调用这个自定义组件即可: ```vue <MySvgIcon :icon-name="'example'" /> ``` 这样就完成了基于 Vite 和 `svg-sprite-loader` 对于 Vue 3 应用程序中 SVG 图标的高效管理与应用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值