🎉尤雨溪为什么要推出Vapor Mode🎉

简介: 🎉尤雨溪为什么要推出Vapor Mode🎉


💎前情提要

在前面两篇文章中反复提到了不同框架编译之后的差异

  • 🚀 React编译之后是Jsx函数返回的虚拟DOM
  • 🚀 Vue编译之后是render函数返回的虚拟DOM
  • 🚀 SolidJS编译之后返回的真实DOM字符串
  • 🚀 Svelte编译之后返回的是真实DOM片段

React由于架构机制决定了每当状态发生改变,从当前组件开始一直到叶子组件重新加载。

Vue由于给每个组件建立了watchEffect监听机制,每当组件依赖的状态发生改变,当前组件重新加载。

SolidJSSvelte由于在编译之后就确定了当状态发生改变UI随之变化的关系,所以仅仅是具体DOM的重新加载。

根据这些不同的更新粗细粒度,他们被分为

粒度 成员
粗粒度 React
中粒度 Vue
细粒度 SolidJSSvelte

💎直观感受

为了直观感受更新时的区别,现在我们设计如下关系的组件:

GrandFather
    Father
      |
    Child

每个组件的背景色都是随机的,并且在Father组件中,实现了一个Count功能。

我们用四个框架分别实现。下面只给出一个例子。

生成随机颜色:

`#${(~~(Math.random()*(1<<24))).toString(16)}`

Father组件如下:

// Father.jsx
import React, { useState } from 'react'
const Father = () => {
  const [count, setCount] = useState(0)
  const onClick = () => setCount(count => count ++)
  return (
    <div style={{ display: "flex" }}>
      <div
        onClick={() => onClick()}
        style={{
          height: 100,
          width: `40vw`,
          background: `#${(~~(Math.random() * (1 << 24))).toString(16)}`,
        }}
      >
        {count}
        <Child />
      </div>
      <div
        onClick={() => onClick()}
        style={{
          height: 100,
          width: `40vw`,
          background: `#${(~~(Math.random() * (1 << 24))).toString(16)}`,
        }}
      ></div>
    </div>
  )
}
export default Father

接下来,我们看看他们在触发onClick时的不同表现吧。

🚀 React

🚀 Vue

🚀 Svelte

🚀 SolidJS

🚀 结论

上面的图中,可以直观的看到:

React在当前组件状态发生变化时,从当前组件开始,包括子组件都被重新加载了。

Vue仅仅是当前组件重新加载。

SolidJSSvelte仅仅是重新加载组件!

💎总结

在项目比较小时,SolidJSSvelte的优势不会很明显,

但是当面对大型项目时,ReactVue的性能短板就显露出来了。

面对这样的压力,尤雨溪在年初的展望里已经预告了Vapor mode,该模式的灵感就是受到了SolidJS的启发。

它可以在给定相同的Vue SFC前提下,与当前基于虚拟DOM的输出相比,Vapor Mode将其编译成性能更高、使用更少内存且需要更少运行时支持代码的JavaScript输出。

对于React由于架构机制的限制,目前很难做出根本性的改变,

对于开发者,我们可以选择手动优化。例如,将组件使用memo包裹起来。

const Child = memo(() => <Comp>your comp</Comp>)

此时上面的例子中,React的效果更新效果就和Vue类似了。

我们为了演示每次dom都是重新加载的,所以样式是直接这样写的。

background: `#${(~~(Math.random() * (1 << 24))).toString(16)}`

在实际开发中,要尽量避免无意义的重复计算,尤其React中,比如:

// bad
<Comp
  style={
    margin: window.screen.width / 3 * 2
  }
/>
// good
const App = () => {
  const margin = useMemo(() => window.screen.width / 3 * 2, [])
  return <Comp style={ margin } />
}
// bettter
const margin = window.screen.width / 3 * 2
const App = () => {
  return <Comp style={ margin } />
}

好了今天的分享就到这了,文章中如果出现问题,有劳各位大佬指正!


相关文章
|
存储 安全 算法
Qt QSet 详解:从底层原理到高级用法
Qt QSet 详解:从底层原理到高级用法
1732 0
|
5月前
|
人工智能 安全 Java
Spring AI 核心架构解析:构建企业级 AI 应用的 Java 新范式
Spring AI 为 Java 开发者提供企业级 AI 应用新范式,通过分层架构、统一抽象(如 ChatClient、PromptTemplate)与 Spring 生态深度集成,支持 RAG、函数调用、流式响应等核心功能,实现安全、可观测、可维护的智能系统构建。
1400 8
|
5月前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:十、开箱即见 Gradio:大模型的“魔法画布”,让每一个想法清晰可见
Gradio是一个快速构建机器学习演示界面的Python库,能够将需要数天开发工作的模型展示缩短为几分钟的脚本编写。它通过简单的Python代码即可生成完整的Web应用界面,支持文本、图像、音频等多种交互组件,适用于模型展示、教学演示和原型测试等场景。文章详细介绍了Gradio的核心功能、基础语法和组件使用方法,并通过情感分析和聊天机器人两个实际案例展示了如何快速部署AI模型交互界面。Gradio大幅降低了将模型转化为可交互应用的门槛,使开发者能更专注于模型本身而非界面开发。
1109 7
|
7月前
|
安全 物联网 API
Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 9 月更新)
Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 9 月更新)
869 1
Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 9 月更新)
|
虚拟化 Windows
Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 2 月更新)
Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 2 月更新)
517 4
Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 2 月更新)
|
监控 Ubuntu 安全
debian或Ubuntu中开启ssh允许root远程ssh登录的方法
在Debian或Ubuntu系统中启用root用户的SSH远程登录需要编辑SSH配置文件、设置root密码并重启SSH服务。虽然这可以在某些情况下提供便利,但必须注意安全性,通过使用强密码、限制IP访问、使用SSH密钥认证等方法来保护服务器的安全。
6860 5
|
安全 新能源
碳捕获与封存技术:减排的有效途径
【9月更文挑战第29天】全球气候变化日益严峻,碳捕获与封存技术(CCS)作为减排新兴技术,通过捕集、运输和封存三个环节,有效减少二氧化碳排放。本文详细探讨了CCS的技术原理、应用前景及挑战,指出其在减缓气候变化、促进低碳经济和多样化场景中的重要作用,并提出了技术成熟度提升、成本降低及安全性监管等方面的解决方案。
|
资源调度 前端开发 JavaScript
1500+免费html模板,建站神器
【5月更文挑战第6天】
903 3
|
Java API Nacos
通过 Python+Nacos实现微服务,细解微服务架构
`shigen`是一名擅长多种编程语言的博主,致力于分享技术成长和认知。他尝试将Python服务构建为微服务架构,模仿Java领域的微服务设计。通过Nacos服务发现和注册,实现了Python Flask应用的微服务化,包括网关、用户中心、鉴权和文档服务。代码示例展示了服务注册、心跳维持、HTTP接口以及网关的代理和认证逻辑。此实现促进了服务安全调用,增强了对数据的保护。通过这种方式,`shigen`揭示了Python+Nacos实现微服务的细节,鼓励读者深入理解微服务工作原理。
1350 0
通过 Python+Nacos实现微服务,细解微服务架构
|
监控 Java 数据库连接
Java一分钟之-JDBC连接池:HikariCP, Apache DBCP, C3P0
【6月更文挑战第14天】本文介绍了Java中常用的三种JDBC连接池——HikariCP、Apache DBCP和C3P0。HikariCP以其高性能和低延迟领先,适合高并发环境;Apache DBCP稳定易配置;C3P0则提供高度可定制选项。文章讨论了各连接池的常见问题及避免策略,如配置不当、连接泄露等,并给出示例代码以供参考。选择合适的连接池并正确配置能有效提升应用性能。
713 7