为了提升首屏的加载速度,考虑先用服务端渲染快速输出首屏图表,然后等待 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:



服务端渲染ssr:



可以通过阿里云数据可视化平台获取最新的geoJson数据

Echarts服务端渲染以及客户端懒加载实现方案的更多相关文章

  1. 构建服务端的AMD/CMD模块加载器

    本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言:  在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...

  2. 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了

    服务端渲染(SSR) 简述:     又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML.     鼠标右击点击查看源码时,页 ...

  3. react+redux教程(六)redux服务端渲染流程

    今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...

  4. 前端性能优化--图片懒加载(lazyload image)

    话说前头: 上次写了一篇webpack的学习心得,webpack能做到提升前端的性能,其模块打包最终生成一个或少量的文件能够减少对服务端的请求.除此之外,本次的图片懒加载(当然不仅限于图片,还可以有视 ...

  5. Angular开发实践(六):服务端渲染

    Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是 Angular Universal(统一平台),一项在服务端运行 Angular 应用的技术. 标 ...

  6. Vue(服务端渲染)

    一.前言 1.服务端渲染图解                                                 2.简介服务端渲染                             ...

  7. node服务端渲染(完整demo)

    简介 nodejs搭建多页面服务端渲染 技术点 koa 搭建服务 koa-router 创建页面路由 nunjucks 模板引擎组合html webpack打包多页面 node端异步请求 服务端日志打 ...

  8. React 服务端渲染最佳解决方案

    最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...

  9. React 服务端渲染方案完美的解决方案

    最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...

  10. 转 : Hibernate懒加载深入分析

    懒加载可以提高性能吗? 不可以简单的说"能",因为hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越.所以大家不要想着使用了懒加载总体性能 ...

随机推荐

  1. javascript与css3动画学习笔记

    当Html5,css3已渐渐成为主流的时候,我还非常习惯的用js去做一些简单的动画.因为在桌面浏览器上, 并非所有的都支持css3.用户也倒是很奇怪,用户习惯并不是每个用户都可以被培养.总有不少人会觉 ...

  2. 测试 【子牙-writing】 大模型

    参考:姜子牙大模型系列 | 写作模型ziya-writing开源!开箱即用,快来认领专属你的写作小助手吧 封神榜:https://github.com/IDEA-CCNL/Fengshenbang-L ...

  3. MongoDB:【索引的管理操作】

  4. ctfshow 红包题第七弹 .git

    .git源码泄露 发现有后们 flag在上级目录里面 直接Letmein=show_source('../flag.txt');就出来了

  5. 2024大湾区网络安全大会,AOne来了!

    近日,2024大湾区网络安全大会暨第二十六期花城院士科技会议在广州启幕.学者专家.高校院长.政府相关负责人及行业大咖齐聚一堂,围绕网络安全的前沿话题与挑战展开深入交流与探讨.天翼云科技有限公司网络安全 ...

  6. 恭喜我同事的论文被IEEE HPCC收录!

    近日,由天翼云科技有限公司云网产品事业部天玑实验室撰写的<关于公有云区分负载QoS感知的内存资源动态超分管理优化>(Thoth:Provisioning Overcommitted Mem ...

  7. go的math/rand随机数生成器

    伪随机数生成器,默认情况下随机数种子是固定的, 注意:固定的随机数种子每次生成的随机数都是相同的随机数序列 一.基础用法 math/rand 包提供了随机数生成的方法.常用的函数包括: rand.In ...

  8. 开源接流:一个方法搞定3D地图双屏联动

    老大提需求:一份数据,在2D地图上可编辑,在3D地图上显示高度信息,关键是两个地图得支持视图同步,末了还来句"两天时间够了吧?"我饶了饶头,内心各种问候...,代码如何下手,特X的 ...

  9. Linux下普通用户免密切换root

    问题需求: Linux下普通用户doge免密切换root 问题解决: Linux下普通用户切换到root用户下,默认情况是需要输入密码很不方便,因此需要实现普通用户doge免密切换到root用户. 示 ...

  10. Maven 打包的几种常用方式

    一.maven-jar-plugin 默认的打包插件,用来打普通的jar 包,需建立lib目录里来存放需要的依赖包 二.maven-shade-plugin (推荐) 将依赖的jar包打包到当前jar ...