Vite项目当中的SVG图标的配置及图标全局组件的封装

为什么要使用 SVG 图标?

在开发项目的时候经常会用到svg矢量图,而且我们使用SVG以后,页面上加载的不再是图片资源,这对页面性能来说是个很大的提升,而且我们SVG文件比img要小的很多。放在项目中几乎不占用资源。

如何使用?

  1. 安装 SVG 依赖插件
pnpm install vite-plugin-svg-icons -D
  1. 在 vite.config.ts 中配置插件
import { defineConfig } from 'vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' // 引入 svg 图标所需要的插件
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(),
    createSvgIconsPlugin({
      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], // 图标的存放目录
      symbolId: 'icon-[dir]-[name]'
    })
  ],
  resolve: {
    alias: {
      "@": path.resolve("./src") // 相对路径别名配置,使用 @ 代替 src
    }
  }
})

  1. main.ts 中导入
import { createApp } from 'vue'
import App from '@/App.vue'
import 'virtual:svg-icons-register' // svg 配置

console.log(import.meta.env)
createApp(App).mount('#app')

注意,如果在重新启动项目的时候有如下报错:

在这里插入图片描述
手动进行安装

在这里插入图片描述

测试使用

在这里插入图片描述

在这里插入图片描述
svg:图标外层容器节点,内部雷要与use标签结合使用

xlink:href 执行用哪一个图标,属性值务必 #icon-图标名字

use标签fill 属性性可以设置图标的颜色(如何设置失败,检查你复制的这个 svg 图标代码中是否有这个 fill 属性,如果有就将其移除掉,就可以使用了)

如果需要调整图标的大小,那么就需要在 svg 标签上添加 style 就可以了

<template>
  <div>我是App根组件</div>
 <--是特定的语法-->
 
  <svg>
    <use xlink:href="#icon-phone"></use>
  </svg>
</template>

在这里插入图片描述

可以看到,在项目中可以使用 SVG 图标了,但是有一点不好的就是这样用起来有点麻烦,这个时候我们就可以进行ICON图标组件的封装了,并将其注册为一个全局的组件。

在这里插入图片描述

component / SvgIcon / index.vue

这里是组件的一个简单封装:

<template>
  <svg :style="styleObject">
    <use :xlink:href="prefix + name" :fill="color"></use>
  </svg>
</template>

<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  prefix: {
    type: String,
    default: '#icon-'
  },
  name: String,
  color: String,
  width: {
    type: String,
    default: '16px'
  },
  height: {
    type: String,
    default: '16px'
  }
})

const styleObject = {
  width: props.width,
  height: props.height
}
</script>

<style scoped>

</style>

对于类似这样在项目中会频繁使用到的基础组件,是不是可以将其注册为全局组件呢?

此时我们可以写一个自动注册的插件

component / index.ts

/*
 * 注册整个项目的全局组件
*/
import SvgIcon from './SvgIcon/index.vue'
import { App } from 'vue'
const allGlobalComponent: any = { SvgIcon }
console.log(allGlobalComponent)
export default {
    // 默认会注入 app
    install(app: App) {
        // 注册全部的全局组件
        Object.keys(allGlobalComponent).forEach(key => {
            // 注册为全局组件
            console.log(key)
            app.component(key, allGlobalComponent[key])
        })
    }
}

如上是采用导入组件的方法,其实也可以去遍历需要注册成全局组件的文件夹里面的组件文件进行注册。

最后当插件写好后,便需要在 main.ts 中去安装一下:

import { createApp } from 'vue'
import App from '@/App.vue'

import 'virtual:svg-icons-register' // svg 配置
import globalComponent from '@/components/index.ts' // 引入自定义插件对象:注册整个项目的全局组件
import '@/styles/index.scss' // 引入全局样式

const app = createApp(App)

app.use(globalComponent) // 安装自定义插件
app.mount('#app')

这样就制作好了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一小池勺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值