一文帮你理清前端渲染方案!

news/2024/7/10 2:07:57 标签: 运维, java, vue, javascript, 面试

01

引言

随着前端系统的越发复杂,前端的性能也受到越来越多的重视。Google也不断在推进新的性能相关指标,从原先的Performance API中的指标逐步演进成用户性能体验相关的指标。

对于用户而言,First Paint、First Meaningful Paint和TTI这几个指标可以直接影响到用户体验。关于前端性能优化有非常多的最佳实践可以参考,这篇文章会重点介绍前端渲染的方案及其优劣。

02

CSR vs SSR

CSR:Client Side Rendering

浏览器(Client)渲染顾名思义就是所有的页面渲染、逻辑处理、页面路由、接口请求均是在浏览器中发生。其实,现代主流的前端框架均是这种渲染方式,这种渲染方式的好处在于实现了前后端架构分离,利于前后端职责分离,并且能够首次渲染迅速有效减少白屏时间。同时,CSR可以通过在打包编译阶段进行预渲染或者骨架屏生成,可以进一步提升首次渲染的用户体验。

但是由于和服务端会有多次交互(获取静态资源、获取数据),同时依赖浏览器进行渲染,在移动设备尤其是低配设备上,首屏时间和完全可交互时间是比较长的。

SSR:Server Side Rendering

服务端渲染则是在服务端完成页面的渲染,在服务端完成页面模板、数据填充、页面渲染,然后将完整的HTML内容返回给到浏览器。由于所有的渲染工作都在服务端完成,因此网站的首屏时间和TTI都会表现比较好。

但是,渲染需要在服务端完成,并不能很好进行前后端职责分离,而且白屏时间也会比较长,同时,对于服务端的负载要求也会比较高。

基于Hydration的SSR和CSR融合

SSR和CSR均有各自的优点和缺点,因此,业界提出前后端渲染同构的方案来整合SSR和CSR。

整个页面的加载和刷新是通过服务端渲染来实现,在渲染生成的HTML中内嵌JavaScript和数据内容。通过这样的实现,可以达到和SSR相同的首屏时间,并且基于Hybration,可以生成前端的虚拟Dom,避免前端触发二次渲染。

SSR和CSR的页面渲染体验对比:

SSR和CSR不同阶段优劣对比:

Serverless SSR

前端使用SSR进行渲染同构有一个非常明显的缺点:服务资源消耗和运维。通常情况下,同构SSR会采用Node服务,需要固定的服务器资源,并且服务器的运维对于前端同学也提出了很高的要求。

随着Serverless技术的出现,这些问题似乎得到了很好的解决。Serverless基于触发器调用云端部署的函数,然后调用后端服务。

对于前端同学而言,仅仅只需要实现云端函数的实现,对于服务器的运维管理完全不用关心,同时服务器会实现自动弹性伸缩,有效节省了机器资源。

当然,Serverless并不是万能的,服务器的冷启动目前依旧还是一个非常大的问题。

SSR在性能收益上是完胜CSR,配合Serverless,SSR的开发成本仅仅比CSR有略微的提高,因此,从收益成本来看,Serverless SSR已经有了较大的优势,可能会成为未来的趋势。

03

NSR

UC浏览器在新闻feed流页面加载中采用了NSR(Native Side Rendering),首先在列表页中加载离线页面模板,通过Ajax预加载页面数据,通过Native渲染生成Html数据并且缓存在客户端。

NSR本质是分布式SSR,将服务器的渲染工作放在了一个个独立的移动设备中,实现了页面的预加载,同时又不会增加额外的服务器压力。

04

ESR

ESR - Edge Side Rendering,方案的核心思想是,借助边缘计算的能力,将静态内容与动态内容以流式的方式,先后返回给用户。cdn 节点相比于 server,距离用户更近,有着更短的网络延时。在 cdn 节点上,将可缓存的页面静态部分,先快速返回给用户,同时在 cdn 节点上发起动态部分内容请求,并将动态内容在静态部分的响应流后,继续返回给用户。

从上面结果可以看出,在网速越慢的情况下,通过 cdn 流式渲染的最终主要元素出来的时间比原始 SSR 的方式出来得越早。这与实际推论也符合,因为网络越慢,静态资源加载时间越慢,对应的浏览器提前加载静态资源带来的效果也越明显。另外,不管在什么网络情况下,cdn 流式渲染方式的白屏时间要短很多。

05

总结

CSR、SSR、NSR、ESR,前端渲染方案如此纷繁复杂,其实每一种渲染方案都有其优势和劣势,一定要结合自身的业务需求,平衡好收益和成本选择适合自己的方案。

◆ ◆ ◆  ◆ ◆

你的在看我当成喜欢


http://www.niftyadmin.cn/n/1251482.html

相关文章

PHP2018版在哪些程序,2018年PHP程序员的进阶之路

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第1阶段:初级PHP程序员重点:把LNMP搞熟练(核心是安装配置基本操作)目标:能够完成基本的LNMP环境安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在PHP中…

写给前端新人 - 我 JS 写的好好的,为什么要用那么复杂的 TS

作者:Kaiser原文:https://juejin.cn/post/6953500339425247246前言我JS写的好好的,为啥要用TS写呢?本文写给那些完全没有用过TS,也没有使用过结构化语言,对TS有一定的心智负担的前端新手同学。面对铺天盖地…

php转发ajax,jquery下php与ajax的互传数据自我总结

研究了一整天的json数据与ajax的数据传输,现在进行一个小的自我总结,仅供参考1.关于ajax的认识使用其跟php段进行通信。//jquery直接进行ajax的包装调用$(function(){$("#subbtn").click(function(){//单引号value没有括号var namedocument.ge…

java泛型在集合中使用,Java Day14 在集合中使用泛型

//为什么要使用泛型//1.解决元素存储的安全性的问题//2.解决获取元素时,需要类型转换的问题//未使用泛型package org.tizen.test;import java.util.ArrayList;import java.util.List;public class TestMain {public static void main(String []str){List list new …

如何打造一款标准的 JS SDK ?

作者:茶什ihttps://developer.aliyun.com/article/777451岳鹰全景监控,是阿里UC官方出品的先进移动应用线上监控平台,为开发者及企业提供一套完整的移动应用线上质量监控解决方案。岳鹰WEB前端监控,可实时监控页面性能、JS异常、资…

pagerank算法实现matlab,【MATLAB】pagerank算法

clear;clc A[ 0 0 0 0 0 11 0 0 0 0 00 1 0 0 0 00 1 1 0 0 00 0 1 0 0 00 0 1 0 1 0]; %有向图邻接矩阵[n,n] size(A);sn sum(A,2); %按列求矩阵A各行的和d 0.85; %阻尼因子D zeros(1,n);for j1:nif sn(j)0A(j,:)ones(1,n)/n;elseA(j,:)A(j,:)/sn(j);endend% A (1-d)/n*o…

matlab仿真igbt,逆变器用IGBT吸收电路的Matlab仿真研究

2009年第3l卷第6期第27页电气传动自动化EI.ECTRICD…

知乎高赞:前端模块化的十年征程

作者:外婆的https://zhuanlan.zhihu.com/p/265632724前言夫以铜为镜,可以正衣冠;以史为镜,可以知兴替 ——《旧唐书魏徵传》也许在谈论具体的内容之前,我们需要谈论一下关键词的定义。 什么是"模块"&#xf…