起因
在开发一些个人项目的时候,我非常喜欢使用一个开源图标库Remix Icon,这次在开发文件服务器的时候也使用了这个库,我只是单纯的觉得caddy和nginx自带的文件服务UI不好看,所以就做了一个简易版本的。
当我按照平常一样的使用方式:
安装
1npm install remixicon --save使用
1import 'remixicon/fonts/remixicon.css'文件服务一般都是非常小和简单的页面的,当我打包了之后查看打包文件大小,其中remixicon占用了非常大的空间。

改进
Remix Icon中在vue3中还有专门的引入方式:
安装
1npm install @remixicon/vue使用
1<script setup lang="ts">2import { RiHeartFill } from "@remixicon/vue";3</script>4
5<template>6    <RiHeartFill size="36px" color="red" className="my-icon" />7</template>这是最普通的使用方式,但是我的使用场景比较复杂,我需要根据后台发来的数据来判断应该显示什么图标。
示例
1import {2  RiFolder3Fill,3  RiImageFill,4  RiFileGifFill,5} from "@remixicon/vue"6
7const iconClass = {8  dir: RiFolder3Fill,9  png: RiImageFill,10  gif: RiImageFill,11}12/**13 * 获取对应文件类型的图标样式14 * @param {string} extname  文件后缀名15 * @param {string} type 文件类型: image | doc | music | video | audio | code | default5 collapsed lines
16 * @returns17 */18export const getIconClass = ({ extname, type }) => {19  return { svg: iconClass[extname], color: `text-color-${type}` }20}1<script setup>2  function renderIcon({extname, type}) {3    let iconClass = getIconClass({extname, type})4    return () => h(iconClass.svg, {5      class: iconClass.color,6      size: '20px'7    });8  }9</script>10<template>11  <component :is="renderIcon({ extname: item.ext, type: item.type })"></component>12</template>这样就这可以根据传入的值来判断需要显示什么图标了。
改用这种方式来引入Svg图标之后,再来看看打包的大小变化吧,舒服多了。

 
  
 