base64图片过多浏览器致死?

在开发 vue2 老项目时,前端渲染后端返回的 base64 图片,出现浏览器卡死,查看资料后发现,解析大量 base64 会出现大量占用cpu和内存,设备差点就会时不时发生。

vue2使用 workerjs 出现接受不到消息,没研究了,之前 vue3 没问题。

解决方案:

1.延时加载

如下vue2 hook 实现,vue3优雅多了这里不做演示

function useDefer(ref = {value: 0}, max = 60) {

    let frameCount = ref

    let frameId = null

    function updateFrame() {

        frameId = requestAnimationFrame(() => {

            frameCount.value++

            if (frameCount.value >= max) return

            updateFrame()

        })

    }  

    function start(c) {

        return frameCount.value >= c

    }  

    function remove() {

        cancelAnimationFrame(frameId)

    }

   

    updateFrame()  

    return {

        start,

        remove

    }

}

// vue2 组件内使用 ,示例是每帧加载一个组件

frameObj = {

  value: 0

}

myDefer = useDefer(frameObj ,1000)

<template v-for="i(tem,i) in dataList">

   <MyComp  v-if="myDefer .start(i * 60)" :key="item.id"></MyComp>

</templat>

 

// vue3 hook 实现

import { onBeforeUnmount, ref } from "vue";

export const useDefer = (max = 60) => {

    const frameCount = ref(0);

    let frameId;

    function updateFrame() {

        frameId = requestAnimationFrame(() => {

            frameCount.value++;

            if (frameCount.value >= max) return;

            updateFrame();

        });

    }

    updateFrame();

    onBeforeUnmount(() => {

        cancelAnimationFrame(frameId);

    });

    return function defer(count: number) {

        return frameCount.value >= count

    };

};

// vue3 组件内使用 ,示例是每帧加载一个组件

const defer = useDefer(1000)

<template v-for="i(tem,i) in dataList">

   <MyComp  v-if="defer(i * 60)" :key="item.id"></MyComp>

</templat>

2.worker多线程

开线程,分段分任务处理base64

3.图片懒加载

大屏页面优先加载 echarts 或 antv g6 图表,用户往下滚动,图片进入可视区域再加载图片(IntersectionObserver)

4.最正统的方案

后端返回图片地址,压力给到服务器

点此发表评论
暂无评论