当前位置: 首页 > news >正文

vite学习教程05、vite+vue2构建本地 SVG 图标

文章目录

  • 前言
  • 一、构建本地SVG图标详细步骤
    • 1、安装开发依赖
    • 2、配置vite
      • 2.1、配置vite.config.js
      • 2.2、封装vite引入插件脚本
    • 解决报错:can not find package 'fast-glob' imported
  • 二、实际应用
    • 应用1:未封装,直接vue应用
    • 应用2:封装vue组件使用
      • 封装SvgIcon组件
      • main.js注册全局组件
      • vue页面使用组件
  • 参考文章
  • 资料获取

前言

博主介绍:✌目前全网粉丝3W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


一、构建本地SVG图标详细步骤

1、安装开发依赖

在 webpack 中加载 svg 资源可以使用 svg-sprite-loader,而 vite 中可以使用插件 vite-plugin-svg-icons。

npm add vite-plugin-svg-icons -D
npm install --force

或者

直接在package.json中的devDependencies里添加上依赖:

"vite-plugin-svg-icons": "^2.0.1"

接着执行安装依赖命令。

2、配置vite

2.1、配置vite.config.js

在vite.config.js中配置创建插件,这里进行封装一下:

import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {const env = loadEnv(mode, process.cwd())const { VITE_APP_ENV } = envreturn {base: './', // 打包的静态资源引用路径plugins: createVitePlugins(env, command.includes('build')), // 放插件用的resolve: {alias: {// 设置路径'~': path.resolve(__dirname, './'),// 设置别名'@': path.resolve(__dirname, './src')},// https://cn.vitejs.dev/config/#resolve-extensionsextensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']}}
})

对应编写内容如下:

image-20240908111442648

2.2、封装vite引入插件脚本

创建.vite目录,编写引入插件:

image-20240908111514671

svg-icon.js

import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'export default function createSvgIcon(isBuild) {return createSvgIconsPlugin({iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],symbolId: 'icon-[dir]-[name]',svgoOptions: isBuild})
}

这里src/assets/icons/svg就是指向我们的svg目录。

index.js

import vue2 from '@vitejs/plugin-vue2'import { viteCommonjs } from '@originjs/vite-plugin-commonjs' // 让浏览器支持commonjs语法
import createSvgIcon from './svg-icon'export default function createVitePlugins(viteEnv, isBuild = false) {const vitePlugins = [vue2()]vitePlugins.push(viteCommonjs())vitePlugins.push(createSvgIcon(isBuild))return vitePlugins
}

核心如下:

image-20240908111617677

解决报错:can not find package ‘fast-glob’ imported

若是出现报错:

image-20240908091343488

安装依赖:

cnpm i fast-glob -D

在main.js中添加导入依赖:

import 'virtual:svg-icons-register'

二、实际应用

应用1:未封装,直接vue应用

<svg class="svg-icon card-panel-icon" aria-hidden="true"><use xlink:href="#icon-bug" :fill="color" />\
</svg>

注意:这里#icon-project,对应的就是在svg目录下的bug.svg。

image-20240908113951768

效果:

image-20240908114152405

应用2:封装vue组件使用

封装SvgIcon组件

创建vue组件:

image-20240908114216136

<template><svg :class="svgClass" aria-hidden="true"><use :xlink:href="iconName" :fill="color" /></svg>
</template><script>
import { isExternal } from '@/utils/validate'export default {name: 'SvgIcon',props: {iconClass: {type: String,required: true},className: {type: String,default: ''},color: {type: String,default: ''},},computed: {iconName() {return `#icon-${this.iconClass}`;},svgClass() {return this.className ? `svg-icon ${this.className}` : 'svg-icon';}}
}
</script><style scoped>
.svg-icon {width: 1em;height: 1em;vertical-align: -0.15em;fill: currentColor;overflow: hidden;
}.svg-external-icon {background-color: currentColor;mask-size: cover!important;display: inline-block;
}
</style>

main.js注册全局组件

import SvgIcon from '@/components/SvgIcon'Vue.component('svg-icon', SvgIcon)

vue页面使用组件

在vue中如何使用:

<svg-icon icon-class="project" class-name="card-panel-icon" />

参考文章

[1]. vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶续篇:https://zhuanlan.zhihu.com/p/570630648


资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

  • 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
  • 开源项目Studio-Vue—校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
  • 学习与生活-专栏:可以了解博主的学习历程
  • 算法专栏:算法收录

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅

相关文章:

vite学习教程05、vite+vue2构建本地 SVG 图标

文章目录 前言一、构建本地SVG图标详细步骤1、安装开发依赖2、配置vite2.1、配置vite.config.js2.2、封装vite引入插件脚本 解决报错&#xff1a;can not find package fast-glob imported 二、实际应用应用1&#xff1a;未封装&#xff0c;直接vue应用应用2&#xff1a;封装vu…...

机器学习——自监督学习与无监督学习

# 机器学习中的自监督学习与无监督学习 在机器学习的世界中&#xff0c;监督学习、无监督学习和自监督学习都是重要的学习方法。本文将聚焦于自监督学习与无监督学习&#xff0c;探讨它们的原理、应用场景以及技术细节&#xff0c;并通过大量代码示例来揭示这些方法的内在工作…...

2003经典绝版100%仿盛大服务端火炬引擎原版

;中国游戏制作 本版本为中国游戏制作小组推出的第一个版本&#xff0c;有什么不完美的地方还请大家多多指教&#xff01;&#xff01;&#xff01; 与盛大逼真&#xff01;&#xff01;&#xff01; 本版本M2Server采用“梦幻风”以及“冰眼”M2Server修改器修改的 2004/1/…...

银河麒麟服务器:更新软件源

银河麒麟服务器&#xff1a;更新软件源 1、使用场景2、操作步骤3、注意事项 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 1、使用场景 当需要安装最新软件或修改软件源配置后&#xff0c;需更新软件源以获取最新软件包信息。 2、操作步…...

字节跳动收购Oladance耳机:强化音频技术,加速VR/AR生态布局

字节跳动收购Oladance耳机&#xff1a;加码VR/AR领域布局 近日&#xff0c;字节跳动宣布已完成对开放式耳机品牌Oladance的收购&#xff0c;实现了对该品牌的100%控股。这一收购标志着字节跳动在AI硬件领域的进一步扩展和深化&#xff0c;特别是对其VR/AR领域布局的重要加码。 …...

Android SystemUI组件(11)SystemUIVisibility解读

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节思维导图&#xff0c;主要关注左侧最上方SystemUiVisibility解读部分即可。 本章节主要讲解SystemUiVisibility的概念及其相…...

JSON 全知全解:深入探索 JSON 的奥秘

目录 一、JSON 基础认知&#xff08;一&#xff09;JSON 的定义与历史&#xff08;二&#xff09;JSON 的语法规则&#xff08;三&#xff09;JSON 与 JS 对象的关系 二、JSON 在不同语言中的用法&#xff08;一&#xff09;JavaScript 中的 JSON 操作&#xff08;二&#xff0…...

CSS | 响应式布局之媒体查询(media-query)详解

media type(媒体类型)是CSS 2中的一个非常有用的属性&#xff0c;通过media type我们可以对不同的设备指定特定的样式&#xff0c;从而实现更丰富的界面。media query(媒体查询)是对media type的一种增强&#xff0c;是CSS 3的重要内容之一。随着移动互联网的发展&#xff0c;m…...

并查集的模拟实现

简化版本 class UnionFindSet { public:UnionFindSet(size_t n):_ufs(n, -1){}void Union(int x1, int x2){int root1 FindRoot(x1);int root2 FindRoot(x2);// 如果本身就在一个集合就没必要合并了if (root1 root2)return;// 控制数据量小的往大的集合合并if (abs(_ufs[roo…...

如何高效删除 MySQL 日志表中的历史数据?实战指南

在处理高并发的物联网平台或者其他日志密集型应用时&#xff0c;数据库中的日志表往往会迅速增长&#xff0c;数据量庞大到数百GB甚至更高&#xff0c;严重影响数据库性能。如何有效管理这些庞大的日志数据&#xff0c;特别是在不影响在线业务的情况下&#xff0c;成为了一项技…...

请散户股民看过来,密切关注两件大事

明天股市要开市&#xff0c;不仅散户股民期盼节后股市大涨&#xff0c;上面也同样想在节后来上一个“开门红”。 为此&#xff0c;上面没休假&#xff0c;关起门来办了两件大事&#xff0c;这两天发布消息已提前预热了。 两件大事如下&#xff1a; 一是&#xff0c;上交所10…...

设计模式之外观模式(Facade)

一、外观模式介绍 外观模式( Facade Pattern)&#xff0c;也叫门面模式&#xff0c;是一个 “结构型” 设计模式。 外观模式的原始定义是&#xff1a;为子系统中的一组接口提供统一的接口。它定义了一个更高级别 的接口&#xff0c;使子系统更易于使用。 外观模式&#xff0c;是…...

解锁 Python 嵌套字典的奥秘:高效操作与实战应用指南

文章目录 前言&#x1f340;一、 什么是 Python 字典&#xff1f;1.1 字典的语法 &#x1f340;二、 字典的基本操作2.1 字典的创建2.2 访问字典中的值2.3 添加或修改键值对2.4 删除字典中的键值对 &#x1f340;三、 字典的遍历操作3.1 遍历字典的键3.2 遍历字典的值3.3 同时遍…...

联想服务器配置阵列、安装操作系统

文章目录 [toc]1.配置阵列2.制作启动盘3.安装系统 1.配置阵列 1.根据提示进入BIOS设置&#xff08;F1&#xff09; 2.系统设置 3.存储 4.第四步可以看到raid卡信息 5.Main Menu 6.Configuration Management 7.Create Virtual Drive 8.Select RAID Level raid5 9.Select Drives…...

【深度强化学习】DDPG实现的4个细节(OUNoise等)

文章目录 前言一、论文内容简述创新点&#xff08;特点&#xff0c;与DQN的区别&#xff09;&#xff1a;可借鉴参数&#xff1a;细节补充&#xff1a; 二、细节1&#xff1a;weight_decay原理代码 三、细节2&#xff1a;OUNoise原理代码 四、细节3&#xff1a;ObsNorm原理代码…...

算法工程师重生之第二十二天(递增子序列 全排列 全排列 II 重新安排行程 N皇后 解数独 总结 )

参考文献 代码随想录 一、非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作…...

css的选择器及优先级

一、css选择器 CSS选择器是用来选择HTML文档中的元素&#xff0c;并为它们应用样式规则的工具。CSS选择器有很多种&#xff0c;可以根据元素的类名、ID、属性、伪类、伪元素、标签等来选择元素。以下是一些常见的CSS选择器及其用法&#xff1a; 1. ID选择器&#xff1a; 根据…...

JavaScript中的数组不改变原数组的方法

数组 var a [1, 2, 3, 5, 8, 13, 21] 不改变原数组的方法 length 数组元素的长度 继承自原型 concat(arrayX,arrayY) 合并两个或多个数组&#xff0c;返回新数组 合并&#xff0c;a.concat(b) var a[1,2,3],b[4,5,6],c[7,8,9]; a.concat(b,c); //[1, 2, 3, 4, 5, 6, 7…...

Go语言实现长连接并发框架 - 路由分组

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了任务执行流的路由模块&#xff0c;接下来我们实现一下对任务执行流进行任务 接口 trait/router_group.go type RouterGroup interface {RouterGroup(flow ..…...

跨 VLAN 通信

跨 VLAN 通信指的是不同 VLAN 之间的网络设备进行数据交换的能力。由于 VLAN 将网络分割成多个逻辑隔离的广播域&#xff0c;默认情况下&#xff0c;不同 VLAN 之间的设备无法直接通信。为了实现跨 VLAN 通信&#xff0c;需要借助一些网络设备和技术。以下详细讲解跨 VLAN 通信…...

手机续航的秘密武器:深入解读LPDDR5的Power Down与Deep Sleep省电机制

手机续航的秘密武器&#xff1a;深入解读LPDDR5的Power Down与Deep Sleep省电机制 当你的手机屏幕熄灭时&#xff0c;一场精密的节能芭蕾正在内存芯片内部上演。现代智能手机中&#xff0c;LPDDR5内存的功耗可能占到整机待机功耗的30%以上&#xff0c;而Power Down与Deep Sleep…...

Numpy第十章 统计相关

一.次序统计1.计算最小值 numpy.amin&#xff08;&#xff09;函数功能&#xff1a;返回数组或沿指定轴的最小值。函数&#xff1a;numpy.amin(a[, axisNone, outNone, keepdimsnp._NoValue,alnp._NoValue, wherenp._NoValue])参数&#xff1a;a&#xff1a;输入数组。axis&…...

别再死记硬背了!用Halcon的vector_angle_to_rigid算子搞定视觉定位,附完整代码

视觉定位实战&#xff1a;用Halcon的vector_angle_to_rigid算子避开几何变换的三大误区 在工业视觉项目中&#xff0c;刚体变换是坐标转换的核心技术&#xff0c;但许多工程师在使用Halcon的vector_angle_to_rigid算子时&#xff0c;常陷入三个致命误区&#xff1a;误认为旋转…...

图片压缩与懒加载的完美结合:提升网站性能的终极指南

图片压缩与懒加载的完美结合&#xff1a;提升网站性能的终极指南 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库&#xff0c;使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs 在…...

OpenVSCode Server数据安全终极指南:完整备份与恢复策略

OpenVSCode Server数据安全终极指南&#xff1a;完整备份与恢复策略 【免费下载链接】openvscode-server 项目地址: https://gitcode.com/gh_mirrors/op/openvscode-server OpenVSCode Server是一款强大的云端代码编辑器&#xff0c;让开发者能够在浏览器中享受完整的V…...

组合导航(五):惯性导航系统的误差分析与校正方法

1. 惯性导航系统误差的根源剖析 刚接触惯性导航的朋友们常会遇到这样的困惑&#xff1a;为什么同样的设备&#xff0c;在不同环境下定位精度差异这么大&#xff1f;这就像用同一把尺子测量物体&#xff0c;有时准有时不准&#xff0c;问题往往出在尺子本身的误差上。惯性导航系…...

别再只盯着高分框了!手把手教你用ByteTrack的‘两次匹配’搞定遮挡目标跟踪

ByteTrack实战&#xff1a;如何用两次匹配机制解决遮挡目标跟踪难题 在智慧交通路口&#xff0c;一辆公交车缓缓驶过摄像头&#xff0c;紧随其后的摩托车因完全被遮挡而"消失"在系统中&#xff1b;商场监控画面里&#xff0c;密集人群中突然蹲下系鞋带的顾客被算法判…...

Video2X问答指南:用AI无损放大视频的10个常见问题解答

Video2X问答指南&#xff1a;用AI无损放大视频的10个常见问题解答 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/…...

Java大文件分片上传完整实现教程

解决网络不稳定、服务器内存压力和用户体验差等问题是大文件分片上传的必要性。1. 分片上传允许在网络中断后只重传失败分片&#xff0c;提高成功率&#xff1b;2. 减少服务器单次处理的数据量&#xff0c;减少内存和i/o压力&#xff1b;3. 支持断点续传和秒传功能&#xff0c;…...

保姆级教程:手把手教你用LIN诊断协议传输超过5字节的数据(附多帧传输实战代码)

突破LIN诊断协议5字节限制&#xff1a;多帧传输实战指南 在汽车电子开发中&#xff0c;LIN总线因其低成本、高可靠性的特点&#xff0c;被广泛应用于车身控制、传感器网络等场景。但LIN协议的单帧5字节数据限制&#xff0c;常常成为开发者面临的技术瓶颈——无论是ECU固件升级还…...