共计 1519 个字符,预计需要花费 4 分钟才能阅读完成。
主要是公司内部的 SVG 制作的图标, 提供网页当中使用的字体.
代码仓库在 https://github.com/jimengio/j…
字体生成步骤
从 SVG 文件到可以给前端用的 npm 模块, 主要经过:
- SVG 文件使用第三方模块生成字体文件 (ttf, svg, woff…)
- 生成图标跟 CSS 的映射
- 生成 TypeScript 组件当中使用枚举类型
- 打包更新 npm 模块
生成字体文件跟 CSS 映射我们之前用的是 webfonts-generator,
不过这个模块已经停止维护了, npm 上的版本还是有 bug 的, 主分支的还好一点.
考虑到使用不方便, 一致在寻找替代方案. 在一丝的指导下切换到了 font-carrier.
font-carrier 可以生成字体, 以及基础的 CSS 文件.
不过跟 webfonts-generator 不一样的是生成的 CSS 不要 class 来区分图标,
而是用 HTML 当中 utf8 字符直接跟图标字体对应 … 当然原理跟以前一样..
<i
dangerouslySetInnerHTML={{__html: `&#${fontsDict[props.name]}` || `NONE:${props.name}` }}
></i>
生成字体文件的代码就是调用 font-carrier 的 API,
另外自己记录了一个 dict
JSON 对象, 用来存储码表 …
initialFontValue = 0xe000
String.fromCharCode(initialFontValue)
fonts = fontCarrier.create()
dict = {}
icons.forEach (icon) ->
initialFontValue += 1
char = String.fromCharCode initialFontValue
fonts.setSvg(char, fs.readFileSync("./svg/#{icon}.svg").toString())
dict[icon] = initialFontValue
fonts.output
path: './src/fonts/jimo'
然后主要是生成类型文件的工作.. 基于 dict
数据生成 enum
, 基本够用.
遇到的坑
使用 font-carrier 过程当中有遇到一些问题, 联系维护者解决掉了,
- 图标形状奇怪
遇到一个圆弧反向的问题, 本来不知道怎么下手, 用 Glyphs 看了 TTF 文件的线条,,
注意到所有的线条跟原先的 SVG 在 Sketch 里面刚好反向了, 就怀疑是转的问题,
SVG 的 arc 圆弧有一个 SWEEP 值, 表示圆弧的方向, 就觉得是这个用错了.
维护者排查了一下, 是已知的问题, 在 svgpath 模块当中已经解决:
https://github.com/fontello/s…
最后靠升级依赖的版本解决掉了, 按说后续不会再遇到.
- 图标居中出现问题
图标对应的是 UTF8 的字符, 最开始我选择的数值比较小, 主要跳过常用的码位.
不过当时出现了问题, 就是图标左右居中不正常, 有很多明显往左边偏移 …
排查以后原因是选择的码位范围有问题, 刚好命中了一些奇怪的字符 …
维护者推荐的码位范围是 0xe000
以上, 我估计对应的是空白的 UTF8 码位. 解决了.
- 曲线闭合问题
从接手项目的时候就提到了 SVG 的图标需要曲线闭合,
不是完全懂什么意思, 估计是路径要求闭合, 方便字体填充颜色之类的.
设计师没处理好的话, 图标是显示空白的. 用 https://iconfont.cn 可以验证.
其他
另外一丝推荐的方案是我们设计师直接用 https://www.iconfont.cn 维护.
工具上可以提供 CSS 还有码位的导出, 比起我们手工处理要省事一点.
没想清楚, 后续如果有契机而且设计师可以维护的话, 考虑是否迁移过去.