Vite插件自动编译svg图标为字体

news2024/11/19 4:23:39

前言

今天来点儿6的.本文或许需要花费点时间才能理解.
目前是草稿阶段,比较凌乱,许多部分没有详细说明,日后有空更新补充.

本文主要提供解决思路,请按需调整.

很多时候我们在开发阶段是不能确定使用哪些图标的,它会随着开发不停的新增或调整.
所以我一般会从iconfont直接下载svg图标保存起来.

注意本段为废话可以跳过
一开始我是直接将svg代码直接插入dom中,但总觉得这么干会浪费内存影响效率之类的…后来我就好奇平时常见的图标字库是怎么构建的…

查着查着就发现了svgtofont这件神器.
它可以自动寻找某个目录下的svg文件,随后一键生成.less .css .ttf .woff这一堆你要的文件,岂不美哉…
关于它的用法及原理本文不着重介绍,小伙伴可以自行查询,一抓一大把…

开始

本文目的主要解决两大痛点

  1. 使用vite自动更新构建svg图标库到项目中
  2. 还是使用vite自动更新构建svg图标库到项目中

解决

我写了一个vite.plugin.svgtofont.ts插件,以实现自动重编译.
它目前在我的UI库中工作的很好,很大程度提高了我编写该库的效率.

根目录下创建一个文件 vite.plugin.svgtofont.ts

//vite.plugin.svgtofont.ts
import { PluginOption } from "vite";
import path from 'path'
import chokidar from 'chokidar';
import svgtofont from 'svgtofont';
import fs from 'fs';

/* 注意 svg文件名不能存在空格 */
const plugin: PluginOption = {
    name: 'svgtofont',
    configureServer(server) {
        // 监视 SVG 目录
        const fontName = "mpui-icon"
        const src = path.resolve(__dirname, 'svg');
        const dist = path.resolve(__dirname, 'src/Components/Icon/font');
        const watcher = chokidar.watch(src, { ignoreInitial: true });
        console.log(`[vite.plugin.svgtofont]开始监视SVG目录文件变化:${src}`);

        const rebuild = async () => {
            // 当 SVG 文件变化时,使用 svgtofont 重新编译字体
            await svgtofont({
                fontName, src, dist,
                css: {
                    fontSize: "1em",
                },
                // 其他 svgtofont 配置项...
            });

            //生成TS引用文件
            console.log(`[vite.plugin.svgtofont]SVG图标重编译->生成TS引用文件...`);
            const cssFilePath = path.resolve(dist, `${fontName}.css`);
            const cssContent = fs.readFileSync(cssFilePath, 'utf-8');
            // console.log("=>cssContent:", cssContent);

            // 使用正则表达式匹配所有的图标名称
            const iconNames = cssContent.match(/\.mpui-icon-(\w+):before/g) || [];
            // 生成 TypeScript 文件的内容
            let tsContent = `import "./${fontName}.less"\nexport type IconName =\n`;
            iconNames.forEach((iconName, index) => {
                iconName = iconName.replace(`.${fontName}-`, '').replace(':before', '');
                tsContent += `  | '${iconName}'\n`;
            });
            //console.log("=>tsContent:", tsContent);
            fs.writeFileSync(path.resolve(dist, `${fontName}.ts`), tsContent);


            console.log(`[vite.plugin.svgtofont]SVG图标->重编译完成,重加载页面...`);

            // 通知 Vite 重新加载页面
            server.ws.send({ type: 'full-reload', });
            console.log(`[vite.plugin.svgtofont]SVG图标->重载完成!`);

        }
        watcher.on("ready", async () => {
            console.log(`[vite.plugin.svgtofont]SVG图标重编译->初始化...`);
            await rebuild();
        });
        watcher.on('add', async (path) => {
            console.log(`[vite.plugin.svgtofont]SVG图标重编译-新增文件:${path}`);
            await rebuild();
        });
        watcher.on('unlink', async (path) => {
            console.log(`[vite.plugin.svgtofont]SVG图标重编译-移除文件:${path}`);
            await rebuild();
        });
    }
}


export default plugin

使用

修改vite配置文件,新增我们刚才写的插件.

//vite.config.ts
import svgtofont from "./vite.plugin.svgtofont"
import { defineConfig } from "vite"
export default defineConfig({

   ...
    plugins: [
        svgtofont,
    ],
    optimizeDeps: {
        /* 设置不被Vite打包的包 */
        exclude: ["fs", "path", "chokidar", "svgtofont"],
    }
}) 

然后你需要制作一个Icon类负责实例化元素
这里使用到了CustomElements 没用过的话可以去补课一下

import { IconName } from '你插件上配置的输出路径';

export class Icon extends HTMLElement{
constructor(name: IconName ) {
  super()
  this.classList.add( `mpui-icon-${nameOrSVG}`)
  
  }
}

export defalut Icon 
if(!customElements.get("mpui-icon"))customElements.define("mpui-icon",Icon)

然后用起来就很简单了

import Icon from "./Icon"
document.body.appendChild(new Icon("MiragePulse"))

随后你会在dom中看到一个名为mpui-icon的元素
神奇吧.你可以在上面提到的Icon.ts结尾部分更改它叫啥
在这里插入图片描述

这个元素被渲染出来以后是这样的
在这里插入图片描述
这是我用Illustrator画的一个小图标,转存为了SVG文件生成的.
(Illustrator生成的SVG大多数情况不能直接使用,还需要进一步压缩处理,下次更新说明)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Qt Widget中文示例指南」如何实现一个日历?(三)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文中的CalendarWi…

RabbitMQ中交换机的应用 ,原理 ,案例的实现

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《RabbitMQ中交换机的应用及原理,案…

如何保证缓存与数据库双写时的数据一致性?

背景:使用到缓存,无论是本地内存做缓存还是使用 Redis 做缓存,那么就会存在数据同步的问题,因为配置信息缓存在内存中,而内存时无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题。 …

代码中遇到的问题2

目录 记录: 好处: 问题一: 解答: 问题二: 解答: 常见类型问题: 记录: string connStr ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; 在代码中写上这段代码,将连接数据库的代码语句放到&#xff…

安全基础~通用漏洞2

文章目录 知识补充盲注Boolean盲注延时盲注报错注入二次注入 知识补充 盲注常用 if(条件,5,0) #条件成立 返回5 反之 返回0 left(database(),1),database() #left(a,b)从左侧截取a的前b位 盲注 盲注就是在注入过程中,获取的数据不能回显至前端页面。 …

Oracle Linux 7.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!本次安装图解是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。生产环境…

Ask for Power Apps 消失了?

Ask for Power Apps 消失了? 背景替换定义一个接收数组的参数1.我们新建一个Text接收参数取名为**Arrlist**.定义一个参数类型是Array 背景 今天才发现,我在flow中想向power apps索要一个参数,但是之前的Ask for Power Apps 这个触发器怎么也找不到了。…

【Vulnhub通关】Kioptrix:Level 1 (#1)

文章目录 准备工作靶机基本信息下载 渗透流程主机发现目标扫描服务探测HTTP(S)服务SMB文件共享服务 权限提升本次靶机测试到此结束 注意:本文转载自本人稀土掘金博客。博客地址:御坂19008号 的个人主页 - 动态 - 掘金 准备工作 靶机基本信息 靶机名称&a…

SUSE Linux 15 SP5 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!本次安装图解是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。生产环境…

寒假思维训练day12 E. Increasing Subsequences

适合喜欢算法、对算法感兴趣的朋友。 今天又来更新啦,断更一天,有点摆了,今天继续补上,献上一道1800的构造。 摘要: part1:关于一些构造题的总结 part2: 每日一题: Problem - E - Codeforces (链接在此…

【XR806开发板试用】通过MQTT实现手机远程实现PWM控灯

本文参与极术社区的《基于安谋科技STAR-MC1的XR806开发板试用》活动。 一、例程编译、烧录确认 首先按照全志在线文档平台的点灯教程确保能正常编译、烧录和点灯:https://xr806.docs.aw-ol.com/study/soft_led/ 确保例程没问题后,我们再改造例程&#xf…

Java入门高频考查基础知识5(扎实技术基础应变一切变化-45题4.2万字参考答案)

技术变革裁员影响的因素: 自动化替代简单重复性工作:随着技术的发展,一些简单、重复性的编码任务可能被自动化工具或者机器学习算法取代。这可能导致一些岗位的需求减少或者消失,从而可能导致部分人员裁员。 技能更新要求&#x…

怎么移除WordPress后台工具栏“新建”菜单?如何添加“新建文章”菜单?

默认情况下,WordPress后台顶部管理工具栏有左侧有一个“新建”菜单,而且还有下拉菜单文章、媒体、链接、页面和用户等,不过我们平时用得最多的就是“新建文章”,虽然可以直接点击“新建”,或点击“新建 – 文章”&…

Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

目录 AOP概念AOP底层原理AOP(JDK动态代理)使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象**编写** **JDK** 动态代理代码 AOP(术语)AOP操作(准备工作)**AOP** **操作(**AspectJ注解)**AOP** **操作(**AspectJ…

c++ 包管理工具vcpkg

微软包管理工具 一、下载 git clone https://github.com/microsoft/vcpkg二、初始化 ./vcpkg/bootstrap-vcpkg.sh三、查看帮助文档 ./vcpkg/vcpkg help四、安装包 vcpkg/vcpkg install fmt五、查看安装包 vcpkg/vcpkg list输出 包实际安装路径 ./vcpkg/packages/fmt_x…

LoadRunner从零开始之走近LoadRunner

3.1 LoadRunner 的运行原理 安装LoadRunner 后,在菜单“开始” 一“MercuryLoadRunner” 中,你会看 到这样一组程序,如图 3-1 所示。 • 其中Applications 下面的Analysis、Controller 和Virtual User Generator 是我们 做性能测试最常用的…

大学生求职遇到在线测评 需要结合实际做吗

每年毕业季,都有大量的大学生求职,企业在这个时候往往能够收到很多的求职简历,尤其是一些比较好的岗位,原本只是想要招收10个人,但是结果光是简历就收到上千个简历,一个个面试不实际,浪费时间和…

猫用空气净化器哪些好?五款宠物空气净化推荐!

如今,养宠物的家庭越来越多了!家里因此变得更加温馨,但同时也会带来一些问题,比如异味和空气中的毛发可能会对健康造成困扰。 为了避免家中弥漫着异味,特别是来自宠物便便的味道,一款能够处理家里异味的宠…

数字证书和数字证书认证机构和数字根证书,CA,RCA

文章目录 一、 数字证书1、什么是数字证书2、数字证书干什么的3、风险 二、数字证书认证机构(Certificate Authority,缩写为CA)参考文章 一、 数字证书 维基百科 公开密钥认证(英语:Public key certificate&#xff…

Unity Text超框 文字滚动循环显示

Unity Text超框 文字滚动循环显示 //container Text using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI;public class AutoScrollText : MonoBehaviour {private Text[] _texts new Text[…