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

文章目录

前言

博主介绍:✌目前全网粉丝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 } = env
  return {
    base: './', // 打包的静态资源引用路径
    plugins: createVitePlugins(env, command.includes('build')), // 放插件用的
    resolve: {
      alias: {
        // 设置路径
        '~': path.resolve(__dirname, './'),
        // 设置别名
        '@': path.resolve(__dirname, './src')
      },
      // https://cn.vitejs.dev/config/#resolve-extensions
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
    }
  }
})

对应编写内容如下:

2.2、封装vite引入插件脚本

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

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
}

核心如下:

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

若是出现报错:

安装依赖:

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。

效果:

应用2:封装vue组件使用

封装SvgIcon组件

创建vue组件:

vue 复制代码
<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注册全局组件

js 复制代码
import SvgIcon from '@/components/SvgIcon'

Vue.component('svg-icon', SvgIcon)

vue页面使用组件

在vue中如何使用:

vue 复制代码
<svg-icon icon-class="project" class-name="card-panel-icon" />

参考文章

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


资料获取

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

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

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

相关推荐
wang_book4 分钟前
uniapp学习(003-3 vue3学习 Part.3)
前端·学习·微信小程序·小程序·uni-app·node.js·vue
佑我中华8 分钟前
HAL+M4学习记录_3
c语言·stm32·单片机·嵌入式硬件·mcu·学习
wclass-zhengge23 分钟前
JVM篇(学习预热 - 云原生时代的JVM(GraalVM))(持续更新迭代)
jvm·学习
s_little_monster1 小时前
【QT】信号和槽
开发语言·数据库·c++·经验分享·笔记·qt·学习
sealaugh321 小时前
aws(学习笔记第二课) AWS SDK(node js)
笔记·学习·aws
叫我龙翔2 小时前
【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法
服务器·网络·网络协议·学习·http
人工智能技术咨询.2 小时前
人工智能机器视觉就业前景怎么样?
人工智能·深度学习·学习·计算机视觉·语言模型
bylander2 小时前
【AI学习】Mamba学习(二):线性注意力
人工智能·学习·transformer
怀九日2 小时前
单片机(学习)2024.10.9
开发语言·汇编·c++·单片机·学习·指令·