Angular 之父为什么怼 React ?(上)

简介: Angular 之父为什么怼 React ?

大家好,我卡颂。

前几天,Angular之父「Miško Hevery」「Dan」在推上发生了一段有趣的对话,对话背景大概是:

  1. 传统SSR(服务端渲染)场景下使用的技术叫Hydration「Miško」曾向「Dan」演示了一个新技术概念 —— Resumable
  2. 「Dan」认为这项技术不可行

image.png

  1. 「Miško」Qwik框架中实现了Resumable
  2. 「Dan」表示在React中我们之所以没有考虑Resumable,并不是因为框架不好接入,而是因为Resumable并不是更优解

image.png

  1. 「Miško」表示这是吃不到葡萄说葡萄酸

image.png

那么,Resumable到底是什么技术?他和React在推进的RSCReact Server Component)有什么区别?「Miško」为什么会作出上述言论?

让我们通过本文了解一下。

Resumable(恢复)是什么

Resumable的概念源于一次思路的转变。

虽然主流前端框架都支持SSR,但不管是ReactVue还是Angular,他们都是CSR(客户端渲染)优先。

在这些框架中,SSR是在CSR的基础上附加的新功能。

正是由于传统前端框架都是「CSR优先」的产物,才导致一些常见SSR问题,比如:

  • 首屏渲染时,页面短时间无法响应交互,因为此时框架还未hydrate完成
  • 即使仅有部分内容需要交互,但整个页面还得全量hydrate

这些问题拉低了SSR场景下的FCP[1](First Contentful Paint)与TTI[2]指标(time to interactive)。

下图展示了SSR场景下hydrate的流程,包括4个步骤,只有在整个流程完成后应用才能响应交互:

  1. 下载HTML
  2. 下载所有JS文件
  3. 解析、执行JS文件(主要是框架及其依赖,还有业务逻辑代码)
  4. 绑定事件(即hydrate操作)

image.png图来自于qwik文档

在某些应用场景(比如电商、博客)下,除了第一步,其他步骤可能不是必须的。

比如,对于一个电商商品详情页,除了展示商品所需的HTML外,其他都不是首屏渲染所必须的。

这就是Qwik框架中Resumable技术的设计理念 —— HTML优先,JS按需下载:

image.png图来自于qwik文档

要实现Resumable,需要抛弃传统框架以CSR为基础(用JS生成HTML为主)的思路,转而以SSR为基础(以服务端生成HTML为主),再在此基础上附加CSR功能。

为什么叫Resumable?

Resumable的理念概括起来就是「按需下载、执行JS」

所有JS代码的下载及运行会延迟到需要的时候再执行。在如下官方示例1[3]中,会渲染一个按钮,「按钮的点击回调对应代码」不会在首屏渲染时下载:

export default component$(() => {
  return (
    <button
      onClick$={() => {
        // 这部分代码不会在首屏渲染时下载
        console.log('click');
        const div = document.querySelector('#container')! as HTMLElement;
        div.style.background = 'yellow';
      }}
    >
      执行
    </button>
  );
});

只有在点击按钮时,对应代码才会被下载并执行:

image.png

这就使得首屏渲染时需要下载及执行的JS文件大大减少,提高了FCPTTI指标。

实际上,如果以Chrome lighthouse的评分作为评判依据,其他框架确实都难以望Qwik的项背

这项技术之所以叫Resumable(恢复),是因为它与传统Hydration技术在首屏渲染时客户端逻辑的区别。

传统Hydration技术在首屏渲染时,客户端(比如浏览器)会全量执行框架代码与业务逻辑代码,并在此过程中完成:

  • 框架组件对应的树状数据结构初始化(比如在React中叫Fiber树,在Vue中叫VNode树)
  • 组件内状态初始化
  • 事件绑定

而以上过程在Resumable技术中是发生在服务端的。比如,对于上述按钮的例子,点击回调对应的下述代码会在服务端生成HTML时完成序列化:

onClick$={() => {
  console.log('click');
  const div = document.querySelector('#container')! as HTMLElement;
  div.style.background = 'yellow';
}}

序列化后的数据会以HTML属性的形式存在:

image.png

当点击事件发生后,框架的前端部分会根据HTML属性(示例中的on:click属性)向后端请求具体的JS代码(即点击回调对应的代码)并执行。

一句话总结就是 —— 在Resumable技术中,一切以SSR为主,部分在SSR时未完成的操作(比如交互逻辑对应代码)会在需要触发时(比如交互发生时)再「恢复」执行,所以这一技术叫Resumable(恢复)。

与RSC的区别

同样是SSR相关技术,React团队主导的RSCReact Server Component)与Resumable有什么区别呢?

在讲解他们的区别前,我们要先了解一个背景知识:React「CSR优先」的框架,而且他已经出现很多年了(13年问世)。

虽然这些年出现了很多优秀的框架技术(比如SignalAOT),但React一直坚持这套「重客户端运行时」技术架构。

在发布React Hooks后,React团队逐渐将重心转移向服务端。由于其技术架构偏向客户端运行时,所以将React直接改造为「SSR优先」显然不现实。

为此,React团队的策略是 —— 提供SSR能力,再让其他「SSR优先」框架接入(主要是Next.js)。

所以,ResumableRSC的主要区别其实体现在框架底层实现层面。

目录
相关文章
|
1月前
|
开发框架 前端开发 JavaScript
React、Vue.js 和 Angular主流前端框架和选择指南
在当今的前端开发领域,选择合适的框架对于项目的成功至关重要。本文将介绍几个主流的前端框架——React、Vue.js 和 Angular,探讨它们各自的特点、开发场景、优缺点,并提供选择框架的建议。
44 6
|
2月前
|
前端开发 JavaScript API
React、Vue.js 和 Angular前端三大框架对比与选择
前端框架是用于构建用户界面的工具和库,它提供组件化结构、数据绑定、路由管理和状态管理等功能,帮助开发者高效地创建和维护 web 应用的前端部分。常见的前端框架如 React、Vue.js 和 Angular,能够提高开发效率并促进团队协作。
123 4
|
2月前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
58 3
|
3月前
|
XML 前端开发 JavaScript
React 与 Angular:全面的比较
【8月更文挑战第30天】
70 1
|
3月前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
92 0
|
3月前
|
开发者 缓存 数据库
【性能奇迹】Wicket应用的极速重生:揭秘那些让开发者心跳加速的调优秘技!
【8月更文挑战第31天】在软件开发中,性能优化是确保应用快速响应和高效运行的关键。本书《性能调优:Apache Wicket应用的速度提升秘籍》详细介绍了如何优化Apache Wicket应用,包括代码优化、资源管理、数据库查询优化、缓存策略及服务器配置等方面。通过减少不必要的组件渲染、优化SQL查询、使用缓存和调整服务器设置等方法,本书帮助开发者显著提升Wicket应用的性能,确保其在高并发和数据密集型场景下的稳定性和响应速度。
47 0
|
3月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
79 0
|
18天前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
50 9
|
1月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
1月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具
下一篇
无影云桌面