Vue3.0教程 (八)svg图标组件封装
vue3脚手架
·
vite-plugin-svg-icons
文章目录
一、安装
npm i vite-plugin-svg-icons -D
二、在 vite.config.js
中配置
import viteSvgIcons from 'vite-plugin-svg-icons'
import path from 'path'
export default () => {
return {
plugins: [
viteSvgIcons({
// Specify the icon folder to be cached
iconDirs: [path.resolve(process.cwd(), 'src/icons')],
// Specify symbolId format
symbolId: 'icon-[dir]-[name]'
})
]
}
}
上期说到使用插件,那么可以通过vite插件引入
在 vite/plugins/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
})
}
在 vite/plugins/index.js 下使用
import vue from '@vitejs/plugin-vue'
import createAutoImport from './auto-import'
import createSvgIcon from './svg-icon'
export default function createVitePlugins(viteEnv, isBuild = false) {
const vitePlugins = [vue()]
vitePlugins.push(createAutoImport())
vitePlugins.push(createSvgIcon(isBuild))
// isBuild && vitePlugins.push(...createCompression(viteEnv))
return vitePlugins
}
三、在 main.js
中加入如下代码:
import 'virtual:svg-icons-register'
四、新建 vue 组件:/src/components/SvgIcon/index.vue
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName" :fill="color" />
</svg>
</template>
<script>
export default defineComponent({
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
},
color: {
type: String,
default: ''
},
},
setup(props) {
return {
iconName: computed(() => `#icon-${props.iconClass}`),
svgClass: computed(() => {
if (props.className) {
return `svg-icon ${props.className}`
}
return 'svg-icon'
})
}
}
})
</script>
<style scope lang="scss">
.sub-el-icon,
.nav-icon {
display: inline-block;
font-size: 15px;
margin-right: 12px;
position: relative;
}
.svg-icon {
width: 1em;
height: 1em;
position: relative;
fill: currentColor;
vertical-align: -2px;
}
</style>
新建 js 文件:/src/components/SvgIcon/svgicon.js
import * as components from '@element-plus/icons-vue'
export default {
install: (app) => {
for (const key in components) {
const componentConfig = components[key];
app.component(componentConfig.name, componentConfig);
}
},
};
五、src 目录下建立 icons 目录存放 svg 图标
# src/icons/svg
- back.svg
六、main.js下注册
import SvgIcon from '@/components/SvgIcon'
import elementIcons from '@/components/SvgIcon/svgicon' // element的图标 记得需要安装element
app.use(elementIcons)
app.component('svg-icon', SvgIcon)
七、页面使用
<header>
<svg-icon iconClass="bmh" ></svg-icon>
</header>
八、在通过vue.config.js 引入
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
const path = require('path')
import { resolve } from 'path' // 主要用于alias文件路径别名
// vite插件
import createVitePlugins from './vite/plugins'
// https://vitejs.dev/config/
export default defineConfig({
plugins:createVitePlugins(),
// 是否自动在浏览器打开
open: true,
// 是否开启 https
https: false,
// 服务端渲染
ssr: false,
/**
* 在生产中服务时的基本公共路径。
* @default '/'
*/
base: './',
/**
* 与“根”相关的目录,构建输出将放在其中。如果目录存在,它将在构建之前被删除。
* @default 'dist'
*/
outDir: 'dist',
resolve: {
alias: {
// 设置路径
'~': path.resolve(__dirname, './'),
// 设置别名
'@': path.resolve(__dirname, './src')
// 键必须以斜线开始和结束
// "/@/": path.resolve(__dirname, "./src"),
},
// https://cn.vitejs.dev/config/#resolve-extensions
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
},
// 引入第三方的配置
// optimizeDeps: {
// include: ["moment", "echarts", "axios", "mockjs"],
// },
// 打包配置
build: {
target: 'modules',
outDir: 'dist', //指定输出路径
assetsDir: 'assets', // 指定生成静态资源的存放路径
minify: 'terser', // 混淆器,terser构建后文件体积更小
},
// 本地运行配置,及反向代理配置
server: {
port: 8089,
host: "0.0.0.0",
// 是否开启 https
https: false,
cors: true, // 默认启用并允许任何源
open: true, // 在服务器启动时自动在浏览器中打开应用程序
//反向代理配置,注意rewrite写法,开始没看文档在这里踩了坑
proxy: {
// https://cn.vitejs.dev/config/#server-proxy
'/Meiam': {
target: 'http://localhost:8080/',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/Meiam/, '')
}
}
},
})
更多推荐
已为社区贡献2条内容
所有评论(0)