212 - 《Umi 最佳实践:Icons 使用》

发布于 2022年11月11日

计划近期每周更新 1 篇 Bigfish 2022 版的最佳实践,这是第 6 篇。

问题

你是不是觉得使用 Icons 非常简单?在项目里存 svg 文件,然后 import 过来使用就可以?这能有啥问题?

import IconUrl, { ReactComponent as IconComponent } from './icon.svg';

1、以上是 Umi/Bigfish 内置支持的作为 url 和 react component 两种方式。但如果不加约束,用法会千奇百怪。@依鹭 同学两年前就整理过,光统计到的就有 7 类 11 种用法,可能会被用作 DOM、图片、CSS 背景、字体等等。怎么选?当时有做过最佳实践,但在 Bigfish 4 时先下了,因为有想到更好的方案。

2、昨天有整理一篇《你不知道的 9 个 @ant-design/icons 使用问题》,虽然官方只推荐了一种,但在实际使用中却有很多人不遵守,在 code.alipay.com 上搜一下就会发现有数千条非入口的引用方式。大家没有从入口引我觉得初心是好的,希望多写点代码也要手动减少产物大小,但结果除了让代码不一致,还会导致产物变大、重复、构建变慢、类型不安全、单测不兼容等问题。

3、svg 你会用外链(单独的请求)还是内联(inline base 64)?标准答案是以 10K 为界,小于的内联,大于的外链。这是 Umi/Bigfish 的内置配置,但这真是标准答案吗?外链可能会导致闪烁,而内联则有几个你可能不知道的问题。1)当以 base 64 用于 CSS 背景属性时,写几个就会重复几个,造成产物尺寸增加,因为 CSS 没有变量的概念(或者有但目前出于兼容考虑不会用),2)缓存随着 JS 走,容易失效,不像外链一样有单独的 url 单独的缓存,3)会增加 JS 的尺寸,有一份额外的 JS 代码解析消耗。

4、使用 Icon 时通常还会做一些属性调整,比如基础的 size、viewBox、fill、style,以及进阶的 spin、rotate、twoToneColor。Ant Design Icons 有提供封装,但使用本地的 Icon 或其他 Icon 集时,并不是每个地方都有提供封装的,如何做、如何保证开发体验的一致

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。