【vue3+vite】SvgIcon组件(vite-plugin-svg-icons插件)

一. 安装插件

  1. 安装vite-plugin-svg-icons插件
npm i fast-glob@3.x -D
npm i vite-plugin-svg-icons@2.x -D

  1. unplugin-vue-components

一个让第三方UI库无需完整引入,也无需按需引入,会自动识别并注册的插件;
这样就不会在mian.ts全局注册组件(SvgIcon)了

npm i unplugin-vue-components --save-dev
  1. vite-plugin-vue-setup-extend

//在setup中注册组件name

npm i vite-plugin-vue-setup-extend --save-dev

二、vite.config.js配置

import { defineConfig } from 'vite' // 帮手函数,这样不用 jsdoc 注解也可以获取类型提示
import vue from '@vitejs/plugin-vue'  //识别.vue文件
import viteCompression from "vite-plugin-compression"; //gzip必备插件,开启gzip、br压缩
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' // 生成 svg 雪碧图
import vueSetupExtend from 'vite-plugin-vue-setup-extend' //在setup中注册组件name
import Components from 'unplugin-vue-components/vite'// 自动按需导入组件插件,省去大量的import操作


//path 
const path = require('path');
/**
 * 
 * 此时 TS 可能有这个错误提示:找不到模块“path”或其相应的类型声明。
 * 解决方法:npm install @types/node --save-dev
 */

const resolve = (dir: string) => path.join(__dirname, dir)//__dirname 总是指向被执行 js 文件的绝对路径 EX:/d1/d2/myscript.js 文件中写了 __dirname, 它的值就是 /d1/d2

// https://vitejs.dev/config/
export default defineConfig({
  //开发或生产环境服务的公共基础路径
  base: './',
  //作为静态资源服务的文件夹。并在构建期间复制到 outDir 的根目录,并且始终按原样提供或复制而无需进行转换。
  publicDir: "public",
  //用于加载 .env 文件的目录。
  // envDir:"root",
  //控制台输出的级别 info 、warn、error、silent
  logLevel: "info",
  // 设为false 可以避免 vite 清屏而错过在终端中打印某些关键信息
  clearScreen: true,
  //plugins配置需要使用的插件列表
  plugins: [vue(), vueSetupExtend(),viteCompression({
    verbose: true,
    disable: false,
    threshold: 10240,
    algorithm: "gzip",
    ext: ".gz",
  }),// 自动导入svg图片
  createSvgIconsPlugin({
    // 指定需要缓存的图标文件夹
    iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
    // 指定symbolId格式
    symbolId: 'icon-[dir]-[name]',
    inject: 'body-last',
    customDomId: '__svg__icons__dom__'
  }),
  // 自动按需导入组件
  Components({
    // 要搜索组件的目录的相对路径
    dirs: ['src/components'],
    // 搜索子目录
    deep: true,
    // 组件的有效文件扩展名
    extensions: ['vue'],
    // 允许子目录作为组件的命名空间前缀。
    directoryAsNamespace: false,
    // 配置文件生成位置
    dts: 'src/components.d.ts'
  })],

  // 路径相关规则
  resolve: {
    //配置别名
    alias: {
      '@': resolve('src'),// @表示当前的src目录路径
      'comps': resolve('src/components'),// comps表示当前的src目录路径下components
      'views': resolve('src/views'),
    }
  },

  //本地运行配置,以及反向代理配置
  server: {
    host: "0.0.0.0",//指定服务器应该监听哪个 IP 地址。 如果将此设置为 0.0.0.0 或者 true 将监听所有地址,包括局域网和公网地址。
    port: 80,//指定开发服务器端口
  },
  //打包配置
  build: {
    //传递给 Terser 的更多 minify 选项。 生产环境去除 console debugger
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true,
      },
    },

  },
})

三、vite-plugin-svg-icons插件引入在main.js中

//svg 引用
import 'virtual:svg-icons-register'

四、svg图标存放路径

image.png
在assets下创建svg文件 ,在vite.config.ts,与其对应。也可以自定义路径,因人而异。
image.png

注意:
svg图标不能有中文名

五、SvgIcon组件

在components创建SvgIcon文件index.vue

<template>
    <div class="svg-box">
        <svg :class="svgClass" aria-hidden="true" :style="style">
            <use :xlink:href="iconName" :fill="color" />
        </svg>
    </div>
</template>
  
<script lang="ts" setup name='SvgIcon'>
import { computed } from "vue"

interface Props {
    name: string
    width?: string
    height?: string
    className?: string
    color?: string
}
interface Style {
    width?: string
    height?: string
    [index: string]: any
}
const props = withDefaults(defineProps<Props>(), {
    name: '',
    width: '',
    height: '',
    className: '',
    color: ''
})
const style: Style = computed(() => {
    const style: Style = {}
    if (props.width) {
        style.width = props.width.indexOf('%') !== -1 ? props.width : props.width + 'px'
        style.height = (props.height || props.width) + 'px'
    }
    return style
})
const iconName = computed(() => `#icon-${props.name}`)
const svgClass = computed(() => {
    if (props.className) {
        return `svg-icon ${props.className}`
    }
    return 'svg-icon'
})
</script>
  
<style lang="scss" scoped>
.svg-box {
    display: inline-block;

    .svg-icon {
        position: relative;
        width: 14px;
        min-width: 1em;
        height: 14px;
        vertical-align: -2px;
    }
}
</style>
  

六、使用

<!--  -->
<template>
    <div class="box">
        <SvgIcon width="28" name="analysis-chart" />
    </div>
</template>

<script setup lang='ts'>
</script>
<style lang='scss' scoped>

</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中封装vite-plugin-svg-icons插件并封装SvgIcon组件的步骤如下: 1. 首先安装vite-plugin-svg-icons插件和fast-glob依赖包,可以使用以下命令进行安装: ``` npm i vite-plugin-svg-icons npm i fast-glob ``` 2. 在项目的配置文件中进行插件的配置。具体配置方式可以参考vite-plugin-svg-icons的官方文档。 3. 将SVG图标文件放置在对应的路径下,并与iconDirs设置保持一致。 4. 在Vue组件中使用SvgIcon组件,并传递相应的props。例如,在index.vue文件中可以这样使用SvgIcon组件: ```html <template> <svg-icon :name="nameVal" color="blue" class-name="menu-svg-icon" :icon-title="iconTitle"></svg-icon> </template> <script setup> import { ref } from 'vue'; import SvgIcon from "@/components/SvgIcon.vue"; let iconTitle = ref('svg图片'); let nameVal = ref('layer'); </script> <style scoped> .menu-svg-icon { width: 180px; height: 180px; color: red !important; } </style> ``` 5. 最后,在需要全局引入SvgIcon组件的地方进行引入和使用。 请注意,这只是一个大致的步骤,具体的实现可能会根据项目的需求和配置方式有所差异。你可以根据自己的实际情况进行相应的调整和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue2+vite中,通过插件vite-plugin-svg-icons和fast-glob封装组件使用svg图片](https://blog.csdn.net/weixin_44867717/article/details/126603027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [【vue3】使用vite-plugin-svg-icons插件显示本地svg图标](https://blog.csdn.net/qq_36977923/article/details/127302147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值