把你的阿里巴巴图标库转成你自己的@ant-design/icons

背景

我们使用iconfont-阿里巴巴矢量图标库来管理自己的一套图标,并且基于它的js资源,封装了自己的icons图标组件。封装的方法是使用了antd提供的createFromIconfontCN方法
但随着图标库越来越大,JS资源文件也变得越来越大。在业务中,哪怕你只需要一个图标,却也要引入整个的JS资源。这使得我们必须考虑对他进行优化。

解决思路

我们参考@ant-design/icons的设计模式,计划将它的图标拆分成了一个一个组件,在业务中按需引入来达到减少资源浪费的目的。

我们阅读了@ant-design/icons的源码,发现他的图标对象其实都放在了一个叫做@ant-design/icons-svg的包里,里面放了每一个图标的属性。@ant-design/icons引用了这些图标并再次封装了一些属性和方法。
在这里插入图片描述
然而我们并不能这样做,我们没有深究他的这些图标对象是如何自动产生的。 我们只有在iconfont-阿里巴巴矢量图标库上下载的JS资源文件。

好在这个JS文件非常的有规律,他其实就是每一个svg图标的path路径。这使得我们可以简单的使用这个js文件来创建我们的图标组件,而不需要在独立创建一个包来存放图标的属性。

在这里插入图片描述

实现步骤

  1. 我们需要使用脚本读取这个js文件,输出一个数组,数组里面是每个svg图标的path
  2. 创建一个组件,用来接受svg的path内容
  3. 创建一个模版,循环数组的内容并生成相应的文件
  4. 脚本生成tree shake目录
  5. 执行脚本,生成对应文件

一、读取文件,输出数组

const fs = require('fs');// 读取文件后整理成后的数据源
const fileContent = [];function handleFormatData(content) {const symbolStr = content.split('<svg>')[1].split('</svg>')[0].replace(/<\/symbol>/g, '</symbol>\n');// 先根据 回车 拆成数组,每一项都包含了一个图标的信息const IconsStringArr = symbolStr.split('\n').filter(Boolean);const fileNameRegExp = /id="你的js的svg的id前缀-([^]*?)"/g;const viewBoxRegExp = /viewBox="([^]*?)"/g;const pathRegExp = /<path([^]*?)path>/g;IconsStringArr.forEach((element) => {const fileName = element.match(fileNameRegExp)[0].split('id="你的js的svg的id前缀-')[1].split('"')[0];const viewBox = element.match(viewBoxRegExp)[0].split('viewBox="')[1].split('"')[0];const path = element.match(pathRegExp).join('');fileContent.push({fileName: `P${fileName}`,viewBox: viewBox,svgPath: path,});});
}fs.readFile('./iconfont.js', (err, data) => {// 将文件文本处理成想要的数据源handleFormatData(data.toString());});

二、组件

import React, { PropsWithChildren } from 'react';export interface LeeIconProps {spanProps?: React.HTMLProps<HTMLSpanElement>;svgProps?: React.SVGProps<SVGSVGElement>;
}const LeeIcon = (props: PropsWithChildren<LeeIconProps>) => {return (<span role="img" {...props.spanProps} ><svg width="1em" fill="currentColor" aria-hidden="true" {...props.svgProps}>{props.children}</svg></span>);
};export default LeeIcon;

三、模版、生产文件

const lodash = require('lodash');function generateFile() {const render = lodash.template(`
/* eslint-disable react/self-closing-comp */
// GENERATE BY ../../scripts/generate.ts
// DON NOT EDIT IT MANUALLYimport LeeIcon, { LeeIconProps } from '../components/icon';const  <%= fileName %> = (props: LeeIconProps) => (<LeeIcon{...props}svgProps={{viewBox: '<%= viewBox %>',...props.svgProps,}}><%= svgPath %></LeeIcon>
);export default <%= fileName %>;`.trim(),);console.log('generateFileLoading...');fileContent.forEach(({ fileName, viewBox, svgPath }) => {// 写入文件内容fs.writeFileSync(`../src/leeIcons/${fileName}.tsx`, render({ fileName, viewBox, svgPath }), () => {});console.log(`generateFile${fileName}Down`);});
}
// 生成文件
generateFile();

四、生产Tree Shake目录

function generateTreeShake() {console.log('generateTreeShakeLoading...');const render = lodash.template(`
export { default as <%= fileName %> } from './<%= fileName %>';`,);fs.writeFileSync(`../src/leeIcons/index.ts`,`
// GENERATE BY ../../scripts/generate.ts
// DON NOT EDIT IT MANUALLY`.trim(),() => {},);fileContent.forEach(({ fileName }) => {fs.appendFileSync(`../src/leeIcons/index.ts`, render({ fileName }), () => {});});console.log('generateTreeShakeSuccess');
}
// 生成摇树首页
generateTreeShake();

五、执行脚本

node ./generate.js

完整代码

/* eslint-disable @typescript-eslint/no-require-imports */
/** @Author: atwLee* @Date: 2023-04-07 15:48:20* @LastEditors: atwLee* @LastEditTime: 2023-04-12 10:18:40* @Description:* @FilePath: /panui/packages/Icons/script/generate.js*/
const fs = require('fs');
const lodash = require('lodash');
const rimraf = require('rimraf');// 读取文件后整理成后的数据源
const fileContent = [];function handleFormatData(content) {const symbolStr = content.split('<svg>')[1].split('</svg>')[0].replace(/<\/symbol>/g, '</symbol>\n');// 先根据 回车 拆成数组,每一项都包含了一个图标的信息const IconsStringArr = symbolStr.split('\n').filter(Boolean);const fileNameRegExp = /id="你的js的svg的id前缀-([^]*?)"/g;const viewBoxRegExp = /viewBox="([^]*?)"/g;const pathRegExp = /<path([^]*?)path>/g;IconsStringArr.forEach((element) => {const fileName = element.match(fileNameRegExp)[0].split('id="你的js的svg的id前缀-')[1].split('"')[0];const viewBox = element.match(viewBoxRegExp)[0].split('viewBox="')[1].split('"')[0];const path = element.match(pathRegExp).join('');fileContent.push({fileName: `P${fileName}`,viewBox: viewBox,svgPath: path,});});
}function generateFile() {const render = lodash.template(`
/* eslint-disable react/self-closing-comp */
// GENERATE BY ../../scripts/generate.ts
// DON NOT EDIT IT MANUALLYimport LeeIcon, { LeeIconProps } from '../components/icon';const  <%= fileName %> = (props: LeeIconProps) => (<LeeIcon{...props}svgProps={{viewBox: '<%= viewBox %>',...props.svgProps,}}><%= svgPath %></LeeIcon>
);export default <%= fileName %>;`.trim(),);console.log('generateFileLoading...');fileContent.forEach(({ fileName, viewBox, svgPath }) => {// 写入文件内容fs.writeFileSync(`../src/leeIcons/${fileName}.tsx`, render({ fileName, viewBox, svgPath }), () => {});console.log(`generateFile${fileName}Down`);});
}function generateTreeShake() {console.log('generateTreeShakeLoading...');const render = lodash.template(`
export { default as <%= fileName %> } from './<%= fileName %>';`,);fs.writeFileSync(`../src/leeIcons/index.ts`,`
// GENERATE BY ../../scripts/generate.ts
// DON NOT EDIT IT MANUALLY`.trim(),() => {},);fileContent.forEach(({ fileName }) => {fs.appendFileSync(`../src/leeIcons/index.ts`, render({ fileName }), () => {});});console.log('generateTreeShakeSuccess');
}function generateIcons() {// 删除目录rimraf('../src/leeIcons', () => {// 增加目录fs.mkdirSync('../src/leeIcons', () => {});// 读取icons-js文件,获取需要的数据fs.readFile('./iconfont.js', (err, data) => {// 将文件文本处理成想要的数据源handleFormatData(data.toString());// 生成文件generateFile();// 生成摇树首页generateTreeShake();});});
}generateIcons();

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

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

相关文章

智能设计-阿里巴巴Banner设计

阿里巴巴Banner设计的核心在于优化会场页面拓展及Banner尺寸拓展两部分低水平重复建设工作&#xff0c;提升设计效率&#xff0c;压缩设计周期&#xff0c;为设计师保留充裕的创意时间。 色彩转移与页面拓展设计 分会场设计工作大致分为&#xff1a;色彩拓展、产品组合设计、…

阿里 ChatUI 开源:让对话美而简单

作者 | 孙辉 背景 对话式交互一直存在于我们的日常生活中&#xff0c;工作时使用的钉钉&#xff0c;联系朋友使用的微信&#xff0c;都属于对话式交互应用。 随着技术的发展&#xff0c;我们正在经历从「移动互联网时代」走向「人工智能时代」的过程中&#xff0c;人工智能扩大…

Prompt Engineering | 文本转换prompt

LLM非常擅长将输入转换成不同的格式&#xff0c;例如多语种文本翻译、拼写及语法纠正、语气调整、格式转换等。 文章目录 1、文本翻译1.1、中文转西班牙语1.2、识别语种1.3、多语种翻译1.4、翻译正式语气1.4、通用翻译器 2、语气 / 风格调整3、格式转换4、拼写及语法纠正5、一个…

vue3 实现 chatgpt 的打字机效果

在做 chatgpt 镜像站的时候&#xff0c;发现有些镜像站是没做打字机的光标效果的&#xff0c;就只是文字输出&#xff0c;是他们不想做吗&#xff1f;反正我想做。于是我仔细研究了一下&#xff0c;实现了打字机效果加光标的效果&#xff0c;现在分享一下我的解决方案以及效果图…

Haproxy--高可用代理

一、haproxy简介 软件&#xff1a;haproxy---主要是做负载均衡的七层&#xff0c;也可以做四层负载均衡。 负载均衡是通过OSI协议对应的。 7层负载均衡&#xff1a;用的是7层http协议&#xff1b; 4层负载均衡&#xff1a;用的是tcp协议加端口号做的负载均衡。 ha-proxy概…

2021-03-11

idea创建mybatis的maven项目 用idea创建Maven Web项目 添加依赖 创建编写实体类 创建持久层接口 创建SqlMapConfing.xml

mybatis初学

创建一个mybatis的maven项目 环境&#xff1a;IDEA19.3.3&#xff0b;jdk1.8mysq 新建maven项目 项目名字 maven 大体框架 导包&#xff08;要在pom.xml中dependencies标签里面&#xff09; 2 <!-- mybatis核心包 -->3 <dependency>4 <…

2021-03-21

MyBatis-Plus创建 创建数据库 -- 创建测试表 CREATE TABLE tb_user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID, user_name varchar(20) NOT NULL COMMENT 用户名, password varchar(20) NOT NULL COMMENT 密码, name varchar(30) DEFAULT NULL COMMENT 姓名, …

基于 Go 语言开发在线论坛

&#xff08;一&#xff09;&#xff1a;整体设计与数据模型 通过一个简单的在线论坛项目帮助大家从项目实际开发维度快速了解 Go Web 编程的全貌&#xff0c;然后再各个击破&#xff0c;深入介绍请求、响应、视图、数据库、Web 服务、测试、部署等各个模块的细节。 功能需求…

从智能对话系统导论,到如何设计第一个对话机器人

从智能对话系统导论&#xff0c;到如何设计第一个对话机器人 一、智能对话系统导论1、生活中的 Conversational AI2、一种新的人机交互方式3、一些关于 Conversational AI 的数据4、对话机器人行业产业链及产业图谱5、课程主要部分 二、Conversational AI 概览1、什么是Convers…

ChitChat论坛

《Go web编程》ChitChat论坛 本文摘自《Go web编程》 京东购书&#xff1a;https://item.jd.com/12252845.html 上一章在末尾展示了一个非常简单的Go Web应用&#xff0c;但是因为该应用只是一个Hello World程序&#xff0c;所以它实际上并没有什么用处。在本章中&#xff0c;我…

微信聊天机器人,不使用iChat,可以群聊

目录 1. 微信聊天界面截图 2. 图片文字识别 3. 获取最新消息 3.1 独聊 3.2 群聊 4. 机器人聊天系统 5. 成果展示 6. 全部代码 本文参考大神【喵王叭】的文章&#xff1a;python实现微信、QQ聊天自动回复【纯物理】_喵王叭的博客-CSDN博客_python自动回复纯物理方式实现微…

【论文翻译】2020.8 清华大学AI课题组——大型中文短文本对话数据集(A Large-Scale Chinese Short-Text Conversation Dataset)

大型中文短文本对话数据集 写在前面&#xff1a; 研究用&#xff0c;原创翻译&#xff0c;转载请标明出处&#xff1b;第一次译文&#xff0c;之后会跟进完善。侵删。 今年暑假末&#xff0c;清华大学公开了大型对话数据集及预训练模型。该数据集融合各大社交媒体对话数据库&am…

头条原创文章一键转换剪映生成视频

最近一段时间某更新了一个功能就是自己发布的文章可以在后台通过视频平台的功能一键生成短视频。 但是这个功能只能支持自己的写的文章,而且只能在本平台发布视频,还暂时不能同步到其他平台。而且必须是自己的原创文章哟,不是话会有一些问题。 这个做了几个视频之后发出来…

自媒体必备视频剪辑SDK,操作简单,功能强大,让每个精彩瞬间都能锦上添花!

VESDK DELUXE介绍&#xff1a; 一个全能好用的视频编辑工具&#xff0c;帮你轻松剪出美好生活。VESDK Deluxe APP视频编辑SDK集手机视频拍摄和视频剪辑主要功能于一体,同时包含手机端视频配音配乐&#xff0c;字幕特效&#xff0c;滤镜&#xff0c;转场特效等各种功能&#xff…

抖音之电脑版剪映的使用

本内容介绍剪映功能的使用以及一些个人剪映作品。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、抖音&#xff1a;逝雪情感的剪映作品 1、曾经以为离不开的是微信 2、半生走过 3、夏日田园 二、音…

剪映专业版 - 你的短视频剪辑小帮手!附Mac/Win地址!

剪映专业版&#xff1a;做精品视频你不一定要用 FCPX &#xff01;随着短视频的崛起&#xff0c;市面上的剪辑软件也越来越多。除我们熟知的Premiere、Final Cut Pro等专业剪辑软件外&#xff0c;也有很多轻松易上手的App等待我们选择。近期&#xff0c;剪映推出了全新的专业版…

剪映电脑版详细使用教程,让视频剪辑变得更简单了

这几天关于剪映电脑版的消息非常多&#xff0c;相比于专业成熟的视频剪辑软件&#xff0c;但大家对这款剪映似乎特别感兴趣&#xff0c;小编也抽时间简单使用了一下&#xff0c;相比于adobe Premiere 和达芬奇来说&#xff0c;真的特别简单上手&#xff0c;结合了手机版的触摸与…

剪映app怎么剪辑视频

剪映是一款非常好用的手机上的视频剪辑软件&#xff0c;拥有这款软件的话&#xff0c;用户们即使是在手机上也能够快速方便的进行视频剪辑哦&#xff0c;但是有很多用户们没有剪辑过视频&#xff0c;不会使用剪映这款软件等&#xff0c;那么剪映app具体要怎么操作使用呢&#x…

AIz作画阶段小结后续内容安排

效果呈现 视频效果&#xff1a; 1.小说插画 2.动作系列 图画效果&#xff1a; 1.场景画面&#xff08;6张左右&#xff09; 2.人物画面&#xff08;6张左右&#xff0c;可以更多&#xff0c;可爱、知性、性感、古典、游戏、二次元&#xff09; 3.插画设计 4.广告元素 5.3d角色&…