为了提升首屏的加载速度,考虑先用服务端渲染快速输出首屏图表,然后等待 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. Kotlin:【对象】object关键字、对象表达式、伴生对象、嵌套类、数据类、copy、解构声明、使用数据类的条件、运算符重载、枚举类、代数数据类型、密封类

  2. 生成对抗网络GAN简介

    本文分享自天翼云开发者社区<生成对抗网络GAN简介>,作者:王****青 生成对抗网络(Generative Adversarial Networks,GAN)是一种深度敏感词模型,用于生 ...

  3. Kali 配置Proxychains4

    Kali 配置Proxychains4 Proxychains4 是一款在 Linux 系统中广泛使用的代理工具,其全称为 ProxyChains.作为一款代理切换软件,Proxychains4 能够 ...

  4. Scratch教程:第1课认识Scratch

    一.Scratch来源 Scratch最初是由麻省理工学院媒体实验室的终身幼儿园研究小组的米切尔雷斯尼克和西摩于2003年发起的. 希望帮助所有的孩子"发现和跟随自己的激情和探索力,敢于尝试 ...

  5. Magnet AXIOM使用+2024獬豸杯实战

    Magnet AXIOM+2024獬豸杯实战 百度网盘链接 2024獬豸杯:https://pan.baidu.com/s/1t_6Fwl6RgmEtF0UXRfVD1A?pwd=j583#list/ ...

  6. ruoyi-vue axios通过接口请求wav、mp3音频二进制数据

    实现方式 在axios请求中注明responseType: 'blob',headers的Accept: 'audio/wav'不清楚要不要写,我加上了(请求接口) 在接口返回值中,使用Blob的构造 ...

  7. Hive - [01] 概述

    一.Hive是什么 是Facebook开源,用于解决海量结构化日志的数据统计工具. 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. Hive处理的数 ...

  8. 7. Nginx 工作机制&参数设置(详细讲解说明)

    7. Nginx 工作机制&参数设置(详细讲解说明) @ 目录 7. Nginx 工作机制&参数设置(详细讲解说明) 1. Nginx 当中的 master-worker 机制原理 2 ...

  9. php连接sql server 2014踩坑及处理记录

    1.PDOException: SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]对象名 'dbotest' ...

  10. C#长短链接服务器端WebApi作映射

    [HttpGet] public IHttpActionResult GetLongLink(string code) { if (string.IsNullOrWhiteSpace(code)) { ...