一:components下新建svgIcon.vue文件

<template>  <svg :class="svgClass" v-bind="$attrs" :style="style"><use :xlink:href="iconName" /></svg>
</template><script lang="ts">
import { computed } from 'vue'
import { defineComponent} from 'vue'
export default defineComponent({props: {name: {type: String,required: true,},style: {type: Object,default: '',},},setup(props) {const iconName = computed(()=>`#icon-${props.name}`);const svgClass = computed(() => {if (props.name) {return `svg-icon icon-${props.name}`}return 'svg-icon'})return {svgClass,iconName}},
})
</script><style>
.svg-icon { fill: currentColor;vertical-align: middle;
}
</style>

二: 创建icons文件夹,存放svg文件

三:在main.ts里面全局注入svg-icon组件

// 注入svg
import svgIcon from './components/svgIcon.vue'
app.component('svg-icon', svgIcon)

四: 在plugins文件夹创建svgBuilder.js

import { readFileSync, readdirSync } from 'fs'let idPerfix = ''
const svgTitle = /<svg([^>+].*?)>/
const clearHeightWidth = /(width|height)="([^>+].*?)"/gconst hasViewBox = /(viewBox="[^>+].*?")/gconst clearReturn = /(\r)|(\n)/gfunction findSvgFile(dir) {const svgRes = []const dirents = readdirSync(dir, {withFileTypes: true})for (const dirent of dirents) {if (dirent.isDirectory()) {svgRes.push(...findSvgFile(dir + dirent.name + '/'))} else {const svg = readFileSync(dir + dirent.name).toString().replace(clearReturn, '').replace(svgTitle, ($1, $2) => {// console.log(++i)// console.log(dirent.name)let width = 0let height = 0let content = $2.replace(clearHeightWidth,(s1, s2, s3) => {if (s2 === 'width') {width = s3} else if (s2 === 'height') {height = s3}return ''})if (!hasViewBox.test($2)) {content += `viewBox="0 0 ${width} ${height}"`}return `<symbol id="${idPerfix}-${dirent.name.replace('.svg','')}" ${content}>`}).replace('</svg>', '</symbol>')svgRes.push(svg)}}return svgRes
}export const svgBuilder = (path, perfix = 'icon') => {if (path === '') returnidPerfix = perfixconst res = findSvgFile(path)// console.log(res.length)// const res = []return {name: 'svg-transform',transformIndexHtml(html) {return html.replace('<body>',`<body><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">${res.join('')}</svg>`)}}
}

五: 最后在vite.config.ts修改配置

import { svgBuilder } from './src/plugins/svgBuilder'; export default defineConfig({plugins: [svgBuilder('./src/icons/svg/')] // 这里已经将src/icons/svg/下的svg全部导入,无需再单独导入
})

六: 在页面中使用

<svg-icon name="aa" :style='style' ></svg-icon><script lang="ts">
import { defineComponent } from 'vue' export default defineComponent({name: 'HelloWorld', setup: () => {const style = {width: '50px'}return { style }}
})
</script>

在vue3+vite+ ts 项目中使用svg相关推荐

  1. 【Vue3+Vite+TS项目集成ESlint +Prettier实现代码规范检查和代码格式化】

    目录 前言 创建项目 安装初始化ESlint 安装ESlint: 初始化ESlint: 安装配置Prettier 安装prettier: 配置prettier: 配置VScode保存时自动格式化代码 ...

  2. vue3+vite+ts项目集成科大讯飞语音识别(项目搭建过程以及踩坑记录)

  3. vue3 + vite + ts 集成mars3d

    vue3 + vite + ts 集成mars3d 文章目录 vue3 + vite + ts 集成mars3d 前言 一.创建一个vue3 + vite + ts项目 二.引入mars3d相关依赖 ...

  4. 如何在vue3+vite+ts中使用require

    vue3+vite+ts中不能使用require 之前使用vue2,去动态设置图片src属性时,采用require,但是vue3+vite+ts中使用require,项目能够运行,但浏览器中报错req ...

  5. vue3:vue3+vite+ts+pinia

    一.背景 记录一套技术方案. 二.项目基础 2.1.创建项目 yarn create vite 输入名字后,这里出现了几个选项,不清楚都是干啥的,下来研究 选择后完成 2.2.vite.config. ...

  6. vue3 vite ts引入vue文件报错 ts(2307)

    vue3 vite ts 生成的项目模板,在ts文件中引入vue文件报错 ts(2307),只是ts报错,并不影响项目运行. 官方文档有说明:http://vue.dragonlm.com/guide ...

  7. vue+ts项目中import图片时报错Cannot find module ‘xxx‘ or its corresponding type declarations

    TS项目中import图片时报错Cannot find module 'xxx' or its corresponding type declarations 在vue+ts项目中使用import的形 ...

  8. vue3+vite配置项目运行前eslint检查以及git提交前eslint检查的方案总结

    vue3+vite配置项目运行前eslint检查以及git提交前eslint检查的方案总结 1.需求背景 最近在新项目搭建过程中有这样一个需求:由于是团队协同开发,所以在开发是代码规范是一个很重要的环 ...

  9. Vue项目中操作svg文件

    Vue项目中使用svg 引入依赖 yarn add svg-sprite-loader -D [可选] yarn add svgo svgo-loader -D 依赖说明: svg-sprite-lo ...

最新文章

  1. Mybatis的各种查询功能
  2. mysql update 锁_Mysql心路历程:两个”log”引发的”血案”
  3. spring中的AnnotationConfigUtils
  4. 数据中心不仅可以好看,还可以变身大型暖气!
  5. spring-boot 自定义启动图标彩蛋
  6. 【Flink】Flink The TaskSlotTable has to be started
  7. 替代NXP的CLRC663国产芯片来了,再也不用被老外卡脖子了
  8. 从零开始学Java自己利用接口和集合框架做的简单图书管理系统
  9. android完全关闭应用程序,安卓手机后台程序不能彻底关闭?试试这个强制关闭的功能!...
  10. 法学生民法方面的论文选题,有什么推荐吗?
  11. 房东要涨800房租,我用Python抓取帝都几万套房源信息,主动涨了1000。
  12. macOS Big Sur 11.2.3 (20D91) 正式版发布,百度网盘下载
  13. 第十七届全国大学智能车竞赛赛场合影集锦
  14. EOS私链发币简要说明
  15. csv文件导入Mysql
  16. PaddlePaddle深度学习实战——英法文翻译机
  17. 【Go语言入门100题】021 重要的话说三遍 (5 分) Go语言 | Golang
  18. C语言:L1-014 简单题 (5 分)
  19. 基于台达PLC的水箱液位PID控制(matlab处理数据)
  20. [水晶报表]为水晶报表(含子报表)绑定数据

热门文章

  1. JavaWeb学习总结(十二):Session
  2. Elasticsearch技术解析与实战(七)Elasticsearch批量操作
  3. 跨库多维分析后台的实现
  4. 从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理
  5. Java Web 技术栈
  6. 解决 jquery.form.js和springMVC上传 MultipartFile取不到信息
  7. 注册表 ControlSet001、ControlSet002以及CurrentControlSet
  8. Oracle修改字段类型方法
  9. 分辨率与栅格系统的对应关系:
  10. 3.4.1 变量初始化