为了提升首屏的加载速度,考虑先用服务端渲染快速输出首屏图表,然后等待 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. spring事务配置的5种方式

    事务配置其实把思路理清,还是很容易的. spring的配置文件中关于事务配置总是由三个部分组成:分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一 ...

  2. Java并发包常用类用法及原理

    com.java.util.concurrent包是java5时添加的,专门处理多线程提供的工具类 一.Atomic 二.Lock 三.BlockingQueue 四.BlockDeque 五.Con ...

  3. Linux curl brew命令详解

    命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具 ...

  4. Linux7安装pacemaker+corosync集群-02--配置集群文件系统gfs2(dlm+clvmd)

    配置集群文件系统: 安装软件包: yum -y install   lvm2* gfs2* dlm* 1.安装rpm包 yum -y install   lvm2* gfs2* dlm* fence- ...

  5. rbd常用的配置参数

    本文分享自天翼云开发者社区<rbd常用的配置参数>,作者:l****n rbd的基本介绍 rbd的架构如下图所示: rbd采用CRUSH算法实现数据的随机分布.CRUSH算法,即Contr ...

  6. 浅说TCP状态机制

    本文分享自天翼云开发者社区<浅说TCP状态机制>,作者:云云生息 TCP(Transmission Control Protocol)是一种面向连接的.可靠的传输协议,常用于互联网中应用层 ...

  7. SQL Server统计信息更新会被阻塞或引起会话阻塞吗?

    在SQL Server数据库中,统计信息更新(UPDATE STATISTICS)会被其它会话阻塞吗?统计信息更新(UPDATE STATISTICS)会引起其它会话阻塞吗?在回答这两个问题前,我们必 ...

  8. Q:ssh远程连接慢的原因排查

    连接linux服务器一般都是使用SSH远程连接的方式.有时,SSH连接速度很慢,大约30s左右,但是ping时一切正常. 问题原因 1.server的sshd会去DNS查找访问的client ip的h ...

  9. extern和static

    extern和static extern和static两者之间是有一种相克的关系:用了extern的不能用static,用了static的不能用extern, extern是声明让别的文件中能够使用, ...

  10. 微信企业付款到零钱(Java版)

    订阅专栏1.开通条件. 商户注册超过90天且,连续30天有交易,可以每天支付1元来刷,目前测试可行.随后在微信商户平台 - 产品管理自动开启,然后需要申请. 疑问: 话说是要有公众号appid才行,但 ...