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:
服务端渲染ssr:
可以通过阿里云数据可视化平台获取最新的geoJson数据
Echarts服务端渲染以及客户端懒加载实现方案的更多相关文章
- 构建服务端的AMD/CMD模块加载器
本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言: 在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...
- 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了
服务端渲染(SSR) 简述: 又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML. 鼠标右击点击查看源码时,页 ...
- react+redux教程(六)redux服务端渲染流程
今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...
- 前端性能优化--图片懒加载(lazyload image)
话说前头: 上次写了一篇webpack的学习心得,webpack能做到提升前端的性能,其模块打包最终生成一个或少量的文件能够减少对服务端的请求.除此之外,本次的图片懒加载(当然不仅限于图片,还可以有视 ...
- Angular开发实践(六):服务端渲染
Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是 Angular Universal(统一平台),一项在服务端运行 Angular 应用的技术. 标 ...
- Vue(服务端渲染)
一.前言 1.服务端渲染图解 2.简介服务端渲染 ...
- node服务端渲染(完整demo)
简介 nodejs搭建多页面服务端渲染 技术点 koa 搭建服务 koa-router 创建页面路由 nunjucks 模板引擎组合html webpack打包多页面 node端异步请求 服务端日志打 ...
- React 服务端渲染最佳解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- React 服务端渲染方案完美的解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- 转 : Hibernate懒加载深入分析
懒加载可以提高性能吗? 不可以简单的说"能",因为hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越.所以大家不要想着使用了懒加载总体性能 ...
随机推荐
- biancheng-linux-shell
参考http://c.biancheng.net/view/706.html Shell变量:Shell变量的定义.赋值和删除 Shell 支持以下三种定义变量的方式: variable=valuev ...
- Kotlin:【异常处理】自定义异常、先决条件函数
- Kotlin:【空安全概述】可空性、null类型、null安全
- .Net Core报“‘GB2312‘ is not a supported encoding name. For information on defining a custom encod”的错误
1.问题描述 在.Net Core中使用Encoding.GetEncoding("GB2312")报如下错误: System.ArgumentException:"'G ...
- Git 忽略文件配置全解析
Git 忽略文件配置全解析 在Git版本控制系统中,.gitignore文件扮演着至关重要的角色.它允许我们指定哪些文件或目录应该被Git忽略,即不被纳入版本控制之中.这对于避免提交敏感信息.构建产物 ...
- 2025年值得推荐的 8 款 WPF UI 控件库
前言 今天大姚给大家分享 8 款开源.美观.功能强大.简单易用的WPF UI控件库,希望可以帮助到有需要的同学. WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Wind ...
- pip安装MySQLdb报错mysql_config not found
报错EnvironmentError: mysql_config not found解决方法 1.sudo apt-get install python-setuptools 2.sudo apt-g ...
- 1个小技巧彻底解决DeepSeek服务繁忙!
DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理.代码生成等深度能力,堪称"AI界的六边形战士". DeepSeek 最具代表性的标签有以下两个 ...
- IAP升级(STM32)
IAP升级(STM32) IAP作用简述:将要升级的程序bin文件通过串口发送给STM32,STM32接收后存储到FLASH或者SRAM,用户通过事件(按键等)触发(也可延时自动触发)后将升级 文件夹 ...
- AD22 PCB导出Gerber文件详细步骤
PCB绘制好,检查完成后,就可以把文件交给PCB工厂生产了,一般有两种方式: 第一种最简单就是直接将PCB文件压缩打包,发给工厂. 第二种生成Gerber等相关资料,再压缩打包,发给工厂. 这里以AD ...