热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ICON图标库交付我们有了最友好的方案

ICON图标库交付-我们有了最友好的方案-theme:smartblue一、背景为了解决在维护Web图标库时所面临的痛苦,期望打造最友好的从设计到研发图标交付方案,我希望它们

theme: smartblue

一、背景

为了解决在维护 Web 图标库时所面临的痛苦,期望打造最友好的从设计到研发图标交付方案,我希望它们能让更多的开发者和设计师受益,让网站建设更简单、更快速,更高效。

二、之前的方案

目前团队没有统一的图标库,对于图标的使用根据业务有两种,针对移动端(H5)设计交付设计稿后研发图片形式集成到项目中使用;对于 web 端设计同学有在 Iconfont 维护字体图标也就是 IconFont 但是在维护过程比较繁琐。

2.1 图片资源

在移动端场景,开发同学目前都是根据设计交付的设计稿在 Figma 导出图片资源使用,为了解决图片上传问题也开发相应 chrome 插件自动上传。再此场景使用图片也是可以的也是最基础的处理方式,问题就是相同图标无法复用。

2.2 IconFont

Web Font 的发展得益于 CSS3 的 [@font-face ]()属性。我们通常看到的图标都是以图片形式集成到项目中使用,IconFont 是一套字体图标由阿里妈妈团队出品,和我们使用自定义字体的方式是一样的,并且它是一种矢量图标,在 web 端用到 IconFont 相对较多,但是很少移动端很少采用 IconFont;\
IconFont 的使用支持 unicode 引用、 font-class 引用和 symbol 引用三种,简单总结一下 iconfont 的优缺点:

优点

  • 缩放不会模糊
  • 跨平台一套资源可在 web、iOS、Android 等多个平台使用
  • 体积小包含几十个图标的字体包比一个 svg 图标资源的体积还要小

缺点

  • 更新成本高,目前没有特别友好的解决方案这样是本文最重要的原因
  • 毕竟是字体图标在没有目前浏览器还没实现渐进式字体前还是有体验问题
  • 虽然支持了彩色图标,但是无法和单色共存,也是依赖浏览器的彩色字体(COLR)规范的实现

随着我们前端一体化平台建设,我们在开发平台 Icon 库遇到最大的问题组件库的更新,也就是如何和设计协作,针对现有的 Iconfont 的协作方式目前无法满足,尤其针对在后续的更新维护,我们期望有个高效的协作方式,参考了业界 Juuun 开源 和 github icon 的技术方案实现了以下方案。

三、现在的方案

现在我们采用 Figma + Figma 插件 + gitlab CI 生成 SVG React/Vue 组件库。

3.1 工作流程

  1. 对于设计只需要在 Figma Icon 页面运行插件\
    由于我们公司当前设计工作都迁移在 Figma ,所以对于设计只需要在 Figma 维护一个 Icon 资源页面,当 Icon 需要更新时运行插件:\

\

  1. 开发在飞书群收到 MR 通知\
    \
    对于研发可以从机器人了解到操作人、修改的内容,我们会根据仓库 ID 配置 MR 同步到多仓库,同时对比当前版本和私服最新版本的差异避免误操作。

  1. 审核修改内容合并 MR 执行 gitlab CI

开发根据修改内容决定是否合并,如果合并 CI 会执行三个 Stages 分别是 install 获取依赖;build 通过 Figma API 获取 svg 图标并构建成 React 和 Vue 版本组件库;publish 推送到 npm 同时将图标站点推送到静态服务方便查找图标。

\

  1. CI 发布到 npm 仓库、静态站点成功后飞书再次通知完成

这时候开发界面可以根据版本预览到图标使用\

\

  1. 开发使用时只需要更新对应的 npm 包(React、Vue)

四、技术方案解析

4.1 SVG

为什么选择 svg 方案,回看图标演进从雪碧图到 iconfont,再到 SVG 图片,以及内联 SVG 代码的 React/Vue 组件,组件无疑是目前最方便的模式。参考 Vite 的核心理念就是一切都是按需的,模块只有在被请求时才会被转换。通过将所有图标编译成多个文件并将它们作为 npm 包分发来解决这个问题,因此我们开发 react 和 vue 两个版本的 npm 包。同时 svg 也有着以下特点:

  • svg 可缩放矢量图形可以无损放大,也不会出现字体渲染锯齿问题表现最好
  • 可着色能力我们可以使用 fill="currentColor" 来为 SVG 着色( CSS filters 和 CSS Mask 也可以)

  • 灵活性 Inline svg 直接写进 html 特别适合组件化

Inline SVG vs Icon Fonts 也给出了详细的 Inline Svg 与 Icon Fonts 之间的区别。当然 svg 还有很多可玩比如:张老师的《学习了,CSS 中内联 SVG 图片有比 Base64 更好的形式》等等,这里不过多介绍。

4.2 Figma

Figma 是一个 基于浏览器 的协作式 UI 设计工具,从推出至今越来越受到 UI 设计师的青睐很多的设计团队投入了 Figma 的怀抱。同时它已经推出的 Web API,通过 API 可以快速轻松地对内部公司工作流程进行脚本改进,或将 Figma 与其他工具集成。也就为我们从 Figma 图标文件生成 React/Vue 组件代码提供了能力。

4.3 Figma 插件

Figma 插件类似于浏览器插件,使用 Web 技术(HTML/CSS/JS)进行开发。Figma 为插件提供的沙箱环境,可以访问到 Figma 全局变量用于获取文档内容,但是屏蔽了其它的各种全局变量,如 window、document 以及 fetch 等,可以避免恶意插件越权访问未授权的内容或破坏程序运行环境,提升安全性,你可以理解成 main 和 ui,其中 main 代码运行在沙箱之中,ui 部分代码运行在 iframe 之中。编程过程涉及到两个窗口之间的通信用 postMessage,其他详见官方文档。\
在设计执行插件通知时,为了避免删除或者重命名 ICON 而造成更新后老版本不兼容,新增了版本对比及时提醒:

\

4.4 Figma Web Api

通过 web api 就可以拿到原始的 svg 图标资源,通过脚本对 svg 图标处理,因此我们和设计定了一些规则:

  1. 确保图标基础尺寸是 24*24
  2. 每个图标必须编组 create component(Option+Command+K)

  1. 如果是彩色图标可以在命名中包含 colr 例如 social-wechatcolr-origin
  2. 图标命名请使用英文(不可以含 /)和 -,例如 dewu-logo-original

  1. 图标一般有描边(stroke)和填充(fill)两种样式,一个图标只能采用一种形式,不可以混合,默认 fill。想要转为 fill 样式,你可以使用 Outline Stroke(Shift+Command+O) 将图标转换为填充形状。

通过图标命名我们对 svg 处理成单色(去掉原始颜色设置 fill="currentColor")、彩色(保留原始颜色)。

4.5 Gitlab Api

通过 GitLab API 获取、操作 GitLab 项目,详见官方文档。我们主要用到了 repository 、merge_requests 两个模块:

getPackageContent()
updatePackage()
createBranch()
createMRequest()

4.6 Component

在通过 Figma Web Api 获取 svg 文件并根据规则处理 svg 文件后,我们需要编码把 svg icon 转换成 React 和 Vue 的组件库。对于 svg 文件处理使用了第三方 svgo,svgo 是 SVG Optimizer 的简写,是一个基于 Nodejs 的 SVG 文件优化工具,简单使用:

const Svgo = require('svgo')
const svgo = new Svgo({
  plugins: [
    { convertShapeToPath: false },
    { mergePaths: false },
    { removeAttrs: { attrs: '(fill|stroke.*)' } },
    { removeTitle: true },
  ],
})
svgo.optimize(svg)

这里面的 { removeAttrs: { attrs: '(fill|stroke.*)' } } 是为了都给图标去色,当然对于彩色图标是不要去色。后面就是真的单个 svg 文件生成组件,过程不再赘述。

4.7 Gitlab CI

GitLab CI 是 GitLab 内置的进行持续集成的工具,只需要在仓库根目录下创建 .gitlab-ci.yml 文件,并配置 GitLab Runner;每次提交的时候,gitlab 将自动识别到.gitlab-ci.yml 文件,并且使用 Gitlab Runner 执行该脚本。公司部署的 Gitlab 已有公共 Runner 所以我们只需编写 .gitlab-ci.yml 文件即可:

image: node:14.13.1
# 定义 stages
stages:
  - install
  - build
  - publish
# 定义 job
install-staging:dep:
  stage: install
  tags:
    - ep-share
  only:
    - master
  script:
    - echo "=====start install======"
    - yarn
    - echo "=====end install======"
  artifacts:
       expire_in: 60 mins
       paths:
        - node_modules/
build-staging:dep:
# 省略 build 代码
publish-staging:dep:
# 省略 publish 代码

我们设置 master 变化是执行:

4.8 图标文档站点

我们通过把构建后的静态站点和组件包同步到 npm 私服上,由于我们内网部署了 unpkg 的 CDN 服务,所以我们只需要根据版本就能访问到相应的文档,例如:https://unpkg.shizhuang-inc.com/poizon-react-icon@1.0.6/docs/index.html\
poizon-react-icon1.0.6 版本文档,这样好处是不用再关心文档部署,同时也提供了文档版本管理的能力。

五、总结

我们再来回顾完整交付更新流程,设计和研发整个过程只需要在自己工作流中简单操作即可完成图标交付,非常高效!当然任何技术方案都有它的优劣,最重要的还是根据需求取舍,未来渐进式字体和彩色字体的推进我们也可能会拥抱 font 同时也会有新的交付方案,但是对于我们目前阶段最合适的还是这套。

六、参考链接

  • https://github.com/leadream/Figma-icon-automation

  • https://www.Figma.com/plugin-docs/intro/

  • https://www.iconfont.cn/help/detail?helptype=code

  • https://gist.github.com/banyudu/f7472f935897adfbb54cc8eb38dc5373

  • https://github.blog/2018-04-12-driving-changes-from-designs/


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
author-avatar
磊仔2502898265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有