Iconfont 还是不能上传,如何维护你的 Icon?

sxkk20082年前知识分享127

使用 iconfont 有很多优势,比如只需要加载一次,全部图标都可以设置字号大小,颜色、透明度等,可以随意变换字体的形态,并且图标是矢量的,不会随着字体大小的变化失真,得益于 iconfont.cn 提供的便利,大多情况下,我们不必上传自己的图标,只需要便捷的搜索,就可以将图标加入到自己的项目图标库中,但最近工作中却遇到了比较严重的问题。

现在做的事情

我所在公司目前正在建设低代码平台,这个低代码平台可以说是无代码,需要从原先的各个应用中抽取部分页面和组件成为低代码组件,这样低代码平台就可以通过拖拽组件,形成一个有个性化的业务场景。如果 A 应用中的 A 组件需要更新,那么低代码中的组件也需要同步更新,所以说组件并不是单独的一个 npm 包,而是类似于 webpack5 模块联邦(Module Federation)打包出来的 remote(远程)组件。

遇到的问题

问题一:命名冲突

图标命名冲突

原先都是一个个独立的应用,都是可以独立部署独立运行,现在需要将这些应用组合在一起,形成一个新的应用,就遇到这个关于图标的问题。

由于原先各个应用都是独立部署,所以项目中就直接引用了 iconfont 中的字体,命名也都叫 iconfont,一旦将这些组件组合到一起,命名冲突之外,字体中的 unicode 也会冲突。

问题二:icon 图标库没交接

由于 icon 图标库都是各个应用的前端开发者维护的,他们都在自己的用户名下建立项目, iconfont 图标库在 git 仓库之外,在人员变动的情况下,图标库的权限往往会忘记交接。

问题三: iconfont 维护

iconfont 维护

正巧遇到 iconfont 维护,到目前为止虽然可以使用,但是想要上传新的图标还是不行。

如何解决?

问题一:全局替换

最简单的方式是各个应用全局替换加前缀。

- <span class="iconfont icon-xxx">span> + <span class="appAiconfont appAicon-xxx">span>

这样做当然没问题,但是到低代码平台那边就会加载 n 个字体文件,并且都是包含整个应用的字体,这就失去了使用 iconfont 的优势。

问题二:要回权限

虽然我们可以要回离职人员 iconfont 中项目的权限,短期可以解决项目上图标使用的问题,但是这个问题还是会有存在的可能。

问题三:力所不及

iconfont 目前也遇到了较大的问题,到目前为止还无法上传文件,对于我们这些 iconfont 的使用者来说只有等待。

最终方案:使用 svg 代替 iconfont

使用 svg 的优势

  • 完全离线化使用,不需要从 CDN 下载字体文件,图标不会因为网络问题呈现方块,也无需字体文件本地部署。

  • 没有 unicode,不会因为抽离组件而造成图标冲突

  • 在低端设备上 SVG 有更好的清晰度。

  • 支持多色图标。

  • svg 可以支持动画

目前流行的组件库已经都使用了 svg 代理字体图标,比如 ant-design、Material-UI 等

将引用的 iconfont 转变为本地 svg

我们可以手动一个一个从 iconfont 图标库中下载 svg,但这样做未免有些过于麻烦。 iconfont css 在 iconfont 字体样式中,css 包含了这样一个路径,或者我们可以在项目 css 中直接找到这段代码,然后下载这个 svg。 打开 svg 会看到如下代码 iconfont.svg 代码 一个 glyph 元素定义了 SVG 字体中的一个独立的字形,所以我们可以通过一个 node 脚本将这里面的独立字形转变 svg

直接上代码

const cheerio = require('cheerio')
const fs = require('fs')
const path = require('path')

fs.readFile(path.join(__dirname, './iconfont.svg'), 'utf8', function (err, data) {
  if (err) throw err
  //console.log(data)
  const $ = cheerio.load(data)
  $('glyph').each((index, item) => {
    const svgStr = `
    
`
    fs.writeFile(
      path.join(__dirname, `./svg/${item.attribs['glyph-name']}.svg`),
      svgStr,
      (err, data) => {
        if (err) throw err
      }
    )
  })
})

cheerio 是一个 nodejs 下类似 jquery api, 主要是利用 cheerio 将字符串中的 d glyph-name 写到一个 svg 文件中。 iconfont 中的字体图标大家都是 1024 所以,设置viewBox="0 0 1024 1024"

看下效果

svg 转化完成

这下,可以不用问离职人员要 iconfont 权限了。

svg 转为 React Component

在 webpack 中我们可以使用一个 叫 svgr 的 loader,它可以将 SVG 转换为一个随时可用的 React 组件。

首先使用 npm 安装 @svgr/webpack

npm install @svgr/webpack --save-dev

然后在 webpack.config.js 中加入配置

const webpack = require('webpack')

module.exports = {
  entry: './src/index.js',
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader'],
      },
      {
        test: /\.svg$/i,
        type: 'asset',
        resourceQuery: /url/, // *.svg?url
      },
      {
        test: /\.svg$/i,
        issuer: /\.[jt]sx?$/,
        resourceQuery: { not: [/url/] }, // exclude react component if *.svg?url
        use: ['@svgr/webpack'],
      },
    ],
  },
}

使用方式

import svg from './assets/file.svg?url'
import Svg from './assets/file.svg'

const App = () => {
  return (
    <div>
      <img src={svg} width="200" height="200" />
      <Svg width="200" height="200" viewBox="0 0 3500 3500" />
    div>
  )
}

通过使用 ?url 区分是否使用 url 的方式引用。

svgr 官网可以的 palayround 可以实时预览转换后的代码

svgr palayround

我们只需要启动应用程序,Webpack 就会自动完成转换任务,再不需要再担心 SVG 了。你可以将 SVG 文件放在 src/文件夹中的任何位置,并将它们作为 React 组件导入使用。

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关文章

百度AI人脸对比:现实应用与潜在影响

百度AI人脸对比:现实应用与潜在影响

  随着人工智能技术的快速发展,人脸识别技术已经成为各个领域广泛应用的一项重要技术。其中,百度AI人脸对比技术凭借其高精度和强大的功能,在社会治安、金融安全、智能门禁等领域发...

在 2021 年 star 排行榜单中,tauri 一年增长了 18k 排名第五,我们就很好奇,Tauri 有什么优势呢?

然后我分别用 tauri 和 Electron.JS 打包测试一个 hello world 程序,一起来看下它们的大小。

大小对比

  • Electron.JS 62.5mb
  • Tauri 4.32mb

Tauri 构建的桌面程序太小了,远不是 Electron.JS 可以相比的,因为它放弃了体积巨大的  Chromium 内核   和  nodejs,前端使用操作系统的  webview,后端集成了  Rust。 Tauri 提供了初始化程序的模板,比如原生 js, react, svelte.js, vue.js 等等。

image.png

初步尝试 tauri,并且与 electron.js 对比

什么是 Tauri?Tauri 是一个为所有主流桌面平台构建小型、快速二进制文件的框架。开发人员可以集成任何编译成 HTML、 JS 和 CSS 的前端框架来构建他们的用户界面。应用程序的后端是一个...

基于 Tauri, 我写了一个 Markdown 桌面 App

前言大家好,我是Ai知识分享。去年,我开发了一款微信排版编辑器 MDX Editor。它可以自定义组件、样式,生成二维码,代码 Diff 高亮,并支持导出 Markdown 和 PDF 等功能。然而,...

2022 年终总结,知识沉淀这一年

Hello ,大家好,我是Ai知识分享,一名小厂前端工程师,普通的不能再普通的小前端,本来不想写年终总结了,因为一年下来,也没啥变化,看到别人发年终总结文章,实在是自愧不如。后来想了想还是得总结下,写...

文字识别插件人工智能技术:提升效率、深挖数据潜能

文字识别插件人工智能技术:提升效率、深挖数据潜能

  文字识别(OCR)插件是一种基于机器学习和人工智能的技术,可将文档、图片中的文字提取出来,实现自动识别和转换。在如今信息爆炸的时代,文字识别插件的应用范围日益广泛,包括但...

数字贸易: 推动全球经济增长与创新的新引擎

数字贸易: 推动全球经济增长与创新的新引擎

  随着全球经济的快速发展,数字贸易逐渐成为推动经济增长与创新的新引擎。数字贸易是指通过技术手段在互联网平台上进行的跨境贸易活动,包括电子商务、数字支付、数据流动等。数字贸易...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。