打包svg地图
-
安装插件
shyarn add vite-plugin-svg-icons -D # or npm i vite-plugin-svg-icons -D # or pnpm install vite-plugin-svg-icons -D
-
使用插件
vite.config.ts
tsimport { VantResolver } from 'unplugin-vue-components/resolvers' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' +import path from 'path' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), Components({ dts: false, resolvers: [VantResolver({ importStyle: false })] }), + createSvgIconsPlugin({ + // 指定图标文件夹,绝对路径(NODE代码) + iconDirs: [path.resolve(process.cwd(), 'src/icons')] + }) ],
-
导入到main
ts+import 'virtual:svg-icons-register'
-
使用svg精灵地图
html<svg aria-hidden="true"> <!-- #icon-文件夹名称-图片名称 --> <use href="#icon-login-eye-off" /> </svg>
小结:
- icons文件打包的产物?
- 会生成一个 svg 结构(js创建的)包含所有图标,理解为
精灵图
- 会生成一个 svg 结构(js创建的)包含所有图标,理解为
- 怎么使用svg图标?
- 通过 svg 标签
#icon-文件夹名称-图片名称
指定图片,理解精灵图定位坐标
- 通过 svg 标签
【坑】vite-plugin-svg-icons报错:Cannot find package 'fast-glob'
自行安装一下fast-glob
依赖解决该问题
shyarn add fast-glob -D
图标组件-封装svg组件
组件 components/CpIcon.vue
html
<script setup lang="ts">
// 提供name属性即可
defineProps<{
name: string
}>()
</script>
<template>
<svg aria-hidden="true" class="cp-icon">
<use :href="`#icon-${name}`" />
</svg>
</template>
<style lang="scss" scoped>
.cp-icon {
// 和字体一样大
width: 1em;
height: 1em;
}
</style>
如果使用了 unplugin-vue-components 默认 src/compoenents 自动导入注册;
给组件添加类型,让写属性和事件可以有提示
类型 types/components.d.ts
ts
// 1. 导入组件实例
import CpIcon from '@/components/CpIcon.vue'
// 2. 声明 vue 类型模块
declare module 'vue' {
// 3. 给 vue 添加全局组件类型,interface 和之前的合并
interface GlobalComponents {
// 4. 定义具体组件类型,typeof 获取到组件实例类型
// typeof 作用是得到对应的TS类型
CpIcon: typeof CpIcon
}
}
使用:
html
<template>
<cp-icon name="login-eye-off"></cp-icon>
</template>