从框架之争到技术收敛:我为什么开始尝试用 Rust 写前端

151 阅读7分钟

几年前,前端社区还是一片“阵营之争”的热土:

  • React 阵营坚信 JSX 是天才般的设计,但反对者骂它是“HTML 与 JS 的怪胎混合物”。
  • Angular 阵营追求强类型与全家桶方案,被 Vue 粉丝嫌弃“太笨重”。
  • Vue 阵营自诩中庸之道,既好上手又足够灵活。

那时候,社区里最热闹的事,就是在语言特性、架构理念、生态工具等方面互相调侃甚至“挖苦”。 然而时间走到 2025 年,你可能会惊讶地发现:这些框架的使用体验越来越像,有时候切到一个新框架,连 API 风格都能无缝迁移。

这种收敛不是偶然,而是多种因素共同作用的结果——技术演化、性能瓶颈、开发者需求以及工具链生态,正在把前端世界推向同一个方向。


一、状态管理的统一战线:Signals 模式的崛起

在所有收敛趋势中,响应式状态管理的变化最为明显。

过去的做法: 早期的 React 基于虚拟 DOM diff,更新状态后会重新执行组件树中受影响的节点,导致级联重渲染。Vue 2.x 虽然有细粒度依赖追踪,但实现方式与 React 不同;Angular 则依赖 Zone.js 遍历所有绑定。

如今的转向: Signals 模式逐渐成为各家青睐的方案。它是一种显式依赖追踪模型——状态变化时,只更新直接依赖它的视图或计算,不会重跑整个渲染流程。

当前支持情况:

  • Angular 16+:官方内置 Signals API
  • Svelte 5:编译器层基于 Signals,但对开发者透明
  • SolidJS / Qwik / Preact Signals:早期信号派代表
  • Lit 3:Google 将信号引入 Web Components
  • Vue 虽然没用“Signal”这个名字,但 ref + effect 本质相同
  • React 目前是“例外”,但其新 Compiler 的目标之一是减少无谓重执行,与 Signals 思路相通

信号模式能统一江湖的原因:

  • 性能:避免级联渲染,提高交互流畅度

  • 实现简单:底层可高度复用,不依赖虚拟 DOM

  • 心智模型清晰:依赖链可视化,调试直观

  • 跨端好处明显:更新粒度小,在 Electron、React Native 等跨平台环境中更稳定


二、组件化理念的完全一致

早期的差异:

  • Angular 有“指令”,模板与逻辑相对分离
  • React 从一开始就推崇组件函数/类,逻辑与视图混写
  • Vue 保持 HTML/CSS/JS 分离,用单文件组件(SFC)组织

如今的共识:

  • Props 下行:数据自上而下流动
  • 事件上行:通过回调或事件冒泡通知父组件
  • 生命周期钩子:在特定阶段执行逻辑
  • 逻辑复用:Hooks、Mixins、Composable 等

这意味着跨框架迁移的成本大幅下降——从 Vue 转到 React,你只需适应 JSX 和 Hook 语法,而非重新学习架构。


三、服务器优先渲染(Server-First)的回归

渲染模式的演变经历了三个阶段:

  1. 早期:以服务器端渲染(SSR)为主
  2. SPA 兴起:渲染逻辑全部搬到客户端
  3. 现代回潮:服务器优先渲染,客户端按需水合(Partial Hydration)

代表性实践有 Next.js、Nuxt、SvelteKit、Astro,以及 Angular 实验分支。

好处显而易见:

  • 首屏更快,减少白屏时间

  • JS 传输量更小

  • 对 SEO 友好


四、文件路由成为事实标准

过去的路由需要手动引入组件、写映射规则;Next.js 推出的基于文件系统的路由直接用目录结构映射路径,如今几乎被各家采纳(SvelteKit、Nuxt、Astro、Remix 等)。

优点:约定优于配置,减少出错,还让目录结构天然成为协作文档。


五、性能优化策略趋同

无论用哪个框架,优化套路基本一致:

  • 代码切割(Code Splitting)
  • 懒加载(Lazy Loading)
  • 摇树优化(Tree Shaking)
  • 图片多尺寸与延迟加载
  • CLI 或插件内置优化提示

这让跨框架迁移几乎不需要重新学习性能调优。


六、开发体验(DX)的军备竞赛

各家在 DX 上的配置越来越相似:

  • HMR(热模块替换)
  • TypeScript 一等公民
  • CLI 工具统一项目流程
  • 浏览器调试插件

在这种模式下,本地环境的稳定性直接影响 DX。例如,我常用的 ServBay 就能一键搭建 Node、PHP、数据库等服务,对于跨语言全栈开发非常顺畅。


七、编译器之战

2024 年 React 推出 Compiler,目标是编译阶段减少无用渲染;Svelte 5 的 Runes API 则直接基于信号实现响应式。未来竞争重点可能是:

  • 自动性能优化

  • 更细粒度的代码生成

  • 多目标输出(Web、Native、WASM)


八、从收敛到探索:我试着用 Rust 写前端

在看到框架越来越像的同时,我也在思考——如果它们差异不大,那能不能直接跳出 JS 体系?

有一次刷到 Reddit 上一个程序员的帖子:

“I hate JS. I’ve done the HTML and CSS, but I’m stuck. I want to use Rust instead.”

我特别有共鸣。写了多年 JS,类型系统松散、调试体验一般、构建工具动不动出错,让我越来越疲惫。于是我开始尝试:用 Rust + WebAssembly 写前端。


Rust 前端的可行性

原理很简单:Rust 可以编译成 WebAssembly(.wasm),浏览器就能直接运行。

目前有几款主流框架:

  • Yew:成熟度较高,风格像 React
  • Dioxus:支持多端(Web、桌面、移动)
  • Sycamore:性能取向,有点像 Rust 版 SolidJS

构建工具包括:

  • wasm-pack:生成 npm 包

  • trunk:类似 Vite,支持热重载和打包

  • cargo-leptos:配合 Leptos 框架使用


开发体验:稳定但门槛高

  • 学习成本:Rust 本身曲线陡,加上 WASM 调试工具不够完善,你需要额外掌握不少知识。
  • 性能亮点:在数据密集型场景(表格、图形可视化)中,Rust + WASM 表现优异,甚至在一些 benchmark 中超过 React。
  • 构建与调试:生态虽在进步,但构建过程容易踩坑。

我用 ServBay 搭配 Trunk,把 Dioxus 构建成静态文件,再用 ServBay 一键跑 HTTPS 本地调试,不用手配 nginx,非常省心。在折腾 Rust + WASM 过程中,我发现构建流程是最容易踩坑的部分——要同时配好构建工具、静态文件服务器、HTTPS 证书,有时候光配环境就能耗掉半天。这也是我开始使用servbay的契机,本来它是给 PHP、Node 这种全栈环境准备的,但其实拿来做 WASM 项目的本地开发也很合适。


适用场景

✅ 适合:

  • 数据密集型工具(图表、仪表盘)
  • 嵌入式 Web UI
  • Rust 全栈项目

❌ 不适合:

  • 快节奏协作项目(调试和交接成本高)

  • 重动画、强交互页面(JS 生态更丰富)

  • 重依赖现成 JS UI 组件的系统


未来展望

WebAssembly 正在不断完善:

  • Interface Types 提案将简化与 JS 的交互
  • GC 支持 让直接操作 DOM 成为可能
  • Rust 框架文档和社区活跃度持续提升

我相信在 2-3 年内,Rust 会从“好玩”走向“可选”,并在特定领域成为主流方案。


九、总结

前端框架的收敛,让开发者更容易跨生态工作,也让人有机会跳出原有工具链的限制,探索像 Rust + WASM 这样的新路径。

我的建议是:

  • 理解通用模式(Signals、组件化、SSR、文件路由)比死记 API 更重要
  • 关注工具链(Vite、TS、ESLint、ServBay 等)让你在任何框架下都能高效工作
  • 勇于尝试新技术,哪怕只是做个原型,也能帮你评估它的潜力

或许几年后,写前端的方式会比今天更加多元化,而我们要做的,就是提前适应这种变化。