如果iconfont停止服务了,我们怎么办

前言

个人一直都比较喜欢阿里大佬提供的一些组件服务什么的,这里就只说图标管理吧,最开始的时候我是使用的icomoon.io 后面发现www.iconfont.cn/ 在以前开发是时候我们为了图片的请求少点,提升网站的性能会把这些小图标做到一张图上面专业叫法是雪碧图,后来随着前端发展有了字体图标,不啰嗦了吧,回到正题,由于上次icofont官网挂了之后,导致我的项目无法进行正常迭代,我就决定要自己弄个简单的图标管理。

需求

一般使用需要的是把设计做好的图标或者其他地方下载的svg图标上传到服务器然后可以查看,并且打包成一个js文件加载到项目中。

准备

都说天下文章一大抄,我也是去抄iconfont,我把iconfont的使用demo打开研究了一下。

我这里只说Symbol,通过分析看到就是我们需要在项目中引入./iconfont.js

iconfont把我们上传的图标进行了删减优化,最外层就一个svg标签里面使用了一个symbol标签来包裹之前的图标内容,每一个symbol的id都对应之前的svg图标名称。

iconfont也没有开源,具体怎么做的咱也不知道,只能知道目前这些信息了,然后就按照自己理解开始开发实现了

前端开发

通过上面我们可以知道,现在我们前端需要的是把设计稿的svg图变成symbol里面的内容,打开svg图 可以简单测试下,直接把内容复制然后粘贴带了iconfont.js中,然后运行demo图标正常显示就说明是ok的,不然就是这样做是不行的。

通过图片我们可以看到,现在需要的就是把svg里面的path改成用symblo来包裹,在开发中svg图我们是通过文档流上传上来的,这个时候我们就需要对文档流进行操作,先把文档流变成字符串,然后js操作字符串拼接达到目的。

  1. 使用到FileReader和readAsText获取到字符串
js 复制代码
 const fileParse = (file) => {
   return new Promise((resolve) => {
     const fileReader = new FileReader();
     fileReader.readAsText(file, "UTF-8");
     fileReader.onload = (e) => {
       resolve({ content: e.target?.result, name: file.name })
     }
   })
 }
  1. 字符操作拼接我使用的是cheerio
js 复制代码
  const handleUploadSvg = ($, result) => {
    let index = result.indexOf('<svg');
    const str = result.slice(index);
    const svgNode = $(str);

    $('svg').attr('viewBox', svgNode.attr('viewBox'));
    const findPath = svgNode.find('path');
    if (!findPath.length) {
      message.error('图标错误,不存在path')
      return '';
    };
    findPath.each((i, el) => {
      $(el).removeAttr('id');
    });
    const gDom = svgNode.find('g');

    gDom.each((i, el) => {
      const path = $(el).children('path');
      const fill = $(el).attr('fill');
      if (fill && fill !== 'none' && path.length && !$(path[0])?.attr?.('fill')) {
        $(path[0])?.attr?.('fill', fill)
      }
    });
    removeArrtId($, gDom);

    if (gDom.length) {
      $('svg').html(svgNode.html());
    } else {
      $('svg').html(svgNode.find('path'));
    }

    return $.html("svg")
  }

通过上面的操作我们可以得到一个新的svg源码,图标显示还是flow

然后我把这个字符串传送给后端就行了

后端开发

后端要做的就是把我上传上来的svg字符串拼接到一起,然后以iconfont.js一样通过一个get接口返回给我就可以了, 通过浏览器可以访问到就说明ok了

其他两种需要用到些第三方库当时也有顺便研究看到了,如果有需要我再写一篇。

文章中会有些不怎么清晰或者有问题的地方还望各位大佬见谅,刚刚开始决定写一些技术相关文章,嗨很生疏

相关推荐
万少10 分钟前
等不到 Apple 的折叠 iPhone,我用 DeepV4.1Flash + workBuddy 一句话自己造了一台
前端·javascript·后端
梦曦i14 分钟前
uni-router v0.2.0重磅发布:全链路拦截+重复导航优化
前端·uni-app
数据知道21 分钟前
AES 加密实战——模式选择(ECB/CBC/GCM)与安全陷阱
前端·网络·安全
一夜枫林41 分钟前
vue实现scroll-view上下滑动右侧左右滑动
前端·javascript·vue.js
志尊宝1 小时前
Vue3 零基础每日笔记(011):生命周期钩子——在正确的时间做正确的事
javascript·vue.js·笔记
苏三的开发日记1 小时前
npm EPERM:无法写入 `.npmrc` 的排查与解决
前端
YWL1 小时前
OpenLayers地图分享:URL参数同步+分享链接生成,让用户一键分享地图视角
前端·javascript·vue·openlayers
枫叶梨花2 小时前
Electrobun透明窗口在Windows上的输入穿透排查
前端·electron·bun
梦醒沉醉2 小时前
5、表达式与运算符
javascript
云上工程笔记3 小时前
AstraFlow + React/Vite:如何用自然语言开发并部署一个 AI 咖啡网站原型
前端·人工智能·react.js