Iconfont不能上傳如何維護(hù)Icon
引言
使用 iconfont 有很多優(yōu)勢(shì),比如只需要加載一次,全部圖標(biāo)都可以設(shè)置字號(hào)大小,顏色、透明度等,可以隨意變換字體的形態(tài),并且圖標(biāo)是矢量的,不會(huì)隨著字體大小的變化失真,得益于 iconfont.cn 提供的便利,大多情況下,我們不必上傳自己的圖標(biāo),只需要便捷的搜索,就可以將圖標(biāo)加入到自己的項(xiàng)目圖標(biāo)庫(kù)中,但最近工作中卻遇到了比較嚴(yán)重的問題。
現(xiàn)在做的事情
我所在公司目前正在建設(shè)低代碼平臺(tái),這個(gè)低代碼平臺(tái)可以說是無代碼,需要從原先的各個(gè)應(yīng)用中抽取部分頁(yè)面和組件成為低代碼組件,這樣低代碼平臺(tái)就可以通過拖拽組件,形成一個(gè)有個(gè)性化的業(yè)務(wù)場(chǎng)景。如果 A 應(yīng)用中的 A 組件需要更新,那么低代碼中的組件也需要同步更新,所以說組件并不是單獨(dú)的一個(gè) npm 包,而是類似于 webpack5 模塊聯(lián)邦(Module Federation)打包出來的 remote(遠(yuǎn)程)組件。
遇到的問題
問題一:命名沖突
原先都是一個(gè)個(gè)獨(dú)立的應(yīng)用,都是可以獨(dú)立部署獨(dú)立運(yùn)行,現(xiàn)在需要將這些應(yīng)用組合在一起,形成一個(gè)新的應(yīng)用,就遇到這個(gè)關(guān)于圖標(biāo)的問題。
由于原先各個(gè)應(yīng)用都是獨(dú)立部署,所以項(xiàng)目中就直接引用了 iconfont 中的字體,命名也都叫 iconfont,一旦將這些組件組合到一起,命名沖突之外,字體中的 unicode 也會(huì)沖突。
問題二:icon 圖標(biāo)庫(kù)沒交接
由于 icon 圖標(biāo)庫(kù)都是各個(gè)應(yīng)用的前端開發(fā)者維護(hù)的,他們都在自己的用戶名下建立項(xiàng)目, iconfont 圖標(biāo)庫(kù)在 git 倉(cāng)庫(kù)之外,在人員變動(dòng)的情況下,圖標(biāo)庫(kù)的權(quán)限往往會(huì)忘記交接。
問題三: iconfont 維護(hù)
正巧遇到 iconfont 維護(hù),到目前為止雖然可以使用,但是想要上傳新的圖標(biāo)還是不行。
如何解決?
問題一:全局替換
最簡(jiǎn)單的方式是各個(gè)應(yīng)用全局替換加前綴。
- <span class="iconfont icon-xxx"></span> + <span class="appAiconfont appAicon-xxx"></span>
這樣做當(dāng)然沒問題,但是到低代碼平臺(tái)那邊就會(huì)加載 n 個(gè)字體文件,并且都是包含整個(gè)應(yīng)用的字體,這就失去了使用 iconfont 的優(yōu)勢(shì)。
問題二:要回權(quán)限
雖然我們可以要回離職人員 iconfont 中項(xiàng)目的權(quán)限,短期可以解決項(xiàng)目上圖標(biāo)使用的問題,但是這個(gè)問題還是會(huì)有存在的可能。
問題三:力所不及
iconfont 目前也遇到了較大的問題,到目前為止還無法上傳文件,對(duì)于我們這些 iconfont 的使用者來說只有等待。
最終方案:使用 svg 代替 iconfont
使用 svg 的優(yōu)勢(shì)
- 完全離線化使用,不需要從 CDN 下載字體文件,圖標(biāo)不會(huì)因?yàn)榫W(wǎng)絡(luò)問題呈現(xiàn)方塊,也無需字體文件本地部署。
- 沒有 unicode,不會(huì)因?yàn)槌殡x組件而造成圖標(biāo)沖突
- 在低端設(shè)備上 SVG 有更好的清晰度。
- 支持多色圖標(biāo)。
- svg 可以支持動(dòng)畫
目前流行的組件庫(kù)已經(jīng)都使用了 svg 代理字體圖標(biāo),比如 ant-design、Material-UI 等
將引用的 iconfont 轉(zhuǎn)變?yōu)楸镜?svg
我們可以手動(dòng)一個(gè)一個(gè)從 iconfont 圖標(biāo)庫(kù)中下載 svg,但這樣做未免有些過于麻煩。
在 iconfont 字體樣式中,css 包含了這樣一個(gè)路徑,或者我們可以在項(xiàng)目 css 中直接找到這段代碼,然后下載這個(gè) svg。 打開 svg 會(huì)看到如下代碼
一個(gè) glyph
元素定義了 SVG 字體中的一個(gè)獨(dú)立的字形,所以我們可以通過一個(gè) node 腳本將這里面的獨(dú)立字形轉(zhuǎn)變 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=`<svg fill="currentColor" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"> <path d="${item.attribs.d}"></path> </svg>` fs.writeFile(path.join(__dirname,`./svg/${item.attribs['glyph-name']}.svg`),svgStr,(err,data)=>{ if (err) throw err; }) }); });
cheerio 是一個(gè) nodejs 下類似 jquery api, 主要是利用 cheerio 將字符串中的 d
和 glyph-name
寫到一個(gè) svg 文件中。 iconfont 中的字體圖標(biāo)大家都是 1024 所以,設(shè)置viewBox="0 0 1024 1024"
。
看下效果
這下,可以不用問離職人員要 iconfont 權(quán)限了。
svg 轉(zhuǎn)為 React Component
在 webpack 中我們可以使用一個(gè) 叫 svgr
的 loader,它可以將 SVG 轉(zhuǎn)換為一個(gè)隨時(shí)可用的 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
區(qū)分是否使用 url 的方式引用。
svgr 官網(wǎng)可以的 palayround 可以實(shí)時(shí)預(yù)覽轉(zhuǎn)換后的代碼
我們只需要啟動(dòng)應(yīng)用程序,Webpack 就會(huì)自動(dòng)完成轉(zhuǎn)換任務(wù),再不需要再擔(dān)心 SVG 了。你可以將 SVG 文件放在 src/
文件夾中的任何位置,并將它們作為 React 組件導(dǎo)入使用。
以上就是本文全部?jī)?nèi)容,希望這篇文章對(duì)大家有所幫助,也可以參考我往期的文章或者在評(píng)論區(qū)交流你的想法和心得,歡迎一起探索前端。
以上就是Iconfont不能上傳如何維護(hù)Icon的詳細(xì)內(nèi)容,更多關(guān)于Icon維護(hù)上傳Iconfont的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用 React 和 Threejs 創(chuàng)建一個(gè)VR全景項(xiàng)目的過程詳解
這篇文章主要介紹了使用 React 和 Threejs 創(chuàng)建一個(gè)VR全景項(xiàng)目的過程詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04React DOM-diff 節(jié)點(diǎn)源碼解析
這篇文章主要為大家介紹了React DOM-diff節(jié)點(diǎn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02react.js組件實(shí)現(xiàn)拖拽復(fù)制和可排序的示例代碼
這篇文章主要介紹了react.js組件實(shí)現(xiàn)拖拽復(fù)制和可排序的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08解決React報(bào)錯(cuò)Property value does not exist&n
這篇文章主要為大家介紹了React報(bào)錯(cuò)Property value does not exist on type HTMLElement解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12關(guān)于React Native使用axios進(jìn)行網(wǎng)絡(luò)請(qǐng)求的方法
axios是一個(gè)基于Promise的Http網(wǎng)絡(luò)庫(kù),可運(yùn)行在瀏覽器端和Node.js中,Vue應(yīng)用的網(wǎng)絡(luò)請(qǐng)求基本都是使用它完成的。這篇文章主要介紹了React Native使用axios進(jìn)行網(wǎng)絡(luò)請(qǐng)求,需要的朋友可以參考下2021-08-08React+ts實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了React+ts實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09