Skip to content
快速预览

配置图标和svg

✍️ w 🕒 2023-09-28 06:18:45(15 days ago) 🔗 H.各种练习项目

svg 是一种基于可扩展标记语言(XML)的图形格式,具有 不会失真 ,更小的体积。为了在项目中更好的使用 svg, vite + vue 这种形式下 有三种

unplugin-icons , 能够识别本地 svg 文件,并且可以配合 iconify 图标库,利用 unplugin-auto-import 可以实现自动下载 使用到的 iconify 图标集

vite-plugin-svg-icons, 针对本地 svg 图标插件管理,通过配合 封装的 svg 组件,利用其精灵图的特性可以优化 svg 数量

@iconify/vue,一个已经封装好的 vue 组件用来直接使用 iconify 图标库,支持cdn 加载图片,并且会将加载后的图标存储在本地,也可以使用 本地下载好的 iconify 图标库

具体使用 -- unplugin-icons

安装插件

bash
npm i -D unplugin-icons

创建文件 svgIconsPlugin.ts

js
/**
 * @name  svgIconsPlugin
 * @description 配置使用svg图标
 */

import Icons from 'unplugin-icons/vite'
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
import path from 'path'

export const svgIconsPlugin = () => {
  return Icons({
    // @default 默认vue3
    // compiler:'vue3',

    /**
     * 按需引入这个选项会自动为你的应用安装必要的运行时。这意味着你不需要手动导入或注册图标组件,它们会自动被引入并可用。
     *  */
    autoInstall: true,

    /**
     * 这个选项允许你定义自己的图标集合。每个集合都是一个键值对,其中键是集合的名称,值是一个加载器函数,用于加载和处理图标。
     */
    customCollections: {
      /**
       * FileSystemIconLoader
       * 第一个参数是 SVG 图标的路径,文件名(不包括扩展名)将被用作图标的名称
       * 第二个参数是这是一个处理函数,用于处理加载的 SVG 内容。在这个例子中,它将 SVG 的开头替换为 <svg fill="currentColor" 。
       * 这意味着图标的颜色会使用 CSS 的 currentColor 值,从而允许你通过 CSS 控制图标的颜色。
       */
      home: FileSystemIconLoader(path.resolve('src', 'assets/svg'), (svg) =>
        svg.replace(/^<svg /, '<svg fill="currentColor" ')
      )
    }
  })
}

autoRegistryCmpPlugin 创建配合自动导入组件的图标库的配置方法 IconsResolver

js
/**
 * @name  autoRegistryCmpPlugin
 * @description 按需加载,自动引入组件
 */
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import path from 'path'

import IconsResolver from 'unplugin-icons/resolver'

export const autoRegistryCmpPlugin = () => {
  return Components({
    // Auto register Element Plus components
    // 自动导入 Element Plus 组件
    resolvers: [
      ElementPlusResolver(),
      // 自动导入 svg 图标 用来配合 `unplugin-icons` 使用的
      IconsResolver({
        // prefix: 'icon', // 自动引入的Icon组件统一前缀,默认为 i,设置false为不需要前缀
        enabledCollections: ['home', 'ic'] // 这是可选的,默认启用 Iconify 支持的所有集合 ic 是Iconify 集合
      })
    ],
    // 指定生成的 组件的 ts 文件目录
    dts: path.resolve('types', 'components.d.ts'),

    directives: true
  })
}

具体使用 -- vite-plugin-svg-icons

安装

bash
yarn add vite-plugin-svg-icons -D
# or
npm i vite-plugin-svg-icons -D
# or
pnpm install vite-plugin-svg-icons -D

创建文件 svgSpriteIcons 文件配置插件

js
/**
 * @name  svgSpriteIcons
 * @description 配置使用svg图标,需要配合组件 SvgIcon使用 用来优化svg 雪碧图效果
 * @example   <svg-icon icon-class="文件名.svg" />
 */

import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'

export const svgSpriteIcons = () =>
  createSvgIconsPlugin({
    // 指定需要缓存的图标文件夹
    iconDirs: [path.resolve('src', 'assets/svg')],
    // 指定symbolId格式
    symbolId: 'icon-[dir]-[name]',

    /**
     * custom dom id
     * @default: __svg__icons__dom__
     */
    customDomId: '__svg__icons__dom__'
  })

配合全局组件 SvgIcon 进行使用

@iconify/vue

安装

bash
npm install --save-dev @iconify/vue

如果想使用本地的 iconify 图标,下载

bash
npm install --save-dev @iconify-icons/xx

为了将图库自动导入参考创建了一个脚本

js
/**
 * @name registryIconifyIcons
 * @description 注册 从 @iconify-icons 自动导入的svg
 */

function toCamelCase(str: string) {
  return str.replace(/-([a-z0-9])/g, function (_, letter) {
    return letter.toUpperCase()
  })
}

export function registryIconifyIcons(customCollections: string, icons: string[]) {
  const fromPrefix = `@iconify-icons/${customCollections}`

  return icons.reduce(
    (acc, icon) => {
      const fromKey = `${fromPrefix}/${icon}`
      acc[fromKey] = [['default', toCamelCase(icon)]]
      return acc
    },
    {} as { [key: string]: [[string, string]] }
  )
}

Released under the MIT License.