首页 > 其他分享 >Echarts服务端渲染以及客户端懒加载实现方案

Echarts服务端渲染以及客户端懒加载实现方案

时间:2025-01-15 11:36:36浏览次数:1  
标签:const 渲染 value Echarts chartInstance echarts 服务端 客户端

为了提升首屏的加载速度,考虑先用服务端渲染快速输出首屏图表,然后等待 echarts.js 加载完后,通过注水操作(Hydration),重新在客户端渲染同样的图表
tips:在客户端渲染的时候,应开启 tooltip: { show: true } 之类的交互组件,并且用 animation: 0 关闭初始动画(初始动画应由服务端渲染结果的 SVG 动画完成)
服务端渲染方案,以Nuxt为例:

// 服务端代码
import * as echarts from 'echarts';
// 注册地图
import chinaJson from '~/assets/JSON/cn.json';
export default defineEventHandler(async (event) => {
  if (process.server) {
    try{
      // 注册地图
    echarts.registerMap("china", chinaJson);
    const option = {
      animation:false,
      // 地理坐标系组件用于地图的绘制
      geo: {
        // 使用 registerMap 注册的地图名称。
        map: "china",
        label:{
          // show:true, // 地图文字是否显示
          color: '#333', // 地图文字颜色
        },
        itemStyle:{
          areaColor: '#ffffff', // 地图背景色
          borderColor:'#fd6b6c',// 地图边框颜色
          borderWidth: 0.6 // 地图边框线宽
        }
      },
      series: [
        {
          type: "map",
          map: "china",
          geoIndex: 0,
        },
      ...其他配置项
      ],   
      };
        // 在 SSR 模式下第一个参数不需要再传入 DOM 对象
    let chart = echarts.init(null, null, {
    renderer: 'svg', // 必须使用 SVG 模式
    ssr: true, // 开启 SSR
    width: 300, // 需要指明高和宽
    height:400
    });
      // 像正常使用一样 setOption
    chart.setOption(option,true);
    // 输出字符串 
    const svgStr = chart.renderToSVGString();

    // 如果不再需要图表,调用 dispose 以释放内存
    chart.dispose();
    chart = null;

    event.node.res.writeHead(200, { 'Content-Type': 'application/xml' });
    //通过svg字符串形式发送给客户端
    event.node.res.write(svgStr);
    event.node.res.end();
  }catch(error){
    console.log(error);
  }
  }
})

客户端接收:

const { data } = await useFetch('/api/hello');
if (process.client) {
    document.getElementById('svg').innerHTML = data.value;   
}

懒加载方案:

//引入组件
import * as echarts from 'echarts';
import chinaJson from '@/assets/JSON/china.json';
//注册地图
echarts.registerMap("china", chinaJson);
//创建图表引用对象
const chartsRef = ref(null);
//创建加载标识
const isLoading = ref(false);  
//创建引用来存储图表实例
const chartInstance = ref(null);
//创建配置项
const option = {
 animation:0,
 tooltip: {
    show:true,
  },
...其他配置项
}


//到达可视区域函数
function isVisible() {
    const containerHeight = document.getElementById('container').clientHeight;
    const elementHeight = document.getElementById('svg').getBoundingClientRect();
    if (elementHeight.y < containerHeight) {
        isLoading.value = true;
    }
}

//加载实例化图表函数
function renderLoad() {
    isVisible();
    if (isLoading.value && !chartInstance.value) { // Check if the chart is already initialized
        chartInstance.value = echarts.init(chartsRef.value);
        chartInstance.value.setOption(option);
        isLoading.value = false;
    }
}

//通过scroll到可视区域实例化图标
if (import.meta.client) {
    const container = document.getElementById('container');
    container.addEventListener('scroll', throttle(renderLoad), false);
}

onMounted(() => {
    renderLoad(); // 初始化渲染
});

//销毁避免内存泄漏
onBeforeUnmount(() => {
    if (chartInstance.value) {
        echarts.dispose(chartInstance.value);
        chartInstance.value = null;
    }
    const container = document.getElementById('container');
    container.removeEventListener('scroll', throttle(renderLoad));
});

懒加载方案有很多,交叉观察器等,但是兼容性没有scroll好
客户端渲染csr:
客户端渲染csr
服务端渲染ssr:
服务端渲染ssr
可以通过阿里云数据可视化平台获取最新的geoJson数据

标签:const,渲染,value,Echarts,chartInstance,echarts,服务端,客户端
From: https://www.cnblogs.com/bk-at-bear/p/18672587

相关文章

  • WebScoket-服务器客户端双向通信
    WebScoket学习笔记1.消息推送常用方式介绍轮询浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。长轮询浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。SSEserver-sent-event:服务器发送事件SSE是在服务器和客户......
  • Termora跨平台 SSH/SFTP/Terminal 客户端工具
    前言Termora一款强大的终端模拟与SSH客户端工具,集SFTP传输、跨平台兼容、Zmodem协议、SSH端口转发、配置同步、宏录制、关键词高亮、密钥管理、多会话命令发送及数据加密于一体,专为追求高效远程工作的您设计。无论是开发、管理还是日常任务,Termora都能助您一臂之力,开启便捷、安全......
  • websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库
    推荐一个C#开发的,实现WebSocket功能的开源项目。01项目简介websocket-sharp提供WebSocket客户端和服务器库,基于C#开发的,并遵循WebSocket协议规范,使得开发人员能够轻松地在.NET应用程序中实现WebSocket通信。websocket-sharp特色功能有:1、简洁易用的API:提供清晰且......
  • Git客户端(TortoiseGit)超全使用详解
    前言大家好,我是小徐啊。git是我们在开发Java应用的时候,要用到的代码版本管理工具。但是git本身自带的命令和gui工具,使用起来不是特别方便。TortoiseGit作为git的客户端,是一款非常实用的工具,能让我们以图形化的界面去操作git,今天就来介绍下TortoiseGit。文末附获取方式。如何使......
  • 开箱即用!一款支持多个大语言模型服务的桌面客户端!
    大家好,我是Java陈序员。可以说现在AI给我们的生活、工作带来了极大的便利,各种大语言模型层出不穷,功能多样。今天,给大家介绍一款支持多模型服务的桌面客户端,开箱即用!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍Ch......
  • 如何在ASP页面中判断客户端浏览器是否为移动设备,并进行相应的跳转?
    在ASP页面中,可以通过检查HTTP_USER_AGENT字符串来判断客户端浏览器是否为移动设备。如果检测到移动设备,则重定向到指定的移动端页面。以下是实现该功能的代码示例。为了SEO优化,问题标题已调整为更具描述性和关键词友好的形式。代码中已将具体的URL替换为“域名”,以适应不同的实际......
  • 网页应用从服务器主动推送到客户端有那些方式?
    网页应用从服务器主动推送到客户端的方式主要有以下几种:轮询(Polling):客户端不断向服务器发送请求询问是否有新数据。服务器返回新数据或表明无新数据。这种方式会造成很多无谓的请求,浪费带宽和服务器资源。长轮询(LongPolling):客户端向服务器发送请求后,服务器保持连接......
  • 请问如何在ASP页面中判断客户端浏览器是否为移动设备,并进行相应的跳转?
    问题描述:在ASP页面中,如何判断客户端浏览器是否为移动设备,并根据判断结果进行相应的页面跳转?答案:在ASP页面中,可以通过检查HTTP_USER_AGENT字符串来判断客户端浏览器是否为移动设备。如果检测到移动设备,则重定向到指定的移动端页面。以下是实现该功能的代码示例:<%'检查浏览器U......
  • Pulsar客户端如何控制内存使用
    摘要本文围绕一个常见的使用场景深入分析在高吞吐场景下,使用Pulsar客户端收发消息可能会遇到的若干问题。并以此为切入点,梳理一下Pulsar客户端在内存控制上所做的优化改进。使用场景假设这样一个常见的场景,一个搜索类业务需要记录用户搜索请求,以便后续分析搜索热点,以及有针对性......
  • 最全ECharts 实战大全(超全版)
    常用属性配置title标题配置text-标题文本,例如“柱状图”subtext-副标题文本****left标题的水平位置,可以是像’left’‘center’‘right’或者像’20%’这样的百分比top***-标题的垂直位置,可以是像‘top’,**‘middle’,**‘bottom’**或者像****‘20%’......