js提取iconfont项目的图标

iconfont 可以让我们轻松使用字体图标,比如使用 iconfont 提供的 js,就可以愉快的码代码了。

//at.alicdn.com/t/c/font_xxxxx.js

通常公司会有提供一套图标供所有系统使用,比如图标库里有 1000 个图标,但某个项目只需要使用 10 个,但 js 文件包含了所有的图标,就有点浪费网络资源了。比如下面只用了第一行的图标,其他的都不需要。

另一种场景是组件库,组件库引入了 iconfont 的 js 文件,加在了全部图标,这对于组件库来说是不能接受的;
当然可以手动将需要的图标一个一个放到组件库中,这样不止费劲后,还容易出错。

所以可不可以将图标自动提取出来,然后按需引入。

图标提取实现

先来看看 js 文件里图标是怎样存在的,可以看到所有的图标都放在一个svg里面,每个图标由symbol包裹起来,并且都有id属性,咱们就可以根据这些信息将图标从字符串里弄出来。

所以,正则表达式可以这么写:

const svgReg = /<symbol[^>]*>(<path[^<]*><\/path>)+<\/symbol>/gi;

然后遍历提取出来的symbol,转成svg即可,id可以作为图标的名称。

将 iconfont 的 js 文件字符串传递进createSVGFromSymbol,替换掉symbolidfill等属性。

const createSVGFromSymbol = (str) => {// 提取图标const symbolList = str.match(svgReg);const svgList: Array<string[]> = [];symbolList.forEach((sym: string) => {const svg = sym// 替换开始标签.replace(/^<symbol/, `<svg xmlns="http://www.w3.org/2000/svg" `)// 结束标签.replace(/<\/symbol>$/, "</svg>")// 删除 id.replace(/ id="(.*?)" /, "")// 删除 fill属性.replace(/ fill="(.*?)"/g, "");});return svgList;
};

比如这个图标代码:

<symbol id="icon-close" viewBox="0 0 1024 1024"><pathd="M557.312 513.248l265.28-263.904c12.544-12.48 12.608-32.704 0.128-45.248-12.512-12.576-32.704-12.608-45.248-0.128l-265.344 263.936-263.04-263.84C236.64 191.584 216.384 191.52 203.84 204 191.328 216.48 191.296 236.736 203.776 249.28l262.976 263.776L201.6 776.8c-12.544 12.48-12.608 32.704-0.128 45.248 6.24 6.272 14.464 9.44 22.688 9.44 8.16 0 16.32-3.104 22.56-9.312l265.216-263.808 265.44 266.24c6.24 6.272 14.432 9.408 22.656 9.408 8.192 0 16.352-3.136 22.592-9.344 12.512-12.48 12.544-32.704 0.064-45.248L557.312 513.248z"></path>
</symbol>

转换之后就是这样子了

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"><pathd="M557.312 513.248l265.28-263.904c12.544-12.48 12.608-32.704 0.128-45.248-12.512-12.576-32.704-12.608-45.248-0.128l-265.344 263.936-263.04-263.84C236.64 191.584 216.384 191.52 203.84 204 191.328 216.48 191.296 236.736 203.776 249.28l262.976 263.776L201.6 776.8c-12.544 12.48-12.608 32.704-0.128 45.248 6.24 6.272 14.464 9.44 22.688 9.44 8.16 0 16.32-3.104 22.56-9.312l265.216-263.808 265.44 266.24c6.24 6.272 14.432 9.408 22.656 9.408 8.192 0 16.352-3.136 22.592-9.344 12.512-12.48 12.544-32.704 0.064-45.248L557.312 513.248z"></path>
</svg>

同时可以将id提取出来,作为保存 svg 文件时的文件名,所以代码就变成下面的样子了。


// 将空格/- 去掉,转换成驼峰
const processSvgName = (name = ''): string[] => {return name// 替换-_.replace(/-/g, ' ').replace(/_/g, ' ').split(' ').filter((str) => !!str).map((item) => item.toLowerCase())// 转换成驼峰.map((str: string) => {if (str.length > 1) {return str[0].toUpperCase() + str.slice(1);}return str[0].toUpperCase();}).join('')
};const createSVGFromSymbol = (prefix: string, str: string): Array<string[]> => {const symbolList = str.match(svgReg);if (symbolList) {const svgList: Array<string[]> = [];symbolList.forEach((sym: string) => {const idMatchResult = sym.match(/ id="(.*?)" /);if (idMatchResult && idMatchResult.length >= 2) {const svgNameArr = processSvgName(idMatchResult[1].replace('icon-', ''),);svgList.push([svgNameArr,sym.replace(/^<symbol/, `<svg xmlns="http://www.w3.org/2000/svg" `).replace(/<\/symbol>$/, '</svg>')// remove id.replace(/ id="(.*?)" /, ''),// remove fill attribute.replace(/ fill="(.*?)"/g, '')]);}});return svgList;}return [];
};

这样所有的图标都提取出来了。

当然可以根据业务的需要再转换成对应的组件,比如我平时主要使用React开发,就可以同时生成对应的React组件,一个图标库就搞定了。
每次图标需要更新时运行脚本就即可,剩下的时间才能摸鱼。

当然我做了一个 npm 包iconfont-extract,方便在其他项目中使用。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rocketmq架构

NameServer&#xff1a;作为注册中心&#xff0c;提供路由注册、路由踢出、路由发现功能&#xff0c;舍弃强一致&#xff0c;保证高可用&#xff0c;集群中各个节点不会实时通讯&#xff0c;其中一个节点下线之后&#xff0c;会提供另外一个节点保证路由功能。 Rocket mq name…

springboot+jsp+java人才招聘网站4f21r

本基于springboot的人才招聘网站主要满足3种类型用户的需求&#xff0c;这3种类型用户分别为求职者、企业和管理员&#xff0c;他们分别实现的功能如下。 &#xff08;1&#xff09;求职者进入网站后可查看职位信息、企业信息以及职位新闻等&#xff0c;注册登录后可实现申请职…

全面理解java中的构造方法以及this关键字的用法(超详细)

Hello&#xff0c;各位铁汁们&#xff01;我是小&#x1f41f;儿哈&#xff01;今天我又来更新我的Java基础学习博客了。 本篇主要内容概述&#xff1a; 1、&#x1f35a;如何用构造方法初始化对象 2、&#x1f35a;为啥要有this这个关键字 3、&#x1f35a;this.属性名访问成员…

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Windows + docker + python + vscode : 使用容器docker搭建python开发环境,无需本地安装python开发组件

下载docker for Windows docker window下载 如果没有翻墙工具&#xff0c;可以该网盘中的docker 链接&#xff1a;https://pan.baidu.com/s/11zLy3e5kusZR-4m_Fq_cqg?pwdesmv 提取码&#xff1a;esmv 安装docker docker的安装会重启电脑&#xff0c;不要惊讶&#xff0c;且…

简单好用!日常写给 ChatGPT 的几个提示词技巧

ChatGPT 很强&#xff0c;但是有时候又显得很蠢&#xff0c;下面是使用 GPT4 的一个实例&#xff1a; 技巧一&#xff1a;三重冒号 """ 引用内容使用三重冒号 """&#xff0c;让 ChatGPT 清晰引用的内容&#xff1a; 技巧二&#xff1a;角色设定…

python+feon有限元分析|feon安装

目录 1、查找 2、下载 3、解压 4、安装 Feon是湖北工业大学土木建筑与环境学院教师裴尧尧基于Python开发的一个开源免费的有限元计算框架。这是一个致力于有限元编程教学和有限元理论研究的框架&#xff0c;上手快&#xff0c;可扩展性强&#xff0c;代码开源。 1、查找 …

Leetcode---372周赛

题目列表 2937. 使三个字符串相等 2938. 区分黑球与白球 2939. 最大异或乘积 2940. 找到 Alice 和 Bob 可以相遇的建筑 一、使三个字符串相等 这题把题目意思读懂&#xff0c;正常模拟就行&#xff0c;简单来说就是看三个字符串的最长公共前缀有多长&#xff0c; 代码如下…

NoSql非关系型数据库

前言&#xff1a;Nosql not only sql&#xff0c;意即“不仅仅是sql”&#xff0c;泛指非关系型数据库。这些类型的数据存储不需要固定的模式&#xff08;当然也有固定的模式&#xff09;&#xff0c;无需多余的操作就可以横向扩展。NoSql数据库中的数据是使用聚合模型来进行处…

外汇天眼:CFTC修订了针对Logista Advisors的投诉

商品期货交易委员会&#xff08;CFTC&#xff09;修改了对Logista Advisors LLC及其首席执行官Andrew Harris Serotta的投诉。修改后的投诉于2023年11月28日提交给伊利诺伊州北区法院。 修改后的投诉声称&#xff0c;从至少2020年1月左右至少到2020年4月左右&#xff0c;Logis…

2023.11.29 深度学习框架理解

2023.11.29 深度学习框架理解 对深度学习框架进行复习&#xff0c;选最简单的“三好学生”问题的四个变化&#xff0c;简要总结其具体思路。 深度学习一开始就是为分类问题研究的&#xff0c;因此其框架的设计都是基于分类的问题&#xff0c;虽然现在也已经演变为可以执行多种…

YOLOv5独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

💡💡💡本文全网首发独家改进:可改变核卷积(AKConv),赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择,解决具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标的问题点,效果秒殺DSConv 1)AKConv替代标准卷积进行…