Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

⭐Ant Design Icon RoadMap #12

Open
HeskeyBaozi opened this issue Sep 6, 2018 · 5 comments
Open

⭐Ant Design Icon RoadMap #12

HeskeyBaozi opened this issue Sep 6, 2018 · 5 comments

Comments

@HeskeyBaozi
Copy link
Contributor

HeskeyBaozi commented Sep 6, 2018


logo

该图标库是从 antd@3.9.0 开始正式使用的图标库,本文将讲述该图标库如何处理从设计师拿到的图标和具体处理流程。

@ant-design/icons(-svg) v4 贡献指南

@ant-design/icons(-svg) v4 Contribution Guide

以下内容为 antd v3 版本适用

项目命令

整个项目通过 lerna 进行管理,预计包管理目录结构如下如下

packages
├── icons          # 核心依赖
├── icons-react
├── icons-angular
└── icons-vue

所有命令运行之前,请确保运行 npm run bootstrap 引导各个包安装依赖和符号链接。

国内用户可以运行使用淘宝镜像的 npm run bootstrap:china

npm run icons:generate

本项目中最重要的生成命令,运行后将读取 packages/icons/svg 目录下的所有图标文件,并通过 packages/icons/build/templates 中的模板文件,将 svg 转化成一个 json 格式的抽象树,生成 ts 文件并且存储在 packages/icons/src 目录中。

npm run icons:build

构建命令,使用 tscpackages/icons/src 目录下的文件编译到 packages/icons/lib 目录下,使用的是 commonjs 模块规范。同时也将 packages/icons/src/index.ts 文件使用 babel 编译到 packages/icons/lib/index.es.js , 使用的是 ECMAScript 模块规范,用于未来可以使用 tree shaking 打包特性。

项目结构

packages/icons
├── build
│   ├── constants.ts         # 包括替换符、重新命名映射表、旧图标标记
│   ├── env.ts               # 生成时各个参数配置
│   ├── generateIcons.ts     # 最主要的生成过程函数 build(env)
│   ├── index.ts
│   ├── scripts
│   │   └── clean.ts
│   ├── templates            # 转换时使用模板存放
│   ├── typings
│   │   ├── index.ts
│   │   └── types.ts
│   └── utils
│       ├── index.ts
│       └── normalizeNames
│           ├── helpers.ts
│           └── index.ts
├── docs
├── lib                      # 构建目标文件夹
├── packages
│   └── icons-react
├── site
├── src                      # 构建源文件夹,抽象树生成目标文件夹
├── svg                      # 存放设计师的所有图标,数据源,有三种主题风格分类
│   ├── fill
│   ├── outline
│   └── twotone
└── test                     # 单元测试

基本用法

打包发布

  1. 确认从设计师拿到的图标命名是否正确。(单词顺序、单词拼写)
  2. 运行命令 npm run icons:generate, 生成 packages/icons/src/**/*.ts 文件
  3. 生成的 packages/icons/src 目录结构如下
packages/icons/src
├── dist.ts      # 经过压缩后的全量图标文件
├── index.ts     # 图标库入口
├── types.ts     # 类型定义
├── manifest.ts  # 生成的图标名字集合
├── fill
├── twotone
└── outline      # 三种主题,存放着图标的抽象树
  1. 检查名字准确无误、抽象树符合预期后,运行命令 npm run icons:build 进行编译
  2. 检查编译后的文件目录 packages/icons/lib
  3. 确保代码风格检查和测试通过:npm run lint, npm run icons:test
  4. 使用 lerna 打包发布 lerna publish

添加新图标

  1. 确认从设计师拿到的三种图标风格名字是否一致且正确
  2. 将图标根据风格分别存放进 packages/icons/svg 目录下的 filloutlinetwotone 目录下
  3. 之后的流程同上文的打包发布流程一致

进阶指南

工作流

图标的处理可以抽象成管道的流动,所以使用了 rxjs 来优雅地描述处理的过程。

命令 npm run icons:generate 的本质就是运行 packages/icons/build/generateIcon.ts 中的 build(env) 函数。

初始化环境

  • SVGO 处理器配置

单色图标的 SVGO 处理器会额外清除路径元素上的 fill 属性,因为单色图标路径上的 fill 是没有必要的

  • 清理原来的旧的生成文件

本质是清理 env.paths 路径中以 _OUTPUT 结尾的标识符所代表的文件或者表达式

  • 规范化图标命名

这是单向一次性的过程,会根据 packages/icons/build/constants.ts 中的 renameMapper 重新命名 svg 目录下的图标文件。

最好重命名都写在该映射表下,重命名会同时影响三种主题风格下的同名图标

  • svgMetaDataWithTheme$ SVG 元数据流

svg-meta-data-with-theme-flow

这是一个高阶流,根据三种主题风格 filloutlinetwotone 分别发射出分支流,每个分支流上的数据的接口类型如下:

export interface BuildTimeIconMetaData {
  identifier: string; // 标识符,以大写风格名结尾,例如:AccountBookFill、AlertFill
  icon: IconDefinition; // 图标定义类型
}

上述的图标定义类型接口如下:

export interface IconDefinition {
  name: string; // kebab-case-style
  theme: ThemeType;
  icon:
    | ((primaryColor: string, secondaryColor: string) => AbstractNode) // 接受主色和副色生成抽象树的函数
    | AbstractNode; // 定义SVG结构的抽象树
}
  • BuildTimeIconMetaData$ 构建时图标原数据流

该数据流将高阶流 svgMetaDataWithTheme$ 打平,并且进行了如下处理:

  1. 对于非旧图标(指使用设计师给的新图标,通常大小比较小),修改其 viewBox64 64 896 896

为什么是 64 64 896 896 ? 参见相关issue.

@HeskeyBaozi
Copy link
Contributor Author

English Version WIP

@HeskeyBaozi HeskeyBaozi changed the title Ant Design Icon RoadMap ⭐Ant Design Icon RoadMap Sep 7, 2018
@yesmeck
Copy link
Member

yesmeck commented Sep 7, 2018

好多 “�”

@HeskeyBaozi HeskeyBaozi self-assigned this Sep 11, 2018
@B3nnyL
Copy link

B3nnyL commented Sep 12, 2018

@HeskeyBaozi I can support English translation and documenting if you need helps

@zombieJ
Copy link
Member

zombieJ commented Sep 12, 2018

@HeskeyBaozi @B3nnyL , cool.
Could we add this in https://github.com/ant-design/ant-design-icons/blob/master/docs/ after this done?

@B3nnyL
Copy link

B3nnyL commented Sep 14, 2018

@zombieJ Yeah, I believe so

@HeskeyBaozi HeskeyBaozi changed the title ⭐Ant Design Icon RoadMap ⭐Ant Design Icon RoadMap 中文 Mar 5, 2020
@HeskeyBaozi HeskeyBaozi changed the title ⭐Ant Design Icon RoadMap 中文 ⭐Ant Design Icon RoadMap Mar 17, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants