next.js 中iconfont Symbol 加载svg优化 方法二

一直想优化iconfont Symbol加载方法,上一次讲到找到iconfont Symbol优化(https://blog.csdn.net/qq_41211900/article/details/109570775)结果测试网站页面时,方法js业务处理时间变大,这个不愿看到了,但是解决了icon等页面加载完才慢慢显示出来等问题。

如是又想到了一种转换办法,转换成一个json数据,再读取的办法,可以减少js业务处理时间,还能提升网页速度。

1.制作一个页面储存iconfont Symbol内容

新建一个文件:../public/js/iconfont1.js,里面放置iconfont Symbol下载文件iconfont.js,复制放置里面去。并用module.exports=导出文件。

2.制作一个页面写转换成object代码:

import React,{useState,useEffect,useRef,memo, useCallback}  from 'react'
function Getsvg(){
    const svgXML=useRef(null)
    useEffect(()=>{
        const iconfont=require('../public/js/iconfont1');
        //console.log("iconfont",iconfont)
        if(iconfont){
        let listXML={}
        var parser = new DOMParser(); 
        var resXML = parser.parseFromString(iconfont,'text/xml');
        var zeroXML = resXML.querySelectorAll("symbol");
        for(let i=0;i<zeroXML.length;i++){
            let item=zeroXML[i]
            let obj={}
            obj.id=item.getAttribute("id");
            obj.viewBox=item.getAttribute("viewBox");
            obj.svg=item.innerHTML
            listXML[obj.id]=obj
            //listXML.push(obj)
        }
                //console.log("resXML",resXML)
        //console.log("zeroXML",zeroXML)
        //console.log("listXML",listXML);
        console.log(JSON.stringify(listXML))
        // if(svgXML.current){
        //     svgXML.current.innerHTML=zeroXML.innerHTML
        //     svgXML.current.setAttribute("id",zeroXML.getAttribute("id"))
        //     svgXML.current.setAttribute("viewBox",zeroXML.getAttribute("viewBox"))
        // }
          }
    },[])
  
    return (
        <h1 >
            成功,去复制吧!
        </h1>
    )
}

export default Getsvg

复制的内容,粘贴到新建的json文件中:iconfont.json

3.制作icon组件

import React, { useState, useEffect, useRef, memo, useCallback } from 'react'
import iconfont from '../data/iconfont.json'
function Getsvg({ className, name, style }) {
    let item=iconfont[name]
    return (
        <svg className={`icon ${className && className != undefined ? className : ''}`} 
             id={item.id} 
             viewBox={item.viewBox} 
             dangerouslySetInnerHTML={{__html:item.svg}}>
        </svg>
    )
}

export default memo(Getsvg)

在next.js中,通过测试发现用json文件 import导入和js module.exports导出+ import导入,在相同条件情况下,json载入更快页面size更小。我猜测是next.js将json文件看做是数据类型,而js文件则是业务逻辑。所以json会比js文件更快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web16888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值