性能比较:React vs WebForms Core

发布: (2026年2月22日 GMT+8 06:11)
10 分钟阅读
原文: Dev.to

Source: Dev.to

概述

关注网络请求、带宽消耗和客户端执行模型

在现代 Web 架构中,性能不仅仅关乎渲染速度。一个关键因素是 与服务器的通信模式以及传输数据的量

本文严格从性能和网络的角度比较 ReactWebForms Core (WFC),重点关注:

  • 初始请求次数
  • 次级请求次数
  • 初始下载大小
  • 交互过程中的带宽消耗
  • 客户端执行模型
  • React 需要构建步骤和 JSX
  • WFC 中的 HTML 结构处理

注意: 这不是一般的优缺点比较——它是一项技术性、架构层面的性能分析。

1️⃣ 初始加载阶段

React

在典型的 React 应用中会发生以下情况:

  • 下载一个 JavaScript 包(通常是数百 KB 到数 MB)
  • 下载 React 运行时
  • 执行 hydration 或挂载
  • 通过 JavaScript 生成 DOM

即使在经过优化的项目中,你通常会看到:

  • 一次 初始 HTML 请求
  • 多次 JS 请求(bundle、runtime、vendor chunk)
  • CSS 和其他资源

结果

观察
📦初始负载通常更大
🌐初始请求数量更多
初始渲染依赖于 JavaScript 执行

WebForms Core

在 WFC 中,服务器发送标准的 HTML 页面。可选地会添加一个轻量级的 WebFormsJS 文件,但没有庞大的 bundle,也不需要强制的构建流水线

在最简单的情况下:

  • 一次 HTML 请求
  • 一次 小体积 JS 请求(如果使用 WebFormsJS

结果

观察
📦初始负载更小
🌐初始请求更少
页面在 JS 执行前已经包含可用的 HTML

2️⃣ 用户交互

场景 A – 纯客户端交互

WFC 示例(KeyUp 无服务器调用)

// Server side
public void PageLoad(HttpContext context)
{
    WebForms form = new WebForms();

    form.SetCommentEvent("TextBox1", HtmlEvent.OnKeyUp, "keyup");
    form.StartIndex("keyup");
    form.SetBackgroundColor("TextBox1", Fetch.GetValue("TextBox1"));

    Write(form.ExportToHtmlComment());
}

服务器输出(发送给客户端)

执行模型

Event → Direct DOM manipulation
指标
请求0
二级带宽0

React 等价实现

function App() {
  const [color, setColor] = useState("");

  return (
    <input
      onChange={e => setColor(e.target.value)}
      style={{ backgroundColor: color }}
    />
  );
}

执行模型

Event → setState → Virtual DOM diff → Patch DOM
指标
请求0
二级带宽0

观察

  • React 维护状态,执行 virtual‑DOM 差异计算,并触发重新渲染周期。
  • WFC 使用服务器端状态引擎,不进行 差异算法,直接更新 DOM。
  • 对于简单交互,WFC 的 CPU 开销更低。

场景 B – 与服务器交互

React

// Typical form submission
fetch("/api/contact", {
  method: "POST",
  body: data
});

标准 SPA 模式

  1. AJAX 请求
  2. JSON 响应
  3. 状态更新
  4. 重新渲染

在更大的应用中,这会扩展为:

  • 多个 API 端点
  • 并行请求
  • 轮询或 WebSocket 连接

React 应用通常是 API 驱动 的,这意味着需要频繁的服务器通信。

WebForms Core

WFC 保持传统表单模型:

POST → server → INI‑style response → DOM patch

服务器响应(紧凑的指令)

[web-forms]
sd(button)=1
nt=h3
bc=green
st=Message

仅发送已更改的部分;不返回完整的 HTML,也不传输庞大的 JSON 状态树。

结果: 带宽消耗低于完整页面重新加载,且通常比 API 密集的 SPA 响应更轻。

3️⃣ 实际应用中的请求模式

React(SPA 模式)

  • 一次性下载大型 bundle
  • 随后会有数十甚至数百次 API 调用
  • 完全依赖后端 API

收益: 无需完整页面刷新
成本: 持续的 API 依赖和网络通信

WebForms Core

两种可能的模式:

  1. 纯客户端交互 – 无服务器调用。
  2. 轻量级往返表单交互 – 仅传输必要的指令。

在许多简单 UI 场景中 不需要服务器请求。在数据驱动的情况下,调用次数 通常少于 API 密集的 SPA,且交互方式是基于表单而非端点驱动。

4️⃣ 带宽消耗

方面ReactWebForms Core
初始下载大(bundle)小(HTML + 可选的微型 JS)
仅客户端交互0 KB(无网络)0 KB(无网络)
服务器交互JSON + 状态更新紧凑的指令命令
API 依赖可选(仅在需要时)

5️⃣ JSX 和 构建需求

React

  • 构建过程几乎是必需的

    • JSX 必须被转译(Babel、TypeScript 等)
    • 模块需要打包(Webpack、Vite 等)
    • 在构建时会进行优化(tree‑shaking、压缩等)
  • HTML 写在 JavaScript 中 → UI 结构依赖运行时执行。

  • 没有 JavaScript,什么也不会渲染。

WebForms Core

  • HTML 仍然是标准的,没有 JSX
  • 没有强制性的构建步骤——页面可以直接由服务器提供。
  • 视图是独立的且可以完整检查。
  • 服务器逻辑与标记分离。

6️⃣ Development Model Perspective

React

  • UI = function(state) – UI 是应用状态的纯函数。
  • 状态通常保存在客户端(或通过全局存储)。
  • 开发者以组件、hooks 和不可变更新的方式思考。

WebForms Core

  • UI = server‑driven description – 服务器发出一个轻量级的描述,说明客户端应如何变化。
  • 状态驻留在服务器端;客户端仅接收增量指令。
  • 开发者使用熟悉的 HTML + 服务器端事件绑定,类似经典 WebForms,但采用现代轻量协议。

TL;DR

功能ReactWebForms Core
初始负载大型捆绑包小型 HTML(+ 可选的微型 JS)
加载时的请求数量多个(HTML + JS + CSS)一个(HTML) + 可选的微型 JS
纯客户端交互0 请求,但有虚拟 DOM 的 CPU 开销0 请求,直接更新 DOM
服务器往返交互JSON API 调用(通常很多)紧凑的指令(少量且体积小)
构建步骤必需(JSX → JS,打包)非必需
HTML 可检查性仅在 JS 运行后渲染立即可见
典型使用场景匹配功能丰富、高度交互的 SPA,拥有众多独立数据源以表单为中心或交互适度的页面,接受服务器端状态

两种方法各有适用场景;选择取决于项目的网络预算、延迟容忍度和架构偏好

驱动

  • 重新渲染驱动
  • 以数据为中心的架构

WebForms Core

  • UI = HTML
  • 行为 = 命令
  • 事件驱动
  • 基于命令的执行

7️⃣ 最终技术概述

如果评估严格关注网络和带宽:

React

  • 更大的初始负载
  • API 密集型交互模型
  • 客户端状态引擎

WebForms Core

  • 更小的初始负载
  • 能够在无需服务器调用的情况下运行
  • 紧凑的指令式服务器响应
  • 不需要差分引擎

网络与结构行为概述

React and WebForms Core Performance Comparison

结论

React 代表一种完整的 SPA 架构,拥有客户端状态引擎,需要打包、构建流水线以及大量的 API 使用。

WebForms Core 代表一种混合模型,可以:

  • 完全在客户端运行
  • 使用紧凑的指令进行最小带宽通信
  • 避免复杂的客户端状态引擎
  • 消除强制性的构建流水线

从网络和带宽的角度

  • WebForms Core 在传统的以表单为中心的应用中往往更轻量。
  • React 在大型、API 驱动的应用中提供更强的数据流控制。
0 浏览
Back to Blog

相关文章

阅读更多 »

停止在 Rails 中错误使用 .any?

介绍:传递给 .any? 的单个块可能会在不发出警告或错误的情况下,悄悄将成千上万条记录加载到内存中——仅仅是产生不必要的对象。大多数 Rails 开发者……