Web 前端技术演进全景 · 框架版本史与横向对比

从 1990 年第一个网页到 2026 年的信号(Signals)与服务端组件时代——本文档系统梳理前端三十余年的范式变迁、八大主流框架逐版本演进时间轴、各自模块生态详解,以及一份可用于技术选型的横向对比矩阵。

  • 36 年 — 1990 — 2026
  • 8 大时代 — 范式分期
  • 12 个框架 — 逐版本时间轴
  • 150+ — 关键版本节点
  • 2026-09 — 数据核实时点

阅读约定:时间标注为「稳定版首次发布(GA)」时间;标注 预览 表示 Developer Preview / Beta;EOL 表示官方已停止支持。正文中出现的字面 HTML 标签均已转义,可安全阅读源码。

1 全景时间轴:1990 — 2026

一条主线:把运行时该做的事,尽量挪到编译时和服务端去做。三十余年前端史,就是这条主线不断推进的历史——从拼字符串、到操作 DOM、到虚拟 DOM、到绕过虚拟 DOM、再到把组件直接放到服务端执行。

1.1 一图看懂三十六年

在这里插入图片描述

1.2 关键节点速查表

前端史上 40 个关键节点(按时间排序,标 ★ 为范式级转折点)

时间事件类别为什么重要
1990.12首个网页与浏览器诞生(Tim Berners-Lee)基础HTML + HTTP + URL 三件套确立
1993—1996HTML 1.0 → CSS1 → 早期 DOM标准结构、表现、行为开始分离
1995.05★ JavaScript 发布(Brendan Eich,10 天写成)语言浏览器终于有了可编程能力
1996CSS1 成为 W3C 推荐标准标准样式独立成层
1998DOM Level 1 标准化标准JS 操作文档有了统一模型
1999XMLHttpRequest 随 IE5 引入能力异步通信的物理基础
2001JSON 提出(Douglas Crockford)数据取代 XML 成为主流传输格式
2004Gmail / Google Maps 发布产品证明了「浏览器可以做桌面应用」
2005.02★ AJAX 一词被 Jesse James Garrett 命名范式Web 2.0 元年,局部刷新成为常态
2006.08★ jQuery 发布(John Resig)终结浏览器兼容地狱,统治近十年
2006Sass 发布样式CSS 开始具备编程能力
2008.12Google Chrome + V8 引擎发布引擎JS 性能提升一个数量级,催生 Node
2009.03★ Node.js 发布(Ryan Dahl)运行时JS 走出浏览器,前端工程化成为可能
2010npm 发布基建包管理成为生态分发中枢
2010.07—10Knockout、Backbone、AngularJS 相继发布框架MV* 时代开启,前端有了架构
2011Bootstrap、Ember.js 发布;Browserify 出现生态UI 组件化与模块化打包起步
2012.10TypeScript 发布(Microsoft)语言大型前端项目的类型化基础
2012—2013★ Grunt / Gulp / Webpack 出现工程构建从「手工拼接」变为「依赖图打包」
2013.05★ React 开源(JSConf US)框架虚拟 DOM + 单向数据流 + 组件化
2014.02Vue.js 首次公开框架渐进式框架的起点
2015ES6 / ES2015 定稿;Redux 发布;React Native 开源标准+生态现代 JS 语法基础 + 状态管理 + 跨端
2015Rollup 发布(Tree Shaking / Scope Hoisting)工程库打包进入 ESM 时代
2016.09—10Angular 2 正式发布;Vue 2.0 发布;Next.js 发布框架三大框架格局形成,元框架登场
2017.09React 16(Fiber 架构)框架可中断渲染,并发特性的地基
2018Vue CLI 3;Angular 6/7;Flutter 1.0生态脚手架标准化,跨端竞争加剧
2019.02React 16.8 Hooks 稳定框架函数组件成为主流,类组件退场
2019.05Angular 8 引入 Ivy 预览;Tailwind CSS 发布框架+样式渲染引擎换代 + 原子化 CSS 兴起
2020.09★ Vue 3.0(Proxy 响应式 + Composition API)框架响应式系统与逻辑复用范式重构
2020★ Vite 发布;esbuild / Snowpack 兴起工程开发态不再打包,原生 ESM 直出
2021Pinia 成为 Vue 官方推荐;SvelteKit 发布生态状态管理换代,编译型框架补齐元框架
2022.03React 18(并发渲染 + Suspense SSR)框架并发特性正式落地
2022—2023Signals 复兴:Solid、Preact Signals、Angular 16 Signals 预览范式细粒度响应式成为跨框架共识
2023.11Angular 17(独立组件默认 + 内置控制流)框架Angular 现代化的转折点
2024.09—12Vue 3.5、Svelte 5 GA(Runes)、★ React 19(Actions + RSC)框架服务端组件与显式响应式同时到来
2025.05—11Angular 20/21(Zoneless 默认)、Next.js 16(Turbopack + Cache Components)、Qwik 2框架去 Zone.js、去 Babel、可恢复性落地
2025.12React2Shell 漏洞(CVE-2025-55182,CVSS 10.0)安全RSC 时代的安全面扩大,推动框架安全流程化
2026.02★ React Foundation 成立(隶属 Linux 基金会)治理React 脱离 Meta 单一治理
2026.03—06Vite 8(Rolldown 统一内核)、Rspack 2.0、Angular 22工程+框架Rust 工具链成为主流,Signals 全面稳定
2026.07★ Vue 3.6:Vapor Mode 生产可用,虚拟 DOM 成为可选项框架主流框架正式拥抱「编译到原生 DOM」
2026AI 编码代理成为一等用户:框架内置 MCP / Agent Skills范式工具链开始为 AI 而非仅为人设计

一句话总结三十六年:1990s 拼字符串 → 2000s 操作 DOM → 2010s 虚拟 DOM 与组件化 → 2020s 把工作前移到编译期与服务端。每一代都不是被「淘汰」,而是被「下放」到更小的适用场景里。

2 八大时代:每个时代解决了什么,又败在哪里

理解演进的关键不是记住版本号,而是理解每一代技术在什么复杂度下失效。下面按时代拆分,给出「技术特征 → 代表技术 → 致命缺陷 → 继承者」四段式。

时代一 · 静态页面与服务端模板(1990—2004)

技术特征:浏览器只是文档渲染器。服务端用 CGI / ASP / PHP / JSP / Servlet 拼接 HTML 字符串,浏览器整页刷新。JavaScript 只做表单校验、弹窗、跑马灯这类边缘交互。

HTML 1.0→4.01 · CSS 1/2 · DOM Level 1 · PHP 3/4 · ASP / JSP · Perl CGI

致命缺陷:任何一次数据变更都要整页回传;用户体验割裂;服务端承担全部渲染压力;IE 与 Netscape 的 API 差异让 JS 写起来像在猜谜。

继承者:XMLHttpRequest + Gmail 模式(AJAX)。

时代二 · AJAX 与 jQuery 王朝(2005—2012)

技术特征XMLHttpRequest 让页面可以局部刷新,Web 应用形态诞生。jQuery 用统一的链式 API 抹平浏览器差异,并提供选择器、事件、动画、AJAX 四件套。同期 Prototype、MooTools、YUI、Dojo 竞争,最终 jQuery 胜出。

jQuery 1.0(2006.08) · JSON 普及 · Sass(2006) · Chrome/V8(2008) · Node.js(2009) · npm(2010) · Bootstrap(2011)

致命缺陷:jQuery 只是「DOM 操作的语法糖」,不提供状态与视图的关系模型。应用一大,必然出现「上千个选择器 + 交织的事件回调」——状态散落在 DOM 属性、全局变量、隐藏字段里,改一处要手动同步 N 处,即所谓「面条代码」。

继承者:MV* 框架(Backbone / Knockout / AngularJS)引入数据绑定与结构约定。

时代三 · MV* 群雄割据(2010—2015)

技术特征:前端第一次有了「架构」概念。三种路线并行:Backbone(MVP,最小结构,靠事件手动同步)、Knockout(MVVM,observable + 双向绑定)、AngularJS(MVC + 双向绑定 + 依赖注入 + 指令,最完整也最重)。同期 Ember 走「约定优于配置」。

Backbone 2010.10 · Knockout 2010.07 · AngularJS 2010.10 · Ember 2011 · Meteor 2012 · Marionette

致命缺陷双向绑定 + 脏检查在大列表下性能塌陷。AngularJS 的 $digest 循环需要反复遍历全部 watcher 直到稳定,watcher 过两千就明显卡顿;调试时不知道「谁改了谁」;SEO 与首屏仍是难题。

继承者:React 的单向数据流 + 虚拟 DOM,以及后来的 Vue。

时代四 · 组件化与虚拟 DOM 革命(2013—2016)

技术特征:React 提出两个核心命题——UI 是状态的函数UI = f(state))与虚拟 DOM。开发者只描述「目标 UI 长什么样」,框架负责计算最小 DOM 变更。JSX 让「结构 + 逻辑」同处一文件,组件成为复用单元。Vue 2 引入虚拟 DOM 与单文件组件(SFC),Angular 2 用 TypeScript 彻底重写。

React 0.3(2013.05) · Vue 0.8(2014.01) · Angular 2(2016.09) · Redux(2015) · Vue 2(2016.09) · Next.js(2016.10) · Webpack 1(2014)

里程碑意义:这是现代前端的「范式确立期」。之后十年所有框架的争论(Hooks vs Composition API、类 vs 函数、可变 vs 不可变),都在这个范式内部进行。

遗留问题:虚拟 DOM 需要运行时 diff 开销;SPA 首屏白屏与 SEO;状态管理样板代码爆炸。

时代五 · 工程化大爆发与元框架崛起(2016—2020)

技术特征:框架本身趋于稳定,战场转移到周边工程化。TypeScript 成为默认、Webpack 配置成为一门手艺、Babel 处理语法降级、ESLint/Prettier 统一风格、Jest/Cypress 补齐测试。元框架(Next.js、Nuxt、Gatsby、Sapper)用 SSR/SSG 解决 SPA 的首屏与 SEO。

React 16 Fiber(2017) · Hooks(2019.02) · Angular Ivy(2019 预览 / 2020 默认) · Vue CLI 3(2018) · Nuxt(2016→2.x) · Gatsby 2 · Flutter(2018)

致命缺陷:工具链复杂度失控——一个中台项目动辄 200MB 依赖、冷启动 3 分钟、「配置工程师」成为岗位。开发体验成为新的瓶颈。

继承者:以 Vite 为代表的原生 ESM + Go/Rust 原生工具链。

时代六 · 原生速度工具链与编译型框架(2020—2023)

技术特征:两条并行的「减法」路线。其一是构建提速:esbuild(Go)证明瓶颈在于实现语言而非算法,Vite 干脆在开发态不打包;其二是运行时瘦身:Svelte 把组件编译为命令式 DOM 操作代码,Solid 用细粒度信号直接更新节点,二者都没有虚拟 DOM

Vite 1/2(2020—2021) · esbuild(2020) · Vue 3(2020.09) · Svelte 3(2019)/ SvelteKit(2021) · Solid 1.0(2021) · Astro(2021) · Qwik(2022) · Vite 4/5

核心命题:既然模板是静态可知的,为什么还要在运行时构造虚拟 DOM 树再 diff?答案是:不需要。这直接催生了 2026 年 Vue 的 Vapor Mode。

时代七 · 服务端优先与 Signals 共识(2023—2025)

技术特征:两股力量合流。Signals(信号)成为跨框架共识——Angular 16 引入 Signals、Preact 推出 Signals、Solid 一直是信号模型、Vue 3.6 用 alien-signals 重写响应式内核、TC39 也在推进 Signals 标准化提案。服务端优先则是另一股力量:React Server Components 让组件默认在服务端执行,只把交互部分下发到客户端。

Angular 16 Signals 预览(2023.05) · Next.js 13→15 App Router · React 19(2024.12) · Svelte 5 Runes(2024.10) · Angular 19/20 Zoneless · Nuxt 3→4 · Astro 5 Server Islands

副作用:服务端边界带来了新的安全面。2025 年 11—12 月,React Server Components 连续曝出 CVE-2025-55182(CVSS 10.0 远程代码执行)、CVE-2025-55184/67779(DoS)与 CVE-2025-55183(源码泄露),修复版本为 19.0.1 / 19.1.2 / 19.2.1 及后续补丁——这是「能力上移服务端」必须支付的代价。

时代八 · AI 原生与工具链 Rust 化收敛(2026—)

技术特征:三个确定性趋势。①构建内核统一到 Rust:Vite 8 以 Rolldown 作为统一打包内核替代「esbuild + Rollup」双引擎,Rolldown 1.0 于 2026 年 5 月稳定,Rspack 2.0 于 2026 年 4 月发布。②框架主动适配 AI 代理:Next.js 将浏览器日志转发到终端、提供 MCP 集成与 Agent DevTools;Angular 22 的 MCP 工具链进入稳定;生态重心正从 MCP 转向 Agent Skills。③去中心化治理:React 于 2026 年 2 月 24 日正式归入 Linux 基金会下的 React Foundation,Qwik 2 从 Builder.io 转向独立社区治理。

Vite 8(2026.03) · Rolldown 1.0(2026.05) · Rspack 2.0(2026.04) · Angular 22(2026.06) · Vue 3.6 Vapor(2026.07) · Next.js 16.3(2026.08) · TS 7.0 Go 编译器

尚未定型:AI 生成代码对框架 API 设计的影响才刚开始;Remix 3 已宣布脱离 React、转向 Web 平台微包 + 命令式 this.update(),主张「为 LLM 时代减负」——这是一个值得关注但尚未验证的方向。

3 框架族谱:三条技术路线的分化

今天所有主流框架都可以归入三条路线。理解了路线差异,版本演进的细节就有了坐标系。

在这里插入图片描述

3.1 三条路线的取舍速览

路线对比(2026 年视角)

维度虚拟 DOM 派编译型 / 信号派服务端优先 / 岛屿派
代表React 19、Vue 3(传统模式)、PreactSvelte 5、Solid、Vue 3.6 Vapor ModeRSC / Next.js 16、Astro 5、Qwik 2
更新粒度组件级重渲染 + diffDOM 节点级精确更新取决于岛屿内所用框架
首屏 JS较大(需下发运行时)小(无运行时或极薄)极小(理论接近 0,Qwik 实测 2—4KB)
心智负担中(需理解 memo / 依赖数组,Compiler 后可省)低—中(依赖自动追踪,但需理解信号边界)高(服务端/客户端边界、序列化规则)
生态成熟度最高中(Svelte 上升快,Solid 仍小众)取决于基座框架(Next 高,Qwik 低)
典型适用复杂交互应用、需要大量现成组件性能敏感、体积敏感、嵌入式组件内容站、电商、营销页、SEO 敏感
2026 状态仍是主流,靠 Compiler 自动优化补足Vue 官方下场,路线被主流认可内容站已成默认,应用端仍在探索

重要澄清:三条路线并非互斥。2026 年的现实是「组合使用」——Next.js 16 用 RSC 做服务端、客户端岛屿里跑 React;Astro 5 默认零 JS、岛屿里可以放 Svelte 或 Solid;Vue 3.6 允许同一应用中 Vapor 组件与传统组件混用。路线之争已经从「选哪条」变成「在哪里用哪条」。在这里插入图片描述

4 jQuery 与 MV* 先驱:jQuery / Backbone / Knockout / Ember

这一代已经退出新项目舞台,但它们是理解现代框架的钥匙——Redux 的单向数据流是对 Backbone 事件链的反思,Vue 的响应式是 Knockout observable 的进化,Angular 的依赖注入继承自 AngularJS。

4.1 jQuery:统治近十年的 DOM 抽象层

作者 / 首次发布

John Resig,2006 年 8 月 26 日发布 1.0

核心理念

Write less, do more —— 用选择器选中元素,然后链式调用操作它

历史地位

终结浏览器兼容地狱;贡献了链式调用、事件委托、Deferred/Promise 三大模式

当前状态

维护中但仅安全与兼容修复;新项目不再推荐,存量站点依然海量

版本演进时间轴
  • 2006.08 · 1.0 — 首个稳定版。选择器 + 事件 + 动画 + AJAX 四件套确立,链式 API 成型。

  • 2007.01 / 09 · 1.1 / 1.2 — 事件系统重写、选择器性能大幅提升,插件生态开始爆发。

  • 2009.01 · 1.3 —— Sizzle 引擎 — 引入独立选择器引擎 Sizzle,支持复杂 CSS3 选择器;live() 事件委托登场,为动态列表提供方案。

  • 2010.01 · 1.4 — 大量 API 增强与性能改进,jQuery.Deferred 雏形出现,异步编程开始有范式。

  • 2011.01 · 1.5 —— Deferred 重写 AJAX$.ajax() 全面重构为 Deferred 对象,成为后来 Promise 标准化的重要实践来源。

  • 2011.11 · 1.7 —— 统一事件 APIon() / off() 取代 bind/live/delegate,成为事件绑定的唯一推荐写法,至今仍是 jQuery 代码的标准形态。

  • 2013.04 · 2.0 —— 砍掉旧 IE — 放弃 IE 6/7/8 支持,体积更小、性能更好。1.x 分支继续为旧浏览器提供兼容,形成「1.x 兼容 / 2.x 现代」双线。

  • 2013.01 · 1.9 —— 清理包袱 — 移除 $.browser 等废弃 API,引入 $.migrate 插件辅助平滑升级。

  • 2016.06 · 3.0 —— Promise/A+ 合规 — Deferred 兼容 Promise/A+ 规范,可与原生 Promise 互操作;动画改用 requestAnimationFrame;$.Deferred 异常行为修正。3.x 统一了 1.x/2.x 双线。

  • 2017—2020 · 3.2 / 3.3 / 3.4 / 3.5 — 持续安全加固:3.5 修复 HTML 预加载导致的 XSS 风险;逐步去除对老旧环境的特殊处理。

  • 2021—2023 · 3.6 / 3.7 — 当前维护线。3.7(2023.05)聚焦错误修复与浏览器兼容,无新特性,标志 jQuery 进入「长期维护」阶段。

模块组成(jQuery 核心分包)

jQuery 源码按功能模块划分(可用自定义构建裁剪)

模块职责代表性 API
Core核心对象构造、工具入口、版本与冲突处理jQuery() / $() · noConflict() · each() · extend()
Selector(Sizzle)独立 CSS 选择器引擎,可被单独抽取复用find() · filter() · not() · :visible 等伪类
Attributes属性与 property 的统一读写attr() · prop() · val() · removeAttr()
CSS样式读写、类名操作、尺寸计算css() · addClass() · width() · innerHeight()
Dimensions / Offset元素与视口的位置计算,处理滚动与盒模型差异offset() · position() · scrollTop()
ManipulationDOM 增删改与移动,含 HTML 字符串解析append() · before() · html() · wrap() · clone()
Traversing在 DOM 树上下游走parent() · children() · siblings() · closest()
Events跨浏览器事件绑定、委托、命名空间与自定义事件on() · off() · trigger() · one() · proxy()
Effects动画队列与缓动animate() · fadeIn() · show() · stop() · queue()
Ajax封装 XMLHttpRequest,含 JSONP、预过滤器与转换器$.ajax() · $.get() · $.post() · $.getJSON()
Deferred / Callbacks异步流程控制,Promise/A+ 兼容(3.0+)$.Deferred() · $.when() · $.Callbacks()
Data / Queue把数据挂到元素上(避免内存泄漏)、任务队列data() · removeData() · queue() · dequeue()
Utilities通用工具函数$.trim() · $.isArray() · $.param() · $.parseJSON()
jQuery UI独立项目交互行为 + 部件(Widget)工厂 + 主题系统draggable · dialog · datepicker · sortable · Widget Factory
jQuery Mobile已停更早期移动端 UI 框架,后被响应式 + 原生框架取代pages · listview · touch events

为什么 jQuery 会被取代:它没有回答「状态变了,界面该怎么跟着变」。开发者必须手动 $('#count').text(count) 同步每一处,一旦状态与 DOM 的映射关系变多,同步逻辑就会失控。现代框架用「声明式渲染」把这件事交给框架,这正是它们存在的理由。

4.2 Backbone.js:最小结构化的第一次尝试

作者 / 首次发布

Jeremy Ashkenas(Underscore/CoffeeScript 作者),2010 年 10 月

核心理念

只提供最小骨架(Model / Collection / View / Router),其余自由发挥

依赖

硬依赖 Underscore.js;可选依赖 jQuery(用于 View 的 DOM 操作与 AJAX)

历史意义

第一次让前端有了「模型—视图—同步」的分层,直接启发了后续所有框架的数据流设计

当前状态

事实停更(1.6.x 之后无实质更新),仅存量项目使用

Backbone 模块构成

模块职责说明
Events自定义事件混入(mixin)可混入任意对象,提供 on/off/trigger/listenTolistenTo 解决「忘记解绑」的内存泄漏
Model数据实体 + 属性变更事件get/set 强制走访问器(不能直接改属性),变更时触发 change
Collection有序模型集合内置排序、过滤、批量操作与集合级事件
ViewDOM 与模型的胶水层约定 el / render() / events 哈希;不含模板引擎与数据绑定,需手动 render
Router + History基于 hash 或 pushState 的前端路由SPA 路由的早期标准形态
SyncRESTful 持久化抽象save/fetch/destroy 映射为 POST/GET/DELETE,可整体替换为 localStorage 适配器

致命短板:View 层完全靠手写 render() 与事件监听,代码量随组件数量线性膨胀,社区因此诞生了 Marionette、Chaplin 等补充框架——这本身就说明 Backbone 抽象不足。

4.3 Knockout.js:MVVM 与 observable 的先行者

作者 / 首次发布

Steve Sanderson(Microsoft),2010 年 7 月

核心理念

MVVM + 声明式绑定 + 依赖自动追踪

关键贡献

ko.observable() / ko.computed() 的自动依赖收集,是今天所有 Signals 实现的直接祖先

当前状态

维护中但基本停止演进(3.5.x),存量企业系统使用

核心模块
  • observable:包装原始值为可观察对象,读写都走函数调用
  • observableArray:数组版 observable,跟踪增删改
  • computed / pureComputed:自动收集依赖并缓存,依赖变更才重算
  • Binding Handlerstext / value / foreach / if / visible / click 等 DOM 指令
  • Template Binding:内建模板引擎,可做条件与循环渲染
  • Components:3.2+ 引入自定义元素与组件化(对标后来的 Web Components)
为什么没赢
  • API 繁琐:所有读写都要加括号 count() / count(1)
  • 依赖追踪靠运行时黑魔法,调试困难
  • 没有组件级别的编译优化,大列表性能一般
  • 被 AngularJS 的完整方案与后来 Vue 的优雅 API 双向挤压

4.4 Ember.js:约定优于配置的工程化先驱

起源

源自 SproutCore 2.0,2011 年 12 月更名 Ember.js(Yehuda Katz、Tom Dale 主导)

核心理念

约定优于配置、完整的官方全家桶、向后兼容性承诺极强

关键创新

Glimmer 渲染引擎(2017 起)、稳定的六周发布节奏、Ember CLI 与 Ember Data

现状

小众但稳定;2025 年完成了构建系统向 Vite 的迁移,说明老牌框架仍在现代化

  • 2011 · SproutCore 2.0 → Ember.js — 从 Apple 的 SproutCore 分叉,主打「给野心勃勃的 Web 应用」的完整框架。
  • 2013.08 · Ember 1.0 — API 冻结,建立著名的「不破坏升级」承诺与 RFC 驱动的演进流程。
  • 2015.08 · Ember 2.0 — 移除 Views,全面转向组件化;引入 Glimmer 渲染引擎雏形,性能大幅改善。
  • 2017 · Glimmer VM — 引入字节码级别的渲染虚拟机,把模板编译成可增量更新的操作码,是当时最激进的编译优化。
  • 2018.02 · Ember 3.0 — 移除大量废弃 API,引入模块化的新 API 命名空间,明确以 Editions(版本集)方式推进。
  • 2019.12 · Octane(3.13+) — 现代 Ember 的分水岭:原生类语法、Glimmer 组件、tracked 属性(@tracked 细粒度追踪),开发体验焕然一新。
  • 2021—2023 · 4.x / 5.x — 持续精简:移除 jQuery 依赖、默认严格模式、Embroider 新构建体系推进。
  • 2024—2025 · 6.x — 构建层完成向 Vite 的迁移,与主流工具链并轨;Ember 成为「老牌框架和平现代化」的样本。

Ember 全家桶模块

模块职责
Ember CLI脚手架与构建,现代前端 CLI 的早期范本(ng-cli / vue-cli 都受其影响)
Ember Router嵌套路由,URL 与组件树严格对应,是其最强设计之一
Ember Data官方 ORM 式数据层:Model / Adapter / Serializer / Store / Identity Map
Glimmer渲染引擎与组件模型,模板编译为增量更新的字节码
Ember Octane 语法@tracked / @glimmer/component / 装饰器体系
Ember Inspector浏览器调试扩展,组件树与数据检查
Embroider新一代构建系统,基于 Webpack/Vite 的标准打包模型

Ember 的真正遗产:它证明了「框架提供官方全家桶 + 严格向后兼容 + RFC 驱动演进」这条路可行。今天 Angular 的发布节奏、Vue 的 RFC 流程、Next.js 的渐进式迁移策略,都能看到 Ember 的影子。

5 Angular:从脏检查到无 Zone 的信号时代(2010 — 2026)

Angular 是唯一经历了「彻底重写」的主流框架:2010 年的 AngularJS(JavaScript + 脏检查)与 2016 年的 Angular 2+(TypeScript + 组件)是代码库完全不同、仅共享名字的两个框架。2026 年的 Angular 22 完成了第二次「内部重写」——用 Signals 取代 Zone.js 驱动的变更检测。

5.1 AngularJS(1.x):成也双向绑定,败也双向绑定

作者

Miško Hevery 与 Adam Abrons;2010 年 10 月发布,后由 Google 接手

核心理念

用 HTML 扩展(指令)描述应用,双向数据绑定 + 依赖注入

EOL

2021 年 12 月 31 日停止支持(商业第三方延长支持服务存在)

AngularJS 1.x 关键版本

版本时间要点
1.0.02012.06首个稳定版,双向绑定、指令、依赖注入、路由、表单校验确立
1.2.x2013.11引入 ngRepeat 的 track by、动画钩子、控制器 as 语法
1.3.x2014.10一次性绑定 :: 缓解 digest 压力;表单 API 增强;移除 IE8 支持
1.4.x2015.05路由器重构、动画模块独立、大量内部重构
1.5.x2016.02引入 component() 与单向绑定 <,为向 Angular 2 迁移铺路;生命周期钩子
1.6.x2016.12默认禁用 $http 的 JSONP 回调检查;继承 ngModelOptions 改进
1.7.x2018.07主要为安全修复与升级友好度改进
1.8.x2020.06最终主线版本,官方明确「仅作为迁移过渡」
AngularJS 核心模块
  • Scope / $digest:双向绑定的心脏,脏检查循环
  • Directive:自定义 HTML 标签与属性,指令优先级与 transclude
  • 依赖注入$injector,按参数名推断(后被压缩破坏,需显式注解)
  • Service / Factory / Provider:三类不同的可注入定义方式
  • Filter:模板内数据格式化
  • $http / $resource:HTTP 与 REST 抽象
  • ngRoute / ui-router:路由(后者为社区事实标准,支持嵌套视图)
  • $q:Promise 实现
为什么必须重写
  • 脏检查不可扩展:watcher 数量上千后 digest 循环明显卡顿
  • Scope 继承是陷阱:原型链继承导致赋值覆盖问题,催生「always use a dot」教条
  • 变更来源不可知:任何异步回调都可能触发全量检查,无法做精确优化
  • 不支持服务端渲染与移动端:这套模型无法被静态化或预编译
  • TypeScript 浪潮:2015 年后大型项目全面转向类型化,JS 版难以承接

5.2 Angular 2 — 22:十六年、二十一个大版本

Angular 采用严格的时间驱动发布:2016—2025 年间约每 6 个月一个大版本(在 v21 之前),每个大版本提供 18 个月支持(6 个月活跃 + 12 个月 LTS)。自 Angular 22(2026.06.03)起改为 12 个月一个大版本,每个版本获得约 24 个月支持。发布节奏固定、向后兼容、ng update 自动迁移,是 Angular 对企业用户最核心的承诺——但也意味着升级必须逐个大版本依次进行,不可跳版

Angular 2 — 22 完整版本表(含支持状态,截至 2026 年 9 月)

版本发布时间支持状态标志性变化
Angular 22016.09.14EOL彻底重写:TypeScript 优先、组件化架构、新渲染管线。因破坏性过大引发巨大争议
Angular 42017.03.23EOL跳过 v3(版本号对齐路由包);AOT 编译改进、体积减小;4.3 引入 HttpClient(基于拦截器的现代 HTTP 客户端)
Angular 52017.11.01EOLBuild Optimizer、PWA 支持、Material 改进
Angular 62018.05.04EOLng update / ng add 登场,CLI Workspaces 多项目管理;Angular Elements(Web Components)实验
Angular 72018.10.18EOLCDK 虚拟滚动与拖拽、CLI 交互式提示、Bundle Budget
Angular 82019.05.28EOL差分加载(differential loading)、路由动态 import 懒加载、Web Worker;Ivy 渲染引擎可选预览
Angular 92020.02.06EOLIvy 成为默认编译与渲染引擎:包更小、构建更快、调试更友好
Angular 102020.06.24EOL生态打磨:Material 日期范围选择器、更严格的 TS 配置
Angular 112020.11.11EOLWebpack 5 实验支持、HMR 改进、字体自动内联
Angular 122021.05.12EOL弃用 IE11 支持,为现代浏览器特性让路
Angular 132021.11.04EOL彻底移除 View Engine 渲染器,Ivy 成为唯一引擎;动态组件创建 API 简化
Angular 142022.06.02EOLStandalone Components 开发者预览(不再强制 NgModule)、严格类型化表单、CDK 新原语
Angular 152022.11.18EOLStandalone API 转稳定、Directive Composition API(指令组合)、NgOptimizedImage
Angular 162023.05.03EOLSignals 开发者预览(signal / computed / effect)、非破坏性 hydration、esbuild 开发构建;移除 ngcc
Angular 172023.11.08EOL现代化转折点:Standalone 成为 CLI 默认、内置控制流 @if/@for/@switch@defer 延迟加载、新文档站、@angular/ssr
Angular 182024.05.22EOL实验性 Zoneless 变更检测、SSR 改进、TS 5.4;HttpClientModule 弃用
Angular 192024.11.19EOL 2026.05指令/组件/管道默认 standalone;linkedSignalresource() 异步 API;增量 hydration
Angular 202025.05.28LTS 至 2026.11.28effect() / linkedSignal() / toSignal() 转稳定Zoneless 在 20.2(2025.08.20)转稳定httpResource();CLI 默认不再生成组件后缀
Angular 212025.11.19LTS 至 2027.06新项目默认不带 zone.js;Signal Forms 实验性;Vitest 成为默认测试运行器;Angular Aria 开发者预览(首个 12 个月周期前的大版本)
Angular 222026.06.03ActiveSignal Forms、Angular ARIA、异步响应 API(resource() 系列)全部转稳定;OnPush 成为新组件默认;MCP 工具链稳定;新增 @Service 装饰器与异步依赖注入;Webpack 构建器弃用

升级红线ng update 仅支持一次跨越一个大版本。从 19 升到 22 必须依次执行 19→20→21→22 三次升级,每次验证并提交。Angular 19 及更早版本自 2026 年 5 月起已停止安全补丁,仍停留在这些版本的项目应视为安全义务尽快升级。

5.3 Angular 的响应式模型演进(四代)

  • 2010—2016 · 第一代:脏检查(AngularJS)$digest 循环反复遍历所有 watcher 直至值稳定,最坏情况需要多轮全量遍历。复杂度与 watcher 数量成正比。
  • 2016—2022 · 第二代:Zone.js + 自上而下检查 — Zone.js 通过 monkey-patch 全部浏览器异步 API(setTimeout、事件、XHR、Promise)来「感知可能的变更」,然后从根组件向下检查整棵组件树。配合 OnPush 策略可剪枝。问题是:Zone 本身有体积与性能成本,且补丁行为难以预测。
  • 2023—2025 · 第三代:Signals 细粒度响应式(v16 预览 → v20 稳定)signal() 知道哪些模板位置读取了它,更新时只重绘相关绑定,无需遍历组件树。computed() 惰性缓存、effect() 处理副作用、linkedSignal() 处理「可重置的派生状态」。
  • 2025—2026 · 第四代:Zoneless(v20.2 稳定 → v21 默认 → v22 全面) — 移除 zone.js 依赖,变更通知变为显式:信号被读/写、输入被设置、事件处理器触发时直接标记脏。收益:包体积下降、错误更可预测、与原生浏览器 API(含 async/await)无冲突代价。

5.4 Angular 模块(Package)全景

Angular 是「开箱即用的平台」而非库——路由、表单、HTTP、测试、CLI 全部官方提供且版本同步,这是它与 React 最本质的区别。

@angular/ 官方包职责详解*

定位核心内容与关键 API
@angular/core内核(必选)组件/指令/管道装饰器、依赖注入容器、Signalssignal/computed/effect/linkedSignal/resource)、生命周期钩子、变更检测(ChangeDetectorRef、OnPush)、NgZone@defer@Service(v22)
@angular/common通用能力HttpClientcommon/http,含拦截器)、内置指令与管道(DatePipeCurrencyPipe 等)、NgOptimizedImage、Location 与国际化基础设施
@angular/forms表单响应式表单FormControl/FormGroup/FormArray + 严格类型)、模板驱动表单ngModel)、校验器、Signal Forms(v22 稳定)
@angular/router路由路由配置与懒加载、守卫(CanActivate 等函数式守卫)、Resolver、路由级代码分割、v22 起集成浏览器 Navigation API
@angular/platform-browser浏览器平台应用引导(bootstrapApplication)、DOM 渲染器、hydration 支持
@angular/platform-server / @angular/ssr服务端渲染SSR、预渲染(prerender)、增量 hydration、HTTP 传输缓存
@angular/animations动画声明式状态转场动画,与 Web Animations API 对接
@angular/cdk组件开发套件无样式的行为原语:Overlay、DragDrop、Virtual Scroll、Table、A11y 工具、剪贴板、文本字段
@angular/materialUI 组件库基于 CDK 的 Material Design 实现,含主题系统;企业级中后台常用
@angular/aria(v22 稳定)无障碍组件提供符合 ARIA 规范的无样式组件与指令,把无障碍能力下沉为框架级默认
@angular/cli命令行与构建ng new/generate/serve/build/test/update;esbuild + 应用构建器;Schematics 代码生成;v22 起 MCP 工具链稳定(供 AI 编码代理调用)
@angular/elements互操作把 Angular 组件打包为原生自定义元素(Web Components)
@angular/localize国际化编译期内联 i18n 消息、多语言包
@angular/service-workerPWAService Worker 集成与更新策略
RxJS第三方但深度集成响应式编程Observable 贯穿 HTTP、表单、路由;toSignal() / toObservable() 提供与 Signals 的双向桥接

2026 年的 Angular 是什么样:写起来已经很「像 React」——独立组件、内置控制流、Signals 管理状态、Vitest 测试;但它仍保留着框架级强约束:官方路由、官方表单、官方 HTTP、官方 DI、官方 CLI、官方升级路径。这正是它在金融、政企、大型后台等「多人长期维护」场景中的价值所在。

6 React:从虚拟 DOM 到服务端组件(2011 — 2026)

React 的核心命题只有一句:UI 是状态的函数。围绕这句话,它用十三年时间依次解决了「怎么更新 DOM」(虚拟 DOM)、「怎么让更新可中断」(Fiber)、「怎么复用逻辑」(Hooks)、「怎么减少不必要的重渲染」(Compiler)、「怎么少发 JS 到浏览器」(RSC)。

6.1 React 版本演进时间轴

  • 2011 · 内部诞生 — Jordan Walke 开发的 FaxJS 原型首先部署在 Facebook News Feed;2012 年用于 Instagram。
  • 2013.05.29 · 0.3.0 —— JSConf US 开源 — 在 JSConf US 上首次公开发布。核心概念:虚拟 DOM、JSX、单向数据流。初期因「把 HTML 写进 JS」饱受质疑。
  • 2013—2014 · 0.4 — 0.12 快速迭代 — 0.4 支持注释节点与 key prop;0.8 改善内存;0.9 扩充属性与事件支持;0.11 改进 SVG;0.12 引入 spread 运算符 {...props},取消 @jsx 注解要求,支持 ES6 类写法。
  • 2015.03 · 0.13 —— 官方支持 ES6 Class — 组件可写成 class Foo extends React.Component,混入(mixin)开始被淘汰。
  • 2015.10 · 0.14 —— react 与 react-dom 拆分 — 渲染层独立为 react-dom,为 React Native 与自定义渲染器(react-reconciler)打开大门。
  • 2016.04.07 · 15.0 —— 语义化版本 — 版本号从 0.x 跳到 15 以示生产可用性;改用 document.createElement 渲染,移除多余的 span 包裹,SVG 支持完善。15.3 引入 PureComponent
  • 2017.09.26 · 16.0 —— ★ Fiber 架构重写 — 内部渲染算法彻底重写:把渲染拆成可中断、可恢复、可分优先级的小单元(fiber)。语法不变,但为后来所有并发特性奠定基础。同时引入 Error Boundaries、Portals、Fragment、自定义 DOM 属性。
  • 2018.03 · 16.3 —— 新 Context API — 取代实验性的旧 Context;引入 createRefforwardRef;开始弃用 componentWillMount/ReceiveProps/Update(为异步渲染准备)。
  • 2018.10 · 16.6 —— Suspense / lazy / memo — 代码分割与「声明式等待」首次亮相;React.memo 提供函数组件的记忆化。
  • 2019.02.06 · 16.8 —— ★ Hooks 稳定useState / useEffect / useContext / useReducer / useMemo / useCallback / useRef 发布。类组件迅速退场,逻辑复用从 HOC / Render Props 转向自定义 Hook,这是 React 生态最大的一次范式迁移。
  • 2020.10.20 · 17.0 —— 「桥接版」 — 官方定位为没有新特性的版本,唯一目的是让升级更平滑:新的 JSX 自动运行时(react/jsx-runtime,不再需要 import React)、事件委托从 document 改到 root 容器,使多版本 React 可共存。
  • 2022.03.29 · 18.0 —— ★ 并发渲染 — 并发渲染器正式可用:createRoot、自动批处理(Automatic Batching)、useTransitionuseDeferredValueuseId、Suspense 支持流式 SSR。同时放弃 IE 11 支持。18.3(2024.04)只加弃用警告,为 v19 铺路。
  • 2024.12.05 · 19.0 —— ★ Actions 与服务端组件 — React 历史上「最大而全」的一次发布:Actions(用异步函数处理状态更新,自动管理 pending / error / 乐观更新)、useActionStateuseFormStatususeOptimistic、新 use() API、React Server Components 稳定、ref 作为普通 prop、支持在组件内渲染文档元数据(title/meta/link)、样式与异步脚本的原生支持。React Compiler 同期进入 Beta。
  • 2025.03—10 · 19.1 / 19.2 —— 打磨与并发增强 — 19.1 带来 Owner Stacks(更好的错误溯源)与 Suspense 行为修正;19.2 引入 View TransitionsuseEffectEvent()<Activity> 组件,并随 Next.js 16 一起成为全栈默认配置。
  • 2025.10 · Meta 宣布捐赠 React — Meta 宣布将 React、React Native 与 JSX 捐赠给 Linux 基金会下设的 React Foundation。2026 年 2 月 24 日基金会正式成立,React 脱离单一公司治理。
  • 2025.11—12 · RSC 安全事件(React2Shell) — 11 月 29 日披露 CVE-2025-55182(CVSS 10.0 远程代码执行);12 月 11 日追加 CVE-2025-55184/67779(DoS,7.5)与 CVE-2025-55183(源码泄露,5.3)。修复版本为 19.0.1 / 19.1.2 / 19.2.1,后续补丁回移至 19.0.3 / 19.1.4 / 19.2.3。RSC 把执行面搬上服务端,安全边界随之改变——这是所有服务端优先框架的共同课题。
  • 2026 · React Compiler 普及 + React 20 Beta — Compiler 从实验走向默认:自动追踪依赖并在编译期完成 useMemo/useCallback 级别的记忆化,开发者不再手写依赖数组。Rust 移植版被上游采纳,Bun 于 2026 年 6 月率先内置到 bun build--react-compiler),Next.js/Turbopack 使用 SWC 实现,Vite 8 仍走 Babel 插件。React 20 已进入 Beta。

6.2 官方包与运行时模块

React 官方包职责(区分「你直接 import 的」与「工具链用的」)

包 / 模块类型职责与关键 API
react核心(运行时)组件模型与 Hooks:useState/useEffect/useMemo/useCallback/useRef/useContext/useReducer/useTransition/useDeferredValue/useOptimistic/useActionState/use()memolazySuspenseActivityStrictModestartTransition、Context
react-domDOM 渲染器react-dom/clientcreateRoot/hydrateRootflushSync;事件系统;Portal;react-dom/serverrenderToPipeableStream/renderToReadableStream(流式 SSR)
react/jsx-runtime编译产物v17 引入的自动 JSX 运行时,由编译器自动引入,源码中通常无需手写
react-reconciler自定义渲染器Fiber 协调器的通用实现,React Native、react-three-fiber、ink(命令行 UI)等均基于此构建
react-serverRSC 运行时服务端组件序列化、「飞行协议」(flight protocol)编解码、'use client'/'use server' 指令处理
react-is工具判断元素/组件类型,供库作者做类型分派
react-refresh开发工具HMR 的 Fast Refresh 运行时,Vite/Turbopack 插件依赖它
react-devtools调试组件树、Props/State 检查、Profiler 火焰图
eslint-plugin-react-hooks静态检查强制 Hooks 调用规则与依赖项完整性;Compiler 时代转为「规则合规性检查」
babel-plugin-react-compiler工具链编译器React Compiler 的官方 Babel 实现;另有 SWC 版(Next.js 用)与 Rust 版(Bun 用)
React Native跨端用同一套组件模型渲染原生 iOS/Android 视图;新架构(JSI/Fabric/TurboModules)已稳定

6.3 React 的四次心智模型跃迁

① 类组件 → 函数组件 + Hooks(2019)

从「生命周期时间轴」思维(mount/update/unmount)转向「同步与副作用」思维(渲染 → 提交 → 副作用)。难点在于依赖数组与闭包陷阱。

② 同步渲染 → 并发渲染(2022)

渲染不再是不可打断的原子操作。紧急更新(输入)可打断非紧急更新(列表渲染),useTransition 让「可中断」成为开发者可控制的 API。

③ 手动优化 → 编译器优化(2024—2026)

React Compiler 自动分析组件依赖并插入记忆化,useMemo/useCallback/memo 从「必写」变成「可省」。代价是必须遵守编译器可分析的规则(不可变数据、不在条件中调用 Hook 等)。

④ 客户端渲染 → 服务端组件(2024—2026)

组件默认在服务端执行,可直接访问数据库、不下发 JS;只有标记 'use client' 的部分才进入浏览器包。心智负担最高的一次跃迁,也是争议最大的一次。

6.4 React 生态地图(官方只给核心,其余自取)

React 生态常见选型(2026 年主流组合)

能力主流选择说明
元框架Next.js 16 / React Router 7 / TanStack StartNext 占主导;React Router 7(Remix 团队)适合需要完全掌控的场景;TanStack Start 主打类型安全路由
路由React Router 7 / TanStack Router两者均支持类型安全的路由定义与数据加载
服务端状态TanStack Query请求缓存、失效、重试、乐观更新的事实标准
客户端状态Zustand / Jotai / Redux Toolkit新项目多倾向 Zustand(轻量)与 Jotai(原子化);Redux Toolkit 在大型存量项目仍广泛使用
表单React Hook Form + Zod非受控 + schema 校验,性能与类型体验俱佳
样式Tailwind CSS / CSS Modules / Panda CSSRSC 环境下 CSS-in-JS(styled-components/emotion)受限,编译期方案更受青睐
UI 组件shadcn/ui + Radix / MUI / Ant Designshadcn/ui 因「可复制源码」模式成为新宠;国内中后台常用 Ant Design
动画Framer Motion(motion)声明式动画与布局过渡
测试Vitest + Testing Library / PlaywrightAngular 转向 Vitest 后,Vitest 已成为前端测试的共同底座

选型提示:React 的最大优势与最大成本同源——它只提供渲染,其余全靠组装。这意味着团队在第一周就要决定路由、状态、数据、表单、样式五件事。对有经验的团队这是自由,对缺乏架构约定的团队这是技术债的起点。

7 Vue:渐进式框架的自我革命(2013 — 2026)

Vue 的独特之处在于它主动推翻了自己两次:2.0 引入虚拟 DOM 重写渲染层,3.0 用 Proxy 重写响应式,3.6 又用 Vapor Mode 让虚拟 DOM 变成可选项。每一次都做到了「尽量不破坏用户代码」——这是 Vue 在中小企业中长期受欢迎的根本原因。

冷知识:Vue 每个大版本都有一个内部代号,取自漫画/动画作品,且首字母按字母表顺序排列——Evangelion(1.0)→ Ghost in the Shell(2.0)→ Hunter × Hunter(2.1)→ One Piece(3.0)→ Pluto(3.1)→ Quintessential Quintuplets(3.2)→ Rurouni Kenshin(3.3)→ Slam Dunk(3.4)→ Tengen Toppa Gurren Lagann(3.5)。

7.1 Vue 版本演进时间轴

  • 2013.07 · 源码首提交(代号 Seed) — 尤雨溪(Evan You)在 Google 工作期间参与 AngularJS 项目后,希望「抽出 Angular 中喜欢的部分,做一个真正轻量的东西」。
  • 2013.12 · 0.6 —— 更名 VueJS — 0.7(12.24)、0.8(2014.01,首次公开)、0.9 Animatrix(2014.02)、0.10 Blade Runner(2014.03)、0.11 Cowboy Bebop(2014.11)、0.12 Dragon Ball(2015.06)持续完善数据绑定与指令系统。
  • 2015.10.27 · 1.0 Evangelion —— 组件体系确立 — 完整的组件复用机制、生命周期、过滤器、过渡动画。无虚拟 DOM,性能有限,适合中小型页面。
  • 2016.09.30 · 2.0 Ghost in the Shell —— ★ 虚拟 DOM 时代 — 引入虚拟 DOM、渲染函数、单文件组件(SFC)、服务端渲染支持;响应式基于 Object.defineProperty。配套 Vue Router、Vuex、Vue CLI 陆续成型,中国市场迅速普及。
  • 2017—2019 · 2.1 — 2.6 —— 生态爆发 — 2.5 改进 SSR 与 TypeScript 支持;2.6(2019.02)引入 v-slot 统一插槽语法与错误捕获。Element UI、iView、Ant Design Vue 等国内组件库集中涌现;Weex、uni-app 打开跨端路径。
  • 2020.09.18 · 3.0 One Piece —— ★ 彻底重构 — 响应式从 defineProperty 换成 Proxy(支持数组与动态属性);引入 Composition API;源码改为 Monorepo 并支持 Tree-shaking;原生 TypeScript 编写;新增 Fragment / Teleport / Suspense;性能与体积显著改善。
  • 2021.06—08 · 3.1 Pluto / 3.2 —— <script setup> 稳定 — 3.2 是 Vue 3 真正走向主流的版本:<script setup> 编译宏转稳定、性能优化、Web Components 支持。同期 2.7(2022.07)把 Composition API 反向移植回 Vue 2,降低迁移成本。
  • 2023.05 · 3.3 Rurouni Kenshin —— TypeScript 体验质变 — 改进 SFC 类型推导、支持导入外部类型的 Props 声明、泛型组件、简化 defineProps/defineEmits 语法。
  • 2023.12.28 · 3.4 Slam Dunk —— 解析器与响应式双重提速 — 模板解析器完全重写(约 2 倍提速)、响应式系统重构(computed 更精确)、defineModel 转稳定、v-bind 同名简写。
  • 2023.12.31 · Vue 2 正式 EOL — Vue 2(含 2.7)停止维护。调查显示 2025 年仍有约 35% 的受访者在过去一年用过 Vue 2.7,迁移是 Vue 生态长期痛点。
  • 2024.09.01 · 3.5 —— 响应式 Props 解构Reactive Props Destructure(解构 props 不丢响应式)、惰性 hydrationuseId()useTemplateRef()、SSR 改进与内存优化。
  • 2026.07 · 3.6 —— ★ Vapor Mode 生产可用 — 两大核心:alien-signals 响应式内核重写(依赖追踪从运行时移到编译期,官方基准称吞吐提升显著、内存占用下降)与 Vapor Mode 编译策略(模板直接编译为 DOM 操作指令,完全跳过虚拟 DOM)。可在组件级通过 <script setup vapor> 启用,与传统组件混用,生态工具零改动。

7.2 Vue 3 Monorepo 模块全景

Vue 3 源码包划分(理解这层结构,才能理解 Vapor Mode 改了哪里)

层次职责
@vue/reactivity响应式内核ref / reactive / computed / watch / watchEffect / effectScope;3.6 起底层替换为 alien-signals——把依赖收集从「运行时 Proxy 拦截」改为「编译期静态分析 + 精确信号链路」。可脱离组件独立使用
@vue/runtime-core与平台无关的运行时组件实例与生命周期、虚拟 DOM 与渲染器抽象、Props/Emits/Slots、provide/inject、内置组件(Teleport / Suspense / KeepAlive / Transition)、调度器
@vue/runtime-dom浏览器运行时DOM 渲染器实现、内置指令(v-model / v-show / v-on 等)、事件与属性补丁
@vue/compiler-core编译核心模板 → AST → 渲染函数的通用编译流程,含转换插件体系与静态提升
@vue/compiler-domDOM 编译针对浏览器平台的指令与模块编译(Vapor Mode 的编译优化主要落在这里)
@vue/compiler-sfcSFC 编译解析 .vue 单文件、<script setup> 编译宏、v-bind() in CSS、CSS 变量注入、SFC 类型推导
@vue/compiler-ssrSSR 编译把模板编译为服务端可执行的字符串拼接函数
@vue/server-rendererSSR 运行时流式 SSR、hydration 匹配与失配处理、惰性 hydration(3.5+)
vue整合入口把运行时与编译器打包为完整构建(vue/dist/vue.esm-bundler.js 等),日常使用的就是这个包
vue-router官方路由4.x 支持组合式 API、动态路由、路由守卫、数据加载器;Nuxt 4.4 起内部已切换到 Vue Router v5
pinia官方状态管理Vuex 的继任者:无 mutations、天然 TS 友好、按 store 拆分、devtools 集成
vuex上一代状态管理自 2023 年起进入维护模式,新项目官方推荐 Pinia
@vitejs/plugin-vue构建集成Vite 的 Vue SFC 插件;Vue 3.6 + Vite 8 需搭配 plugin-vue 6.x
Vue DevTools调试v6 起支持 Vue 3;3.6 版本加入了 AI 代码审查,可检测 Composition API 误用

7.3 Vapor Mode:Vue 对「虚拟 DOM 是否必要」的官方回答

传统模式(虚拟 DOM)

模板 → 渲染函数 → 每次更新构造新的 VNode 树 → 与旧树 diff → 计算 patch → 应用 DOM 变更。

开销:VNode 对象创建(内存分配 + GC 压力)、递归 diff(CPU)、patch 计算。在高频更新场景(大表格、实时面板、复杂图表)尤为明显。

Vapor Mode(编译到 DOM)

模板在编译期被分析,直接生成形如 effect(() =&gt; { p.textContent = count.value }) 的 DOM 操作代码。运行时没有 VNode 树、没有 diff、没有 patch

收益:官方基准显示首次渲染、内存占用、包体积均有明显改善(社区报道分别在 15—50%、约 20%、15—40% 区间,取决于场景)。

Vapor Mode 采用建议

场景建议理由
1000+ 行的大型列表 / 表格优先启用跳过 VDOM 收益最大,diff 成本与行数正相关
高频更新的实时数据面板优先启用每秒多次更新时,VNode 创建与调度开销被放大
普通表单 / 内容页可启用收益一般但基本无副作用
动态组件 / 复杂插槽暂缓动态性越强,编译期静态分析收益越低
依赖 VDOM 特有写法的组件需改造部分依赖渲染函数 / VNode 操作的代码需要迁移,官方提供兼容性检查工具

Vue 3.6 的战略意义:它是主流框架中第一个「官方把虚拟 DOM 变为可选项」的。这等于承认了 Svelte 与 Solid 路线的正确性,同时保留了渐进式迁移——老项目升级版本号即可获得响应式性能提升,无需改任何代码。

7.4 Vue 生态地图

Vue 生态常见选型

能力主流选择说明
元框架 / SSRNuxt 4底层已从 Webpack 切换到 Rspack + Lightning CSS,构建速度较 Nuxt 3 显著提升;Nuxt 5 将随 Nitro v3 稳定而到来
静态站点VitePress基于 Vite 的文档站生成器,Vue 官方文档即用此构建
路由 / 状态vue-router 4 / Pinia官方套件,版本与 Vue 核心同步
工具函数VueUse200+ 组合式函数,事实标准
桌面端 UIElement Plus / Ant Design Vue / Naive UI / PrimeVueElement Plus 在国内中后台最常见;Naive UI 的 TS 体验好;Vuetify 走 Material 规范
跨端uni-app / Taro一套 Vue 语法编译到 H5、微信/支付宝小程序、iOS/Android
测试Vitest + @vue/test-utils与 Vite 共享配置,无需维护独立 Babel/Jest 体系

8 Svelte:把框架编译掉(2016 — 2026)

Svelte 的口号是「框架在构建时消失」——它不做运行时 diff,而是把组件编译成直接操作 DOM 的命令式代码。2024 年的 Svelte 5 用 Runes 把「编译器的魔法」变成「开发者显式声明」,是这一路线最重要的一次转向。

8.1 Svelte 版本演进时间轴

  • 2016.11 · Svelte 1 —— 「编译器而非框架」 — Rich Harris(Ractive.js 作者、纽约时报图形记者)发布。核心理念:框架应该是编译产物的一部分,而不是随应用一起发布的运行时。此时语法与 Ractive 类似,用 {{#if}} 等 mustache 风格模板。
  • 2018.04 · Svelte 2 —— 语法现代化 — 模板语法向更简洁的方向调整,减少冗余语法糖;但整体仍是小众项目。
  • 2019.04.22 · Svelte 3 —— ★ 反应式声明与真正的出圈 — 彻底重写。三件事让它爆红:①反应式声明 $: doubled = count * 2(借用了 JS 标签语句语法);②store 提供跨组件状态;③零运行时开销 + 极小产物。同年首次进入 State of JS 满意度前列。
  • 2020—2021 · Sapper → SvelteKit — 原官方应用框架 Sapper 停止演进,由 SvelteKit 接棒(2021 年进入公开测试),提供文件系统路由、SSR、适配器部署。
  • 2022.12 · SvelteKit 1.0 — 正式稳定,标志 Svelte 补齐了「元框架」这块关键拼图,可用于生产级全栈应用。
  • 2023.06.22 · Svelte 4 —— 内部现代化 — 定位为「维护版」:产物体积更小(约减少 10—20%)、hydration 更快、内部代码库升级到现代 TS,为 Svelte 5 铺路。用户 API 基本不变。
  • 2024.10.19 · Svelte 5 GA —— ★ Runes 响应式 — 自 Svelte 3 以来最大变化:Runes(符文)取代隐式响应式。let count = 0 不再自动响应,必须写 let count = $state(0)。同时引入 Snippets{#snippet} / {@render})取代 slots、事件属性语法(onclick 而非 on:click)、函数式 mount() 取代 new Component()
  • 2024.12—2025.05 · 5.5 — 5.29 快速补齐 — 5.5 支持从 <script module> 导出 snippet;5.14 新增 $inspect.trace();5.25 让 $derived 可写(支持乐观 UI 覆盖);5.29 将 {@attach} 附件(Actions 的响应式升级版)转稳定。
  • 2026.03—05 · 5.5x 与 SvelteKit 2.57 — 编译器选项支持函数式配置(css/runes/customElement);motion 模块导出 Tween/Spring 类型;SvelteKit 2.57 支持 TypeScript 6.0、新增 field.as(type, value) 表单助手与基于 hydratable 的远程函数传输。SvelteKit 2 要求 Svelte 5,无法降级。
  • 2026 · SvelteKit Remote Functions — 服务器专属代码放入 .remote.ts 文件,可被组件直接调用,具备完整类型安全、显式模块边界,并提供 OpenTelemetry 追踪——功能上对齐 Next.js Server Actions,但实现更轻。

8.2 Runes:从「魔法」到「显式」

Svelte 4 → Svelte 5 语法对照

Svelte 4(隐式)Svelte 5(Runes)变化的意义
let count = 0let count = $state(0)响应式变为显式选择,编译器不再猜测哪些变量需要追踪
$: doubled = count * 2let doubled = $derived(count * 2)脱离标签语句 hack,派生值成为可组合的一等公民
$: { console.log(count) }$effect(() => { console.log(count) })副作用边界清晰,便于理解执行时机
export let proplet { prop } = $props()Props 可自然解构,TypeScript 类型推导大幅改善
svelte/store 的 writable.svelte.ts / .svelte.js 中的 $state响应式逻辑可以写在普通 TS 文件里,store 样板消失
<slot> / slot=“x”{#snippet x()} … {@render x()}片段可作为参数传递、可导出,比 slot 更灵活
on:clickonclick回归标准 DOM 属性名,减少心智负担
new Component({ target })mount(Component, { target })函数式挂载,符合现代 API 习惯

Runes 全表

Rune用途变体与说明
$state(x)响应式状态$state.raw(不做深层代理)、$state.snapshot(取纯数据快照)、$state.eager
$derived(expr)派生值$derived.by(() =&gt; {...}) 用于多行逻辑;5.25+ 可写(支持乐观更新)
$effect(fn)副作用(仅浏览器)$effect.pre(DOM 更新前)、$effect.tracking$effect.root(手动控制生命周期)
$props()组件入参$props.id() 生成稳定唯一 ID(SSR 安全)
$bindable(default)双向绑定参数配合 bind: 使用
$inspect(…)调试仅在开发环境生效;$inspect.trace() 可追踪触发来源
$host()自定义元素宿主编译为 Web Component 时访问宿主元素

8.3 Svelte 与 SvelteKit 模块构成

Svelte 官方子模块

模块内容
svelte(核心)生命周期(onMount/onDestroy/tick)、Runes、Context(setContext/getContext)、mount/unmount/hydrateflushSync
svelte/storewritable / readable / derived / readonly / get;Svelte 5 中大部分场景可用 $state 替代,但为兼容保留
svelte/motionTween / Spring 补间动画原语(5.55 起导出完整类型)
svelte/transitionfade / fly / slide / scale / blur / draw / crossfade,支持自定义 transition 函数
svelte/animateflip 动画,配合 animate: 指令做列表重排
svelte/easing30+ 缓动函数(cubicOutbackIn 等)
svelte/reactivity响应式内置对象:SvelteMap / SvelteSet / SvelteDate / SvelteURLMediaQuery
svelte/eventson() 事件委托工具,替代部分 svelte/internal 用法
svelte/compiler编译器 API,供 Vite/Rollup 插件与构建工具调用
svelte/serverrender() 服务端渲染
svelte/legacy迁移兼容层(如 createClassComponent),供存量代码过渡

SvelteKit 核心约定与模块

约定 / 模块作用
src/routes 文件系统路由目录即路由,+page.svelte(页面)、+layout.svelte(布局)、+error.svelte(错误边界)
+page.server.ts / +layout.server.ts仅服务端执行的 load 函数,可直连数据库、读取环境变量
load 函数统一的数据加载入口(universal 可与 server 版共存),支持流式 SSR
Form Actions渐进增强的表单提交,无 JS 也能工作
Adaptersadapter-auto / node / static / vercel / netlify / cloudflare——同一份代码部署到不同目标
hooks.server.ts / hooks.client.ts请求拦截、鉴权、日志、错误处理的中间件层
Remote Functions(2026).remote.ts 中定义服务端函数,组件直接调用,带完整类型安全与显式边界

Svelte 的真实处境:State of JS 中「愿意再次使用」比例长期领先(2025 年约 85%),开发者体验是公认优势;短板是生态深度——缺少 React Aria 级别的无头组件库,企业级招人也更难。适合中小团队、性能敏感项目,以及作为 Astro 岛屿中的交互层。

9 其他重要框架:Solid / Qwik / Preact / Lit / Alpine

这些框架的市场份额不大,但它们往往是新范式的试验田——Signals 由 Solid 与 Preact 推动成跨框架共识,可恢复性由 Qwik 独家提出。

9.1 Solid.js:React 的语法 + Svelte 的内核

作者 / 首版

Ryan Carniato;1.0 于 2021 年发布

核心理念

「React 的 API 形状 + 细粒度响应式」——JSX + createSignal,但没有虚拟 DOM,且组件只执行一次

关键特性

JSX 直接编译为真实 DOM 创建代码;状态变化只更新订阅它的那一个 DOM 节点;无依赖数组、无 hooks 规则、无重渲染

2026 状态

SolidStart 1.0 已稳定(2025),成为官方元框架;社区报道其渲染性能显著优于 React、核心库体积极小

Solid 模块构成

模块内容
solid-js(核心)响应式原语:createSignalcreateEffectcreateMemocreateResourceonMount / onCleanup / batch / untrack;流程控制组件 <Show> <For> <Index> <Switch>/<Match> <Suspense> <ErrorBoundary> <Portal> <Dynamic>
solid-js/storecreateStore 深度代理状态、produce(immer 风格可变写法)、unwrap
solid-js/web渲染与 SSR:render / hydrate / renderToString / renderToStreamisServer
@solidjs/router官方路由,支持嵌套路由、数据加载器(preload)、Actions
@solidjs/startSolidStart 元框架:文件系统路由、SSR/流式渲染、Server Functions、多适配器部署(基于 Vite/Nitro)

为什么 Solid「组件只执行一次」很重要:在 React 中,状态变化会导致组件函数重新执行并产生新的 VNode;在 Solid 中,组件函数在初始化时执行一次后就「消失」了,留下的是信号与 DOM 之间的订阅关系。这既省掉了 diff,也从根本上消除了「闭包过期」「依赖数组漏写」这类问题。

9.2 Qwik:可恢复性(Resumability)

作者 / 首版

Miško Hevery(AngularJS 之父)与 Builder.io 团队;2022 年推出,2023 年 Qwik 1.0 与元框架 Qwik City 稳定

核心理念

传统 hydration 是「把服务端已经做过的事在客户端重做一遍」——这是纯粹的浪费。Qwik 的答案是可恢复性:服务端把应用状态与事件绑定序列化进 HTML,客户端不执行 hydration,直接从中断处继续运行

关键机制

$ 边界(component$useTask$onClick$)把代码切成可懒加载的片段(QRL);用户点击按钮前,该按钮的处理函数一行 JS 都不会下载

2026 状态

Qwik 2 于 2025 年底发布,并从 Builder.io 主导转为独立社区治理;新增异步组件、Component Resumability API,Signals 转稳定

核心 API 模块
  • 响应式useSignaluseComputed$useResource$useStore
  • 任务useTask$(服务端或客户端均可执行)、useVisibleTask$(仅浏览器,进入视口触发)
  • 数据routeLoader$(服务端数据加载)、server$action$(表单与变更)
  • 渲染component$SlotSSRStreamResource
  • Qwik City:目录路由、布局、中间件、静态生成、服务端预渲染
适用与不适用

最适合:大型电商、内容站——页面重但交互也多,处于「Astro 太轻、Next.js hydration 太贵」的中间地带。首屏 JS 实测约 2—4KB,Lighthouse 常接近满分。

暂不适合$ 边界规则、useTask$useVisibleTask$ 的区别、错误信息可读性都抬高了学习曲线;缺少 MUI / Chakra 级别的成熟 UI 库。

9.3 Preact:3KB 的 React 替身,与 Signals 的推手

作者 / 首版

Jason Miller;2015 年发布,以 ~3KB gzip 的体积提供与 React 高度兼容的 API

定位

体积敏感场景的 React 替代品(嵌入式组件、小程序、性能预算苛刻的页面)

关键贡献

Preact Signals(2022 年发布)证明了 Signals 可以不依赖框架独立存在,直接推动了 Signals 的跨框架普及与 TC39 标准化提案

Preact 模块与版本要点

模块 / 版本说明
preact核心(Component、h/createElement、render、Fragment、Hooks)
preact/hooks与 React 同名的 Hooks 实现
preact/compat兼容层:让绝大多数 React 生态库(含 React Router、MUI 等)直接跑在 Preact 上
@preact/signals-core框架无关的 Signals 内核,可单独用于任何 JS 项目
@preact/signals / signals-react分别为 Preact 与 React 提供绑定(React 版让组件可订阅 signal 而不触发重渲染)
preact/iso2023 年推出,用于在 Preact 中实现 Astro 风格的「岛屿架构」与选择性 hydration
Fresh(Deno 生态)基于 Preact 的元框架,2022 年随 Deno 生态推出;2025 年完成向 Vite 的迁移
版本线Preact X(即 10.x)自 2019 年起是长期主线,持续小版本演进,未走大版本断裂路线

9.4 Lit 与 Alpine.js:标准导向与极简路线

Lit —— 拥抱 Web Components 标准
  • 起源:Google Polymer 团队;Polymer 3(2018)→ lit-element → Lit 2.0(2021) → Lit 3.0(2023)
  • 理念:不发明组件模型,直接用浏览器原生的自定义元素 + Shadow DOM
  • 模块lit(整合包)、lit-html(模板)、lit-element(基类)、@lit/reactive-element(响应式基类)、@lit/context@lit-labs/*(实验特性如 ssr、motion、router)
  • 价值:产物是标准自定义元素,可被 React/Vue/Angular 直接引用——是跨框架组件复用的现实方案;适合设计系统、微前端共享组件层
  • 局限:Shadow DOM 的表单与样式穿透有历史包袱;生态与开发便利性不如主流框架
Alpine.js —— HTML 里的微型响应式
  • 起源:Caleb Porzio(Livewire 作者),2020 年发布
  • 理念:为服务端渲染的页面(Laravel、Rails、Django、静态站)加一点交互,不引入构建步骤
  • 特点x-data / x-bind / x-on / x-show / x-if / x-for / x-model 直接在 HTML 属性里写逻辑
  • 模块:核心 engine + 官方插件(csppersistmorphanchorcollapsefocusmask
  • 定位:常被称为「Tailwind 时代的 jQuery」——与 htmx 一起构成 2020 年代「反 SPA」路线的重要力量

一个容易被忽略的事实:并不是所有 Web 项目都需要 SPA。Alpine.js、htmx、Astro 的流行提醒我们——如果页面 80% 是内容、20% 是交互,那么「服务端渲染 + 少量交互增强」依然是最简单、最健壮、成本最低的方案。框架选型的第一步永远是确认你真的需要一个框架

10 元框架时代:Next.js / Nuxt / Astro / Remix / TanStack Start

2020 年之后,前端的主要创新不发生在框架本身,而发生在框架之上的元框架层——路由约定、渲染模式、数据加载、缓存策略、部署适配器。选「框架」实际上是在选「元框架 + 生态」。

10.1 Next.js(Vercel,React 生态)

Next.js 主要版本演进

版本时间关键变化
1.0 — 8.02016.10 — 2019.02从「零配置 SSR + 文件系统路由」起步,逐步加入代码分割、CSS 支持、Serverless 部署模式
9.x2019.07 — 2020API Routes(前后端一体)、动态路由;9.3 引入 getStaticProps/Paths(SSG)、9.5 引入增量静态再生(ISR)
10.x2020.10next/image 图片优化、国际化路由、next/script
11.x2021.06Webpack 5 默认、一致性改进、实时协作预览
12.x2021.10SWC 编译器(Rust,取代 Babel,编译提速数倍)、Middleware、React 18 支持
13.x2022.10 — 2023.05App Router(13.4 稳定)与 React Server Components、next/font、Turbopack alpha。这是 Next.js 最大的一次架构转向,也是争议最大的一次
14.x2023.10Server Actions 稳定、Turbopack 开发版稳定、Partial Prerendering 预览
15.x2024.10 — 2025.08支持 React 19、请求 API 异步化(params/searchParams 变为 Promise)、缓存默认值调整(fetch 不再默认强缓存);15.5 中 Turbopack 生产构建进入 Beta,Node.js middleware 稳定
16.02025.10.22Turbopack 成为所有应用的默认打包器(稳定)Cache Components(整合 use cache / PPR / Dynamic IO 为统一缓存编程模型)、React Compiler 内置支持稳定、Build Adapters API(alpha)、增强路由与预取、React 19.2(View Transitions、useEffectEvent()
16.12025.12.18Turbopack 文件系统缓存(next dev)稳定、内置 Bundle Analyzer、next dev --inspect
16.22026.03.18Adapter API 稳定(多云部署与 OpenNext 协作)、面向 AI 代理的改进(浏览器日志转发到终端、dev server 锁文件、Agent DevTools)
16.32026.08.03Instant Navigations 工具集(部分预取 + 客户端缓存路由外壳,实现接近 SPA 的跳转响应)、开发期内存占用最多降低 90%、构建与渲染提速;安全发布流程化(月度安全版本)

Next.js 核心概念与模块

概念 / 模块说明
App Router基于目录的路由,默认 React Server Components;page.tsx / layout.tsx / loading.tsx / error.tsx / route.ts / template.tsx
Server Components默认服务端执行,零客户端 JS,可直接访问数据库
Client Components文件顶部标记 'use client' 才进入浏览器包
Server Actions'use server' 的异步函数,直接在表单/事件中调用,替代手写 API 路由
Cache Components(16+)统一缓存模型:use cache 指令 + cacheLife / cacheTag + updateTag() / refresh() / revalidateTag(),取代此前分散且难预测的缓存行为
Partial Prerendering静态外壳 + 动态内容流式填充,同一页面兼具 SSG 速度与 SSR 动态性
next/image自动尺寸、格式转换、懒加载与 CDN 优化
next/font自托管字体,消除布局抖动与外部请求
Proxy(原 Middleware)16 起改名为 proxy,明确它只处理路由决策而非业务逻辑;支持 Node.js 运行时
TurbopackRust 增量计算打包器,16 起为默认;具备文件系统缓存与 SRI 支持
Adapters API16.2 起稳定,允许自建构建适配器,降低对单一部署平台的绑定

10.2 Nuxt(Vue 生态)

  • 2016—2018 · Nuxt 1.0 / 2.0 — 为 Vue 2 提供 SSR 与静态生成,模块系统(Nuxt Modules)与目录约定(pages / plugins / middleware / store)成为其标志。
  • 2022.11 · Nuxt 3.0 —— Nitro 引擎 — 基于 Vue 3 + Vite 重写,引入 Nitro 服务端引擎(跨平台、可部署到 Node/Serverless/Edge/静态托管)、自动导入、useFetch/useAsyncData、混合渲染。
  • 2023—2024 · 3.x 持续迭代Nuxt Content(文件型 CMS)、Nuxt ImageNuxt UINuxt DevTools 陆续补齐;Layers 支持跨项目复用目录结构。
  • 2025 · Nuxt 4 —— 构建层换血 — 底层从 Webpack 切换到 Rspack + Lightning CSS,构建速度较 Nuxt 3 显著提升(社区报道约 60%);目录结构规范化(app/ 目录)。
  • 2026.03 · Nuxt 4.4 — 路由切换至 Vue Router v5、支持自定义 useFetch/useAsyncData 工厂函数、带类型校验的布局属性、构建性能分析。
  • 2026 · Nitro v3 → Nuxt 5 — Nitro v3 alpha(2025.10)是服务器引擎的彻底重写,并从「引擎」演化为「Vite 插件」。Nuxt 5 将在其稳定后发布,带来大幅 DX 与性能提升;Nuxt 4.2 起已提供可选的 Vite Environment API 支持。

Nuxt 核心模块

模块作用
Nitro服务端引擎,负责 SSR、API 路由、缓存与多平台部署输出(Node / Deno / Bun / Serverless / Edge / 静态)
自动导入组件、组合式函数、工具函数无需 import 即可使用,减少样板代码
useFetch / useAsyncDataSSR 友好的数据获取,自动处理请求去重、缓存与 hydration 状态传递
Nuxt Layers目录级复用机制,适合多产品共享基础层(设计系统、鉴权、布局)
Nuxt Modules官方与社区模块生态(Content / Image / UI / Auth / I18n / Sitemap 等)
Nuxt DevTools内置调试面板,含路由、组件、Pinia 状态与时间线
NuxtHubCloudflare 平台上的全栈部署方案(KV / D1 / R2 绑定)

10.3 Astro:零 JavaScript 默认

定位

内容优先的 Web 框架,前提是「大多数网页不需要 JavaScript」

核心机制

Islands 架构:整页静态渲染为 HTML,只有标记为岛屿的交互组件才下发 JS,且可指定加载时机

重大事件

2026 年 1 月被 Cloudflare 收购——基础设施公司把框架视为战略层,是 2025—2026 年最值得注意的产业信号之一

Astro 版本要点

版本时间要点
1.02022.08岛屿架构正式稳定,.astro 组件(HTML 模板 + frontmatter 脚本)
2.02023.01Content Collections:Markdown/MDX 的类型安全管理与校验
3.02023.08View Transitions 支持、图片优化改进
4.02023.12开发工具栏、i18n 路由、增量内容缓存
5.02024.12Content Layer API(统一处理 Markdown、Sanity、Contentful、Notion 与本地 YAML,自动生成类型)、Server Islands(静态 HTML 长期驻留 CDN,动态部分单独请求)、View Transitions 稳定
5.x2025—2026Live Content Collections(运行时取数,避免频繁重建);Astro 6 将带来重构的开发体验
客户端指令

client:load(立即)、client:idle(空闲)、client:visible(进入视口)、client:media(媒体查询)、client:only(仅客户端)——精确控制 JS 何时下发。

框架无关

同一页面可以同时放 React、Vue、Svelte、Solid、Preact、Lit 组件,各自独立 hydrate。这使 Astro 成为「框架迁移的缓冲区」。

不适合什么

富交互 SPA:岛屿之间共享状态很麻烦,最终往往还是会全量采用某个框架。经验法则——复杂交互占比超过 20% 就该重新评估。

10.4 Remix / React Router 与 TanStack Start

Remix → React Router 7
  • Remix 由 Ryan Florence 与 Michael Jackson 创建,1.0 于 2021 年发布,主打Web 标准优先(Form、Request/Response、渐进增强)
  • 2022 年被 Shopify 收购;2024 年 11 月 Remix 品牌合并进 React Router 7,React Router 从此具备完整的数据加载、Actions 与 SSR 能力
  • React Router 7.10 起支持 Vite Environment API
  • Remix 3 的激进转向(2025 年公布):脱离 React,改用 Web 平台微包 + 命令式 this.update() 状态管理,主打「为 LLM 时代减负」——方向新颖但尚未得到生产验证
TanStack Start
  • TanStack 团队(Tanner Linsley)推出的全栈框架,构建在 Vite Environment API 之上
  • 主打类型安全的端到端:TanStack Router 的路由类型推导 + Server Functions
  • 框架无关:核心支持 React,并已实验性支持 Vue 与 Solid
  • 2025 年从 RC 推进,已移除对 Nitro 的硬依赖,允许用户自选服务端引擎
  • 适合:已重度使用 TanStack Query/Router/Table 的团队

10.5 元框架横向速览

2026 年主流元框架对比

维度Next.js 16Nuxt 4Astro 5SvelteKit 2SolidStart 1.0TanStack Start
基座框架React 19Vue 3.5/3.6框架无关Svelte 5SolidReact / Vue(实验) / Solid
默认渲染RSC + SSRSSR + 混合SSG(零 JS)SSR + 流式SSR + 流式SSR + Server Fns
打包器TurbopackRspack + Lightning CSSVite(Rolldown)ViteViteVite(Env API)
类型安全路由有(typed routes)最强
服务端函数Server ActionsServer Routes / ActionsActions(v5+)Remote FunctionsServer FunctionsServer Functions
部署绑定Vercel 最优,16.2 起 Adapter 稳定无(Nitro 多目标)无(2026 归 Cloudflare)无(适配器)无(适配器)
学习曲线高(RSC 心智模型)中—高
生态规模最大小(增长快)

11 构建工具链:从手工拼接到 Rust 内核

前端构建史有一个反复出现的规律:每一代工具都是因为上一代的「配置负担」或「速度瓶颈」而被推翻。而 2020 年最关键的一次认知突破是——瓶颈不在算法,而在实现语言

11.1 五代工具链

第 0 代:script 标签与手工拼接(—2011)

没有模块概念,靠 <script> 顺序手动管理依赖,所有代码挂在 window 全局命名空间。压缩靠在线工具或手写 Node 脚本。YUI、Closure Library 等提供命名空间与依赖注入式的组织方式。

第 1 代:模块化与任务流(2011—2013)

Browserify(2011)第一次让浏览器里能写 Node 风格的 require(),把 CommonJS 模块拼接为单文件。Grunt(2012)用配置文件定义任务流水线(压缩、编译、监听),Gulp(2013)改用 Node Stream 的「代码优于配置」,构建速度更快。但二者都是任务运行器,不理解模块依赖图。

第 2 代:打包器统治(2012—2019)

Webpack(2012 首次发布,2015 随 React 爆发)的核心思想:一切资源都是模块,Loader 把任意文件转入依赖图,Plugin 介入构建流程。它带来了代码分割、HMR、懒加载,统治了近十年,代价是配置复杂度成为一门「手艺」。Rollup(2015)押注 ESM,用静态分析发明 Tree Shaking 与 Scope Hoisting,产出更干净,成为库打包的事实标准。Parcel(2017)主打零配置,催生了后来的 CRA 式「隐藏配置」思路。

第 3 代:原生速度 + 开发态不打包(2020—2023)

esbuild(2020,Go 编写)比同类快 10—100 倍,直接证明瓶颈是实现语言。SWC(Rust)在转译层做了同样的事。Snowpack(2020)提出开发态直接用浏览器原生 ESM。Vite(2020,尤雨溪)把这条路线做成主流:开发态不打包、按需用 esbuild 转换单文件;生产态用 Rollup 打包。冷启动几乎与项目规模无关,HMR 变为毫秒级。Vite 同时催生了 Vitest——它复用 Vite 的同一套转换管线,因此测试配置与构建配置可以共享,无需再维护一套 Jest/Babel 平行宇宙。

第 4 代:Rust 重写与内核收敛(2022—2026)

几乎所有工具都被用 Rust 重写了一遍:Turbopack(Vercel,Webpack 作者 Tobias Koppers 主导)、Rspack(字节跳动,Webpack API 的 Rust 实现)、Rolldown(VoidZero,Rollup 插件 API 的 Rust 实现,明确为成为 Vite 引擎而生)、oxc(高性能 JS 工具链集合)、Oxlint / Biome(Rust 版 Lint/Formatter)。

Vite 8(2026.03):以 Rolldown 作为统一内核,取代「esbuild + Rollup」双引擎 · Rolldown 1.0(2026.05):API 锁定在 semver 下 · Rspack 2.0(2026.04)/ 2.1(2026.06,内置 Rust 版 React Compiler) · Turbopack:Next.js 16 生产默认

收敛的含义:2020 年代早期「dev 用 esbuild、build 用 Rollup」的双引擎差异,正是「开发能跑、生产报错」这类问题的主要来源。统一为单一 Rust 内核后,开发态与生产态的行为一致性大幅提升。

11.2 构建工具对比

2026 年主流构建工具选型对照

工具语言最擅长首选场景取舍
Vite 8JS + Rust 内核新项目通用打包新项目默认生态最大、框架无关、单内核;几乎所有非 Next 元框架都构建在它之上
Webpack 5JS复杂遗留工程存量大型项目插件生态最广但速度慢、配置重;新项目已不再首选
Rspack 2.xRustWebpack 兼容替代从 Webpack 迁移现有 webpack 配置/插件/loader 可最小化改动复用;Nuxt 4 已采用
TurbopackRustNext.js 构建Next.js 项目增量计算优秀,Next 16 起为默认;生态限于 Next 体系
Rollup 4JS库打包发布 npm 包产物最干净、Tree Shaking 成熟;不适合应用级开发服务器
RolldownRust统一 Vite 内核作为 Vite 8 引擎兼容 Rollup 插件 API;1.0 起 API 稳定
esbuildGo极速转译/压缩嵌入其他工具最快的基线,但插件生态深度不足,通常作为底层依赖而非直接使用
Parcel 2JS/Rust零配置原型与小型项目开箱即用,但市场份额已被 Vite 大幅挤压

11.3 周边工具链的代际更替

每一层工具都在被「更快 + 零配置」重写

环节上一代当前主流迁移原因
包管理npm(2010)→ yarn(2016)pnpm / Bun / yarn Berry磁盘占用与安装速度;pnpm 的硬链接机制与严格的依赖隔离解决了「幽灵依赖」
语法转译Babel(2014)SWC / oxc / esbuild纯 Rust/Go 实现,速度提升一个数量级;Babel 退居为「插件生态兼容层」
类型检查tsc(TypeScript 编译器)tsc + TS 7.0 Go 编译器(2026 GA)微软用 Go 重写编译器,类型检查速度大幅提升
代码检查ESLint(2013)+ PrettierOxlint / Biome(Rust)大型仓库的 lint 耗时从分钟级降到秒级;Biome 把 lint 与格式化合二为一
单元测试Jest(2014)+ BabelVitest复用 Vite 管线,配置与构建一致;Angular 21 起也把 Vitest 设为默认
E2E 测试Selenium / CypressPlaywright多浏览器内核支持、并行执行与追踪调试体验
MonorepoLerna(2016)Turborepo / Nx / pnpm workspaces任务编排与远程缓存,避免重复构建
运行时Node.jsNode 22/24 / Bun / Deno 2Bun 集运行时、包管理、打包、测试于一体;2026 年 1 月 Bun 被 Anthropic 收购
格式化JSBeautify / PrettierPrettier / Biome / oxfmt性能与一致性;Biome 提供 Prettier 兼容模式

实践建议:不要为了「新」而换工具。判断标准只有两条——①当前工具是否已经成为团队协作的实际瓶颈;②新工具是否能复用现有配置(例如从 Webpack 迁 Rspack,或从 Jest 迁 Vitest 时配置可大幅简化)。满足这两条再动。

12 状态管理:从单一 Store 到「服务端/客户端分离」

状态管理的历史,本质是对「什么状态该放哪里」这个问题的反复回答。2026 年的共识是:先把服务端状态交给数据请求库,剩下的客户端 UI 状态用轻量方案——Redux 不再是默认答案。

12.1 演进时间轴

  • 2014 · Flux —— 单向数据流的提出 — Facebook 提出 Action → Dispatcher → Store → View 的单向流动,作为对 MVC 双向数据混乱的回应。它是一套模式而非库。
  • 2015.06 · Redux —— 事实标准确立 — Dan Abramov 与 Andrew Clark 把 Flux 简化为单一不可变 Store + 纯函数 Reducer + Action。三大原则(单一数据源、状态只读、纯函数修改)带来可预测性与时间旅行调试,样板代码多但心智模型清晰。
  • 2015 · MobX —— 相反的路线 — 基于 observable 与自动依赖追踪,允许可变数据、样板极少。与 Redux 形成「显式不可变 vs 隐式响应式」的两极,这一对立延续至今。
  • 2015—2016 · Vuex(Vue 生态) — Redux 的 Vue 移植版:state / mutations / actions / getters 四件套,深度集成 Vue DevTools。
  • 2015—2018 · 异步中间件大战 — redux-thunk(函数式 action)→ redux-saga(Generator 编排)→ redux-observable(RxJS)。复杂度一路上升,成为 Redux 被诟病的主因。
  • 2019.10 · Redux Toolkit —— 官方自救configureStore 内置 thunk 与 DevTools、createSlice 用 Immer 实现「可变写法、不可变结果」、createAsyncThunk 处理异步、RTK Query 处理数据请求。样板代码大幅下降,成为 Redux 的现代形态。
  • 2019—2020 · ★ 服务端状态独立出来SWR(Vercel)与 React Query(Tanner Linsley,后更名 TanStack Query)提出关键洞察:「服务端数据的缓存」与「客户端 UI 状态」是两种性质完全不同的东西,不该塞进同一个 Store。请求去重、失效重取、乐观更新、分页与无限滚动由此有了专门解法。这是十年来状态管理最有价值的一次认知升级。
  • 2019—2021 · 轻量与原子化方案Zustand(2019):极简 API,一个 create() 搞定,无需 Provider。Jotai(2020):自下而上的原子模型,状态按需组合。Valtio:Proxy 代理式可变状态。共同点是「样板代码趋近于零」。
  • 2020 · Recoil(Meta)—— 起落 — 由 Meta 推出的原子化状态库,一度被视为 React 官方方向,但因团队变动与维护停滞,生态迅速转向 Jotai / Zustand。这是一个提醒:选型要看维护活跃度,而不是出品方名气。
  • 2021—2022 · Pinia 取代 Vuex — 去掉 mutations、天然 TypeScript 友好、按 store 拆分、体积更小。2022 年成为 Vue 官方推荐,2023 年 Vuex 进入维护模式。调查显示超过 80% 的 Vue 开发者已使用 Pinia。
  • 2022—2026 · ★ Signals 跨框架复兴 — Preact Signals(2022)证明信号可脱离框架独立存在;随后 Angular Signals(v16 起)、Solid 信号、Vue 3.6 的 alien-signals、Svelte 5 Runes 全部汇入同一范式。TC39 已有 Signals 标准化提案,信号正在成为 JavaScript 的语言级能力。
  • 2024—2026 · 服务端函数削弱客户端状态需求 — Server Actions / Server Functions / Remote Functions 让「变更 → 重新验证 → 自动同步」成为框架内置能力,一部分原本需要客户端状态管理的场景直接消失了。

12.2 主流方案对比

状态管理选型对照(2026)

方案模型生态样板代码适用与点评
Redux Toolkit单一 Store + SliceReact(可跨框架)大型团队、需要严格可追溯性与中间件;自带 RTK Query 可一并解决数据请求。新项目占比在下降,存量占比仍极高
Zustand轻量 StoreReact(可跨框架)极少新项目最常用:无需 Provider、API 直观、体积小;缺点是缺少强约束,大型团队需自建规范
Jotai原子(自下而上)React极少状态按需组合、重渲染范围天然最小;适合细粒度状态多的场景
Pinia多 StoreVue极少Vue 官方推荐,TS 体验优秀,与 DevTools 深度集成
MobX响应式对象跨框架复杂领域模型、面向对象风格;隐式追踪带来调试难度
Signals(各框架)细粒度信号跨框架 / 语言提案极少2026 年的技术共识;依赖自动追踪、更新精确到节点
TanStack Query服务端状态缓存跨框架不属于「客户端状态」竞争,而是它的前置层:先把服务端数据交给它,剩下的才考虑上面几个
XState状态机 / 状态图跨框架复杂业务流程(多步表单、审批流、播放器);显式建模非法状态,可视化调试是独特优势

2026 年的标准答案:①服务端数据 → TanStack Query(或框架自带的 loader / Server Functions);②跨组件共享的 UI 状态 → Zustand / Jotai / Pinia;③组件内部状态 → 框架原生 useState / ref / $state;④复杂流程 → XState只有在团队已有 Redux 投资或需要严格审计追踪时,才从 Redux Toolkit 起步。

13 样式方案:从全局样式表到原子化与设计令牌

CSS tooling 是整个前端生态中变动最快的品类——过去十年每隔两三年就被颠覆一次。理解它的主线是:如何在不产生全局冲突的前提下复用样式

13.1 演进时间轴

  • 1996—2006 · 原生 CSS 与选择器战争 — 一个全局样式表 + 层层覆盖的选择器。CSS 特异性与 !important 成为主要痛点。
  • 2006—2009 · 预处理器:Sass / Less / Stylus — Sass(2006)引入变量、嵌套、mixin、函数与模块化;Less(2009)因 Bootstrap 而普及。它们让 CSS 具备了编程能力,但没有解决全局冲突
  • 2010—2014 · 方法论时代:OOCSS / BEM / SMACSSBEM(Yandex)用 block__element--modifier 命名约定人为制造作用域,是组件化之前的主流方案。同期 Bootstrap(2011)与 Foundation 提供开箱即用的 UI 套件。
  • 2013—2015 · PostCSS 与工程化后处理 — Autoprefixer 自动补前缀、cssnano 压缩;PostCSS 把 CSS 变成可编程的 AST,成为现代构建的基础设施。
  • 2015—2017 · ★ CSS Modules —— 真正的局部作用域 — 编译时把类名哈希化(.title_x8f2a),从机制上消灭全局冲突。配合 Webpack/Vite 零成本使用,至今仍是 React 项目最稳妥的默认选项。
  • 2016—2019 · CSS-in-JS:styled-components → emotion — 把样式写进 JS,天然支持动态样式、主题与组件共存亡。styled-components(2016)率先流行,emotion(2018)以更好的性能与体积接棒。代价:运行时开销、SSR 配置复杂。
  • 2017—2019 · ★ Tailwind CSS —— 范式反转 — 从「语义化类名 + 单独写 CSS」转向「在 HTML 里直接组合原子类」。2019 年 v1 后快速普及,2022 年起在新项目中的采用率超过 CSS-in-JS。核心价值:不用再为命名发愁、不用在文件间跳转、设计约束内置于工具类
  • 2021—2024 · RSC 冲击与编译期方案崛起关键转折:运行时 CSS-in-JS(styled-components / emotion)在 React Server Components 环境下无法工作(它们需要客户端运行时注入样式)。这直接催生了编译期方案:Panda CSS(Chakra 团队,build-time,RSC 友好)、StyleX(Meta,零运行时)、UnoCSS(按需生成的原子化引擎,兼容 Tailwind 语法)。
  • 2025—2026 · Tailwind 4 与原生 CSS 反攻 — Tailwind 4 转向 Rust 实现、配置从 JS 文件移到 CSS 内的 @theme,构建更快。同时浏览器原生能力补齐:CSS 嵌套、@layer 级联层、@scope 作用域、容器查询、:has() 父选择器、子网格——社区开始讨论「原生 CSS 是否让部分框架变得不必要」。

13.2 五类方案对比

样式方案选型对照

方案作用域运行时开销RSC 兼容取舍
原生 CSS + 嵌套/@layer文件级 / @scope2026 年已相当可用;适合设计系统底座与轻交互站点
CSS Modules编译期哈希最稳妥的默认选择;心智负担低,与 Sass 可叠加使用
Tailwind CSS 4原子类开发速度最快、产物最小;反对意见主要是 HTML 可读性
UnoCSS原子类(按需)比 Tailwind 更灵活(自定义规则即写即用),生态较小
Panda CSS编译期原子化保留 CSS-in-JS 的写法体验但产物是静态 CSS;增长最快
StyleX编译期哈希Meta 内部大规模使用,类型安全强;外部采用有限
styled-components / emotion运行时生成受限动态样式能力最强,但 RSC 环境下需标 'use client';新项目采用率持续下滑

13.3 UI 组件库的三代变迁

第一代:完整皮肤

Bootstrap(2011)、Foundation、jQuery UI。提供成品样式与组件,定制需要覆盖 CSS。适合后台与原型。

第二代:企业级组件库

Ant Design(2015,阿里)、Material UI / MUI、Element UI(2016,饿了么)、Vuetify、Naive UI、PrimeVue。组件齐全、主题可配,是中后台主力。代价是包体积与设计同质化。

第三代:无头 + 可复制

Radix UI / Headless UI 提供无样式的行为与无障碍能力;shadcn/ui 采用「把源码复制进你的项目」而非 npm 依赖的模式,彻底解决定制难题。2026 年新项目的热门选择。

设计令牌(Design Tokens)正在成为跨框架的统一层:把颜色、间距、圆角、字号抽象为与平台无关的变量(通常用 JSON/Style Dictionary 管理),再分别编译为 CSS 变量、Tailwind 主题、Figma 变量与原生主题。这样「设计系统」就能同时服务 Web、iOS、Android 与小程序。

14 路由与数据请求:SPA 的两条主动脉

路由决定「URL 如何映射到 UI」,数据请求决定「UI 从哪里拿数据」。这两件事在 2020 年后重新合流——现代路由不仅映射组件,还要负责加载组件所需的数据。

14.1 前端路由的四代形态

路由技术演进

代际机制代表特点与局限
第 0 代服务端路由PHP / Rails / Django每次跳转整页刷新,URL 由服务端解析。SEO 天然友好,体验割裂
第 1 代hash 路由(#/userBackbone Router、angular-route、早期 vue-router利用 hashchange 不触发页面跳转;兼容性最好,但 URL 不美观,且 hash 不会发给服务端
第 2 代History API(pushStateHTML5 History(2011 起普及)URL 干净、可被服务端解析;代价是刷新子路径时需要服务端回退到 index.html
第 3 代声明式组件路由React Router v4(2017)、vue-router 3路由本身变成组件(<Route>),动态路由替代集中式配置表;灵活但难以做数据预加载与静态分析
第 4 代数据路由React Router 6.4(2022)、Remix路由配置同时声明 loader(读)与 action(写),导航与数据请求并行发起,消除「组件挂载后才开始请求」的瀑布流
第 5 代类型安全 + 文件系统路由TanStack Router、Next.js App Router、Nuxt、SvelteKit路径参数、查询参数、搜索校验全部具备类型推导;文件系统即路由,零配置且天然支持代码分割

14.2 React Router 的版本史(SPA 路由的缩影)

  • 2014—2016 · v1 — v3:集中式配置 — 路由以 JS 对象数组(或 JSX 嵌套配置)集中声明,支持嵌套路由与 Index Route。
  • 2017.03 · v4:★ 声明式重写(重大断裂) — 取消集中配置,路由变成普通组件,可在任意位置声明。理念先进但引发大量迁移阵痛,社区争议极大。
  • 2018 · v5:兼容与稳定 — 在 v4 基础上补回部分能力(如 useHistory),成为长期主流版本。
  • 2021.11 · v6:Hooks 化与相对路由 — 全面 Hooks API(useNavigate/useParams/useSearchParams)、<Routes> 取代 <Switch>、路由排名算法改进、相对链接与嵌套布局优化(<Outlet>)。
  • 2022.09 · v6.4:数据路由 — 引入 createBrowserRouter 与路由级 loader / action / errorElement<Form>useFetcher、乐观更新——本质上是把 Remix 的数据能力注入 React Router。
  • 2024.11 · v7:★ 合并 Remix,成为全栈框架 — Remix 品牌并入 React Router,后者获得 SSR、静态生成、Server/Client 双环境编译与 Vite 插件。7.10 起支持 Vite Environment API。React Router 从此不再只是一个路由库。

14.3 数据请求:五波浪潮

① XMLHttpRequest → fetch

fetch(2015 标准化)基于 Promise,取代冗长的 XHR 回调。但原生 fetch 不带超时、拦截、取消(后由 AbortController 补齐)。

② axios

2014 年发布,提供拦截器、请求/响应转换、取消、自动 JSON 解析与浏览器/Node 同构。十余年后仍是「低变动品类」里最稳的选择。

③ GraphQL

2015 年 Facebook 开源,用声明式查询取代 REST 多端点;客户端以 Apollo Client、urql、Relay 为代表。解决了过度获取与接口聚合,但引入了 schema 治理与缓存复杂度。

④ TanStack Query / SWR

把「服务端数据」当作缓存来管理:请求去重、窗口聚焦重取、失效重取、分页/无限滚动、乐观更新、错误重试。这是当前最主流的服务端状态方案。

⑤ 服务端函数(2023— )

Server Actions(Next.js)、Server Functions(Nuxt/SolidStart)、Remote Functions(SvelteKit)、tRPC——让前端直接调用类型安全的服务端函数,不需要手写 API 层

类型安全 API 的两条路

tRPC:TypeScript 端到端类型推导,无需 schema 代码生成,适合全栈 TS 项目。GraphQL / OpenAPI codegen:跨语言友好,适合多端多语言的大型组织。

2026 年的选择逻辑:如果前后端都是 TypeScript 且由同一团队维护 → tRPC 或框架自带 Server Functions;如果客户端多元(Web + iOS + Android + 第三方)→ OpenAPI/GraphQL + 代码生成;如果数据源多、需要强缓存与离线 → TanStack Query。多数项目是「TanStack Query + 少量 Server Functions」的混合。

15 跨端路线:一次编写,多处运行(的四十年尝试)

「用 Web 技术写原生应用」是前端领域持续时间最长的诱惑。四十年间它反复成功又反复失败,唯一不变的是没有银弹——每种方案都在「开发效率、性能、原生能力、生态」四者中做出不同取舍。

15.1 四条技术路线

路线一:WebView 套壳(Hybrid)

Cordova / PhoneGap(2009)、Ionic(2013)、Capacitor(2018)。HTML/CSS/JS 跑在内置 WebView 里,通过桥接调用原生能力。

取舍:开发成本最低、Web 技能完全复用;性能与体验受限于 WebView,复杂动画与长列表吃力。适合企业内部工具、内容型应用。

路线二:原生渲染(JS 驱动原生组件)

React Native(2015 开源)、Weex(2016,阿里)。JS 写逻辑,渲染交给原生组件,通过桥接通信。RN 的新架构(JSI / Fabric / TurboModules)已消除传统桥的性能瓶颈。

取舍:接近原生的体验、热更新、Web 团队可直接上手;双端差异仍需原生知识,升级与三方库质量是长期痛点。

路线三:自绘引擎(Skia / Impeller)

Flutter(2017 alpha,2018 年 1.0,Dart 语言)。不用平台原生组件,自己绘制每一个像素,因此跨端一致性最高。

取舍:性能与一致性最好、动画能力强;需学习 Dart,包体积较大,Web 端输出体积偏重。

路线四:编译型多端(小程序生态)

uni-app(2018,DCloud)、Taro(2018,京东)。用 Vue/React 语法写一次,编译到 H5、微信/支付宝/抖音小程序、iOS/Android。

取舍中国市场的事实标准——没有别的方案能同时覆盖各家小程序;代价是编译目标多、平台差异抹平成本高、调试链路复杂。

15.2 桌面端与 PWA

桌面端方案对比

方案内核体积取舍
Electron(2013)Chromium + Node大(80MB+)成熟稳定、生态巨大(VS Code、Slack、Discord);内存与体积是主要批评
Tauri(2022,Rust)系统 WebView小(数 MB)复用系统 WebView,包极小、内存低;需要处理不同平台 WebView 差异
PWA(2015 提出)浏览器几乎为零Service Worker + Manifest + 离线缓存;iOS 支持曾长期受限,能力仍弱于原生

15.3 跨端方案选型矩阵

2026 年跨端方案对照

方案语言目标平台性能最适合
React NativeJS/TSiOS / Android / Web / 桌面接近原生已有 React 团队、需要热更新与原生体验的移动应用
FlutterDartiOS / Android / Web / 桌面 / 嵌入式接近原生追求跨端像素级一致、复杂自绘 UI 与动画
uni-appVueH5 / 各家小程序 / App / 鸿蒙国内业务,尤其必须同时覆盖微信/支付宝/抖音小程序
TaroReact/Vue小程序 / H5 / RN已有 React 技术栈但需要输出小程序
Capacitor / IonicWebiOS / Android / Web把现有 Web 应用打包成 App,成本最低
TauriRust + WebWindows / macOS / Linux / 移动桌面工具类应用,追求小体积与低内存
ElectronWeb + Node桌面三平台需要完整 Node 能力与成熟生态的桌面应用

选型提醒:跨端方案的真实成本往往不在开发期,而在第 6 个月之后——当业务需要调用一个平台特有能力,或某个三方库停止维护时。选型前应确认:目标平台差异有多大?团队是否具备原生调试能力?遇到平台限制时的兜底方案是什么?

16 TypeScript:从可选到默认

2012 年 TypeScript 发布时,多数人认为它只是给 Java 开发者的安慰剂。2026 年,它已经是所有主流框架的默认语言——Angular 强制、Vue 源码即 TS、React 生态的类型覆盖近乎完整。

TypeScript 关键版本与能力

版本时间标志性能力
0.82012.10首次公开发布(微软, Anders Hejlsberg 主导)
1.02014.04首个稳定版,正式进入生产可用
1.52015ES6 模块语法、装饰器(实验性,后被 Angular 大量使用)
2.02016strictNullChecksnever 类型、更精细的控制流类型收窄——TypeScript 从「可选类型标注」变成「真正的类型系统」
3.02018Project References(大型项目增量构建)、元组类型增强、unknown 类型
4.02020可变元组类型、标记元组元素(极大改善函数式 API 的推导)
4.1—4.92020—2022模板字面量类型、递归条件类型、satisfies 运算符(4.9,兼具类型检查与字面量推导)
5.02023.03用 ES Modules 重写编译器(构建与包体积大幅优化)、标准装饰器(与 TC39 提案对齐)、const 类型参数
5.x2023—2025using 显式资源管理、推断类型谓词、NoInfer、正则语法检查。Angular 22 要求 TS ≥ 5.9
7.02026Go 原生编译器(tsgo)正式 GA——把类型检查器移植到 Go,编译与检查速度数量级提升,语言服务响应更快
为什么它赢了
  • 渐进式采用:.js 可逐文件迁移,allowJscheckJs 提供中间态
  • 类型可推导:多数场景不需要手写标注
  • 编辑器体验:重构、跳转、自动补全成为刚需
  • 生态倒逼:DefinitelyTyped 与库作者自带类型形成正循环
常见代价
  • 类型体操:复杂泛型写法难读难维护
  • 构建耗时:虽被 Go 编译器大幅缓解,大型仓库仍需增量与缓存策略
  • 类型与运行时脱节:类型正确不代表逻辑正确,边界校验(如 Zod)仍必要
2026 实践建议
  • 开启 strict: true(含 strictNullChecks
  • Zod / Valibot 做运行时边界校验,与 TS 类型共享 schema
  • 大型仓库开启 Project References 或改用 Go 编译器
  • 库作者优先保证类型推导,而非手写复杂类型

17 横向对比:八大框架全维度矩阵

下面这张表是本文档的核心产出——把前面所有章节浓缩为可直接用于技术评审的对比依据。

17.1 基础属性对比

八大框架基础属性(截至 2026 年 9 月)

维度React 19Vue 3.6Angular 22Svelte 5Solid 1.xQwik 2Preact 10Astro 5
定位UI 库渐进式框架完整平台编译器响应式 UI 库可恢复框架轻量 React 替代内容站框架
首版2013.052014.022016.09(AngularJS 2010)2016.112021202220152022.08
当前版本19.2.x(20 已 Beta)3.6.x22.0.x5.5x1.9x2.x10.x5.x
维护方React Foundation(Linux 基金会)Vue 团队 / VoidZeroGoogleVercel(Rich Harris)社区 / Ryan Carniato独立社区(原 Builder.io)社区Cloudflare(2026 收购)
主语言JS/TSTSTS 强制TSTSTSJS/TSTS
模板 / 视图JSXSFC 模板(可 JSX)模板 + 内置控制流Svelte 模板JSXJSXJSX / HTM.astro 组件
响应式模型不可变 + 重渲染(Compiler 优化)Proxy / alien-signals + VaporSignals(Zoneless)Runes($stateSignalsSignals + QRLHooks / Signals岛屿各自独立
虚拟 DOM可选(Vapor 可关)有(Ivy 增量)有(极简)无(静态 HTML)
组件重执行每次更新重跑每次更新重跑按绑定更新仅初始化一次仅初始化一次可恢复,不重跑每次更新重跑岛屿按需
官方路由无(React Router)vue-router@angular/routerSvelteKit 内置@solidjs/routerQwik City 内置文件系统路由
官方状态无(Zustand 等)PiniaSignals / Service+RxJSRunes(无需库)Signals(无需库)Signals(无需库)Signals岛屿内自行选择
官方表单无(RHF / 原生 Actions)无(vee-validate)@angular/forms(Signal Forms)Form Actions
SSR / 元框架Next.js 16 / React Router 7Nuxt 4@angular/ssrSvelteKit 2SolidStart 1.0Qwik CityFresh自身即元框架
发布节奏不定期大版本约 1—2 年一次大版本12 个月一个大版本(v22 起)不定期小步快跑社区驱动长期 10.x约 1 年
向后兼容强(有 codemod)强(渐进迁移)最强(ng update 自动迁移)4→5 有断裂(Runes)稳定1→2 有断裂
生态规模最大很大(中国尤强)大(企业向)很小中(复用 React)
招人难度低(国内极低)中—高很高低(React 技能可迁移)

17.2 能力维度评分

评分为相对定性判断(5 分制),用于快速定位差异,不代表绝对优劣。

能力维度评分(5 分制,含评分口径说明)

维度ReactVueAngularSvelteSolidQwik评分口径
上手容易度352432新手从零到写出生效页面的难度
运行时性能34(Vapor 5)4555高频更新场景下的开销
首屏 / TTI3(RSC 4)43445首屏 JS 体积与可交互时间
开发体验454542样板代码量、报错可读性、工具链
TypeScript445444类型推导质量与生态类型覆盖
生态丰富度544321组件库、工具、教程、第三方集成
大型项目约束235333框架本身对架构一致性的强制力
长期维护保障4(基金会)45(Google + 固定周期)3(Vercel)32治理结构与升级路径确定性
SSR / 全栈能力5(Next 16)5(Nuxt 4)4444服务端渲染、数据加载、部署完整度
内容站适配232334是否适合博客/文档/营销页(对照 Astro 5 满分)

18 性能与体积:数据怎么看,坑在哪里

前端性能对比是网络上误导最多的领域之一。理解下面的方法论,比记住任何一组数字都重要。

18.1 三类「体积」,别混为一谈

① 框架运行时基线

只算框架自身必须下发的代码,不含业务代码。这是各家宣传数据的主要来源。确定性参考点:Preact 约 3—4KB gzipSolid 核心约 7KBSvelte 5 编译后运行时极小

② Hello World 产物

最小应用打包后的总大小。比基线更接近真实,但仍不含业务逻辑。Astro 静态页与 Qwik 首屏可做到接近 0 到数 KB

③ 真实应用体积

包含路由、状态、UI 库、图标、日期、图表等。这一项几乎总是由业务依赖而非框架决定——引一个 Ant Design 或 MUI,框架差异就被淹没了。

常见误区:拿「框架运行时基线」的数字去论证真实项目的性能差异。实际项目中,体积的 80% 来自业务代码与第三方依赖,而卡顿的 80% 来自不必要的重渲染、未虚拟化的长列表、未优化的图片与字体。框架选择影响的是上限,工程实践决定的是下限。

18.2 相对体积示意

在这里插入图片描述

说明:Angular 未列入此图,因为它通常是「平台整体」而非可拆分的视图层,其体积取决于使用了多少官方模块(路由、表单、动画、Material 等)。

18.3 性能优化的三层杠杆(按收益排序)

投入产出比从高到低

优先级杠杆典型手段与收益
P0资源与网络图片格式与尺寸(WebP/AVIF、响应式 srcset)、字体子集化与 font-display、CDN、HTTP/2-3、压缩(Brotli)、缓存策略。通常占可优化空间的 50% 以上
P0渲染策略把内容页改为 SSG/ISR(Astro、Nuxt、Next);对交互页启用流式 SSR 与部分预渲染。首屏收益最大的一次结构性选择
P1减少不必要的渲染React Compiler / Vue Vapor / Signals;长列表虚拟化(TanStack Virtual);避免在渲染中做重计算
P1代码分割路由级懒加载、组件级 lazy、第三方库按需引入(如 lodash-es、图标按需)
P2框架层面的微优化换更小的框架、memo、不可变数据结构。只有当上面四项都做完、仍有明确瓶颈时才值得做

19 选型决策:五个问题定乾坤

技术选型的绝大多数错误,源于先选框架、再套需求。正确顺序是先回答五个问题,答案自然会收敛到一到两个候选。

19.1 决策树

在这里插入图片描述

19.2 场景 → 推荐速查

常见业务场景的推荐组合

场景首选备选关键理由
企业官网 / 营销页Astro 5(静态 + 岛屿)Next.js 16(SSG)零 JS 默认,Lighthouse 分数最优
博客 / 文档站 / 知识库Astro 5 + Content LayerVitePress / Nuxt ContentMarkdown/MDX 类型安全、构建快
中后台管理系统Vue 3.6 + Element Plus;或 React + Ant DesignAngular 22 + Material组件库成熟、招人容易、表单与表格需求重
大型金融 / 政企系统Angular 22React 19 + 严格规范强约束、官方全家桶、固定发布周期与长期支持
SaaS 全栈应用Next.js 16(RSC + Server Actions)Nuxt 4 / SvelteKit 2全栈一体、缓存模型完善、部署便利
实时数据看板Vue 3.6(Vapor)或 SolidReact + 虚拟列表 + Compiler高频更新,细粒度响应式收益最大
电商前台Astro 5 / Qwik 2(内容 + 交互混合)Next.js 16 + PPR首屏敏感 + 交互不少,需要岛屿或可恢复
小程序 / 多端uni-app(Vue)或 Taro(React)原生小程序国内多平台覆盖没有替代方案
移动端 AppReact NativeFlutter取决于团队语言偏好与一致性要求
桌面工具Tauri(小体积)Electron(生态全)权衡包体积与 Node 能力
嵌入式 / 第三方小组件Preact 或 Svelte 5Lit(Web Components)体积是第一约束;Lit 便于跨框架复用
老系统渐进改造Vue 3(可 <script> 直接引入)Alpine.js / htmx渐进式是 Vue 名字里最强的能力

反模式清单(这些错误在真实项目里反复出现):①用 SPA 框架做纯内容站,然后花大力气补 SEO;②因为「新技术」在核心业务上采用维护者单一、生态薄弱的框架;③在没有性能预算时,为了 5KB 体积差异付出 3 个月的迁移成本;④让框架决定架构——框架应该是架构的执行者,不是设计者;⑤忽略升级成本:选了需要逐个大版本升级的框架(Angular),却没有安排升级预算。

20 常见迁移路径与成本控制

任何技术文档都不应回避「怎么从旧版本过来」。以下是六条最常见的迁移路径,每条都给出可行策略与主要风险。

迁移路径对照

迁移难度策略与要点
Vue 2 → Vue 3先升到 2.7(已内置 Composition API),把新代码写成组合式;再用官方迁移构建版逐个处理废弃项。调查显示超过四分之一的团队在此过程遇到困难,主要来自第三方组件库不兼容——先确认 UI 库是否有 Vue 3 版本,这是最大的阻塞点
AngularJS → Angular不是升级而是重写。可行路径:用 ngUpgrade 让两个框架在同一应用中共存,按模块逐步替换;或保留 AngularJS 并采购第三方延长支持(部分供应商提供到 2030 年)。前者成本高,后者只是延后问题
Angular 19 → 22中(但不可跳版)必须 19→20→21→22 依次 ng update,每次验证并提交。重点关注:独立组件默认、内置控制流迁移、Signals 与 Zoneless 的取舍。停留在 19 及以下已无安全补丁,应视为安全义务
React 类组件 → Hooks低—中可长期共存,逐个组件替换。先转换无状态与简单有状态组件,生命周期复杂的组件最后处理。React Compiler 要求代码遵守可分析规则,迁移时顺便清理不规范的写法
Next.js Pages → App Router两种路由可并存,支持按路由逐步迁移。主要难点是心智模型getServerSideProps → 服务端组件直接取数;getStaticPropsgenerateStaticParams + 缓存;API Routes → Route Handlers 或 Server Actions。建议先在非核心路由试点
Webpack → Vite / RspackVite:配置大幅简化,但需处理 CommonJS 依赖与 Node 内置模块 polyfill。Rspack:对 Webpack 配置高度兼容,迁移成本更低,适合大型遗留工程直迁
Jest → VitestAPI 高度相似,多数断言可直接使用;主要工作是替换模块 mock 语法与移除 Babel 配置。收益是测试配置与构建配置统一
jQuery → 现代框架不要整体重写。策略:用 Vue 3 的渐进式能力,把页面中的独立交互块逐个替换为组件(可 <script> 直接引入,无需构建);或先只在新页面使用框架,老页面维持 jQuery 直到自然下线

21 2026 之后的六个确定性趋势

① Signals 走向语言标准

Angular、Vue(alien-signals)、Solid、Svelte(Runes)、Preact 已全部采用信号模型,TC39 的 Signals 提案在推进。含义:未来切换框架时,响应式的心智模型可以复用——这降低了框架锁定的成本。

② 虚拟 DOM 从「必需」降级为「可选」

Vue 3.6 的 Vapor Mode 是标志性事件:最主流的框架之一官方承认 VDOM 可以不要。预计其他框架会跟进提供类似的编译策略开关,形成「传统模式保兼容 + 编译模式追性能」的双模结构。

③ Rust 工具链成为默认

Vite 8(Rolldown)、Rspack 2、Turbopack、oxc、Oxlint/Biome、TypeScript Go 编译器——构建与检查环节正在被系统级语言全面接管。含义:未来「构建慢」将不再是可以接受的借口。

④ AI 编码代理成为一等用户

Next.js 提供浏览器日志转发与 Agent DevTools,Angular 22 的 MCP 工具链稳定,生态重心从 MCP 转向 Agent Skills。框架开始提供机器可读的错误信息与结构化诊断,而不仅仅是给人看的报错页。

⑤ 安全响应流程化

2025 年底的 RSC 系列漏洞(含 CVSS 10.0)之后,Next.js 从 2026 年 7 月起建立月度安全发布机制,Angular 也在 2026 年夏密集发布安全公告。服务端优先架构扩大了攻击面,安全响应正在从「临时补丁」变为「固定流程」。

⑥ Web 平台补齐,框架必要性下降

原生 CSS 嵌套与 @layer/@scope、View Transitions、Navigation API、容器查询、:has()、Web Components 逐渐成熟。含义:轻量场景(内容站、简单交互)将不再需要重型框架——这与 Astro、Alpine、htmx 的流行互相印证。

21.1 值得关注但尚未定型的方向

Remix 3 的激进实验

脱离 React,改用 Web 平台微包 + 命令式 this.update(),主张为 LLM 时代减负。方向新颖,但缺少生产验证。

框架被基础设施公司收购

Cloudflare 收购 Astro(2026.01)、Anthropic 收购 Bun(2026.01)。框架正在成为云与 AI 公司的战略入口,长期看可能改变中立性。

去中心化治理

React 归入 Linux 基金会(2026.02)、Qwik 转为独立社区治理。治理结构正在成为技术选型的新考量维度。

22 术语表与核心参考

语言与运行时

  • JavaScript:运行在浏览器与 Node.js 上的动态脚本语言,1995 年由 Brendan Eich 用十天写成,1997 年起成为 ECMAScript 标准的实现。它是前端唯一被所有浏览器原生支持的编程语言——无论框架怎么演进,最终都要编译或运行为 JavaScript,本文所说的「框架战争」,本质上都是在 JavaScript 的表达能力与性能约束下做取舍。注意三个常被混用的概念:JavaScript 是语言,ECMAScript 是它遵循的规范,V8 等引擎是规范的实现。
  • ECMAScript(ES / ES6 / ES2015):JavaScript 的官方语言规范,由 ECMA 国际下属的 TC39 委员会制定,新特性需经过 Stage 0 到 Stage 4 五阶段流程才能入标准。2015 年的 ES6(ES2015)是分水岭:let/const、箭头函数、类、模块(ESM)、Promise、解构、模板字符串等一次性补齐,让 JavaScript 从「写特效的脚本」变成能支撑大型工程的语言。此后 TC39 改为每年发布一版(ES2016、ES2017……),本文多个框架的能力(如 Angular 的装饰器、类的字段语法)都依赖特定 ES 版本。
  • TypeScript:微软 2012 年发布的 JavaScript 超集,在 JS 之上增加静态类型系统,编译后类型被擦除、还原为纯 JavaScript。它解决的是大型项目里「改一处崩三处」的问题:类型标注让 IDE 能自动补全与安全重构,编译期就能拦住大量低级错误。2019 年后它几乎成为新项目的默认选择(本文第 16 章专门讲这条演进线),Angular 从 2.0 起就用 TypeScript 写就,Vue 3 与 Svelte 也先后转为 TS 实现。代价是需要维护类型声明(@types 包)与额外的构建配置。
  • 类型安全 / 静态类型:通过编译期类型检查,在代码运行前就发现「把字符串当数字用」这类错误的能力。TypeScript 提供的是「渐进类型」——你可以只给部分代码加类型,这也是它能被庞大的 JavaScript 生态接受的关键。需要清醒认识的是:类型安全不等于运行时安全,类型在编译后被完全擦除,来自接口响应、用户输入的数据仍然必须做运行时校验。本文第 16 章讨论的「类型即文档」,是它在团队协作中最被低估的价值。
  • 泛型:让函数或类型在使用时才确定具体类型参数的机制,写作 Array<T>、Promise<T> 这样的形式。它让「容器类」代码既能复用又保留类型信息——没有泛型时,要么放弃类型(退化成 any),要么为每种类型复制一份实现。在前端框架中,泛型广泛用于组件 props、Hook 返回值与请求函数的封装,是类型系统从「能用」走向「好用」的分界线。
  • 装饰器:一种用 @ 符号给类、方法或属性附加元数据的语法,典型如 Angular 的 @Component、@Injectable。它本质是编译期或运行期的函数包装,常与依赖注入配合使用。值得注意的历史细节:由于 TC39 的装饰器提案长期停留在 Stage 2/3 且多次改版,Angular 选择自己实现一套稳定装饰器;Vue 曾在 2.x 用装饰器写组件、3.x 又退回普通对象写法。这个反复本身就是「标准滞后于实践」的典型案例。
  • ESM(ES Modules):ECMAScript 官方模块系统,用 import/export 语法,随 ES6 引入。它的关键特性是「静态结构」——依赖关系在编译期就能确定,这让 Tree Shaking(摇树优化)与作用域提升成为可能,也是 Vite 开发服务器能按需编译的前提。在此之前社区用 CommonJS(Node)、AMD/UMD(浏览器)各自为政。如今 ESM 已是浏览器与 Node.js 统一的模块标准。
  • CommonJS:Node.js 早期采用的模块规范,用 require() 与 module.exports 同步加载模块。它曾是 npm 生态的事实标准,但因为是运行时动态解析依赖,无法做静态的 Tree Shaking。随着 ESM 普及,纯 CommonJS 的包正逐渐成为历史包袱,也是现代构建工具兼容层里最麻烦的一块(Vite 需要靠依赖预构建来转换它们)。
  • Babel:2014 年由 Sebastian McKenzie 发布的 JavaScript 编译器,作用是把新语法(ES6+、JSX、TypeScript)转译为旧浏览器能跑的 ES5。它以插件化方式实现,配合 @babel/preset-env 与目标浏览器配置决定要降级多少语法。2015 到 2020 年间它是几乎每个项目的标配;随着 esbuild、SWC 等用 Go/Rust 编写的编译器出现,Babel 因性能问题在构建链路中正被逐步替换,但在复杂语法兼容上仍是最后的兜底方案。
  • 转译:把一种高级语言或语法改写为另一种等价形式的过程,典型如 TypeScript 转 JavaScript、JSX 转函数调用、新版 ES 降级为 ES5。它不改变程序语义,只改变表达方式,因此与「编译成机器码」有本质区别。现代前端几乎所有源码都要经过转译才能进浏览器,这条链路的性能直接决定了开发体验的快慢。
  • DOM:Document Object Model,浏览器把 HTML 文档解析成的树形对象结构,JavaScript 通过它读写页面内容与结构。DOM 操作是前端性能的经典瓶颈——它比纯 JS 计算慢几个数量级,读写还会触发重排与重绘。因此「减少并批量化 DOM 操作」成为从 jQuery 到虚拟 DOM 所有方案共同的第一原则;本文反复出现的「直接操作 DOM」与「声明式更新」之争,根源都在这里。
  • Shadow DOM:Web Components 标准的一部分,为元素创建一棵与主文档隔离的子 DOM 树,内部样式与外部互不影响。它解决了组件化最根本的难题——样式与结构的作用域隔离,且是浏览器原生能力、无需框架。代价是调试困难、外部样式穿透需要 ::part 与 ::slotted 等特殊机制,这也是部分团队对 Web Components 敬而远之的原因之一。
  • Web Components:浏览器原生的组件标准,由 Custom Elements(自定义标签)、Shadow DOM(样式隔离)、HTML Templates(模板)三块组成。它最大的优势是「框架无关、浏览器原生」,理论上能终结框架战争;但实践中因为缺少高效的响应式更新机制、服务端渲染支持弱、工具链与生态不足,始终没能成为主流。如今它的现实定位是:作为 Lit 等轻量框架的底座,以及微前端与跨框架组件复用的底层手段。
  • Service Worker:浏览器在后台独立运行的脚本,能够拦截网络请求、做离线缓存与消息推送,是 PWA 的技术核心。它让 Web 应用首次具备「离线可用」与「安装到桌面」的能力。由于它缓存资源的能力很强,也常导致「代码已更新但用户仍看到旧版本」的经典问题,必须配合版本化的缓存策略与更新提示来治理。
  • Web Worker:让 JavaScript 在后台线程运行的机制,避免长任务阻塞主线程导致页面卡顿(掉帧、点不动)。Worker 与主线程通过消息传递通信,不能直接操作 DOM,也没有 window 对象。典型用法是大数据计算、语法高亮、图片处理等 CPU 密集任务,是「把重活挪出主线程」的标准手段。
  • WebView:嵌入在原生 App 内部的浏览器内核组件,用来显示网页内容,是 Hybrid App 与小程序的技术基础。它的能力受系统版本限制(iOS 的 WKWebView、Android 系统 WebView 版本碎片化严重),性能与原生控件存在肉眼可见的差距。这个差距正是本文第 15 章跨端方案四十年反复演进的核心动因。
  • Node.js:2009 年由 Ryan Dahl 发布,把 Chrome 的 V8 引擎搬出浏览器,让 JavaScript 能够写服务端与命令行工具。它的历史意义在于统一了前后端语言,并催生了 npm 生态与整套前端工具链——Webpack、Vite、Babel 全都是跑在 Node 上的程序。本文涉及的所有构建工具与元框架都依赖 Node;Deno 与 Bun 是它的后继挑战者。
  • Deno:Ryan Dahl 在 2018 年发布的 Node.js「修正版」运行时,针对他本人总结的 Node 十大设计遗憾做了改进:默认安全沙箱(显式授权才能读写文件与网络)、原生支持 TypeScript、内置格式化与测试等工具链、全面采用 ESM。因为与 npm 生态不完全兼容,它始终没能取代 Node,但在边缘计算与脚本场景占据了一席之地。
  • Bun:2022 年发布的 JavaScript 运行时,用 Zig 编写,主打极快的启动速度与 All-in-one 的能力——内置包管理器、打包器、测试运行器,目标是同时替代 Node + npm + Jest + Webpack。它兼容大部分 Node API 与 npm 包。值得留意的动向:Bun 在 2026 年 1 月被 Anthropic 收购,引发了社区对其路线中立性的讨论。
  • V8:Google 开发的高性能 JavaScript 引擎,用于 Chrome 浏览器与 Node.js,采用 JIT(即时编译)把 JavaScript 编译为机器码执行,并配合分代垃圾回收与隐藏类优化。它的性能直接决定了 JS 能承担多复杂的任务,也间接让「在浏览器里跑完整应用」这件事成为可能。其他主流引擎还有 Firefox 的 SpiderMonkey 与 Safari 的 JavaScriptCore。
  • AJAX:Asynchronous JavaScript and XML,2005 年由 Jesse James Garrett 命名,指用 XMLHttpRequest 在不刷新页面的情况下与服务器交换数据。它是 Web 2.0 的起点,让网页从「文档」变成「应用」,也直接催生了 jQuery 的流行与后来的单页应用。严格来说今天大家用的是 JSON 配 fetch,但 AJAX 作为这一范式的名字被保留了下来。

渲染架构

  • SPA(单页应用):Single Page Application:首次只加载一个 HTML 外壳,之后所有页面切换都在客户端由 JavaScript 完成,不再向服务器请求完整页面。它带来了接近原生 App 的切换体验,代价是首屏必须下载并执行全部 JS、SEO 与首屏性能变差,并且路由、数据获取、状态管理都要在客户端重新实现一遍。2010 到 2018 年它是绝对主流,此后被 SSR/SSG 与元框架逐步回补。

  • PWA(渐进式 Web 应用):Progressive Web App:用 Service Worker、Web App Manifest 与 HTTPS,让网页具备离线可用、可安装到桌面、消息推送等原生应用能力。2018 年前后被 Google 大力推广,但因 iOS 支持长期不完整、用户找不到入口(不习惯「添加到主屏幕」),始终没能取代原生 App,最终沉淀为一项「锦上添花」的增强能力而非主流形态。

  • SSR(服务端渲染):在服务器上把组件渲染成 HTML 字符串发给浏览器,用户立刻看到内容,随后再加载 JavaScript 完成水合(hydration)。它解决的是 SPA 首屏白屏与 SEO 问题,代价是服务端有额外渲染成本、需要处理数据预取与状态序列化,并且水合期间页面可能出现「看得见但点不动」的窗口期。Next.js 与 Nuxt 的核心价值,正是把这套流程工程化。

  • SSG(静态站点生成):在构建阶段就把页面渲染成静态 HTML 文件,部署到 CDN 上,用户访问时直接返回文件、无需任何服务端计算。它的性能、安全性与成本都是最优解,但只适合内容不频繁变化的场景(文档、博客、营销页)。内容更新需要重新构建整个站点,这个痛点直接催生了下面的 ISR。

  • ISR(增量静态再生):Incremental Static Regeneration:Next.js 提出的折中方案——页面首次按 SSG 生成静态文件,之后在后台按设定的时间间隔(或按需触发)重新生成,兼顾静态的性能与内容的时效性。它让「静态」不再意味着内容无法更新,是内容型站点在 SSG 与 SSR 之间最实用的一档选择。

  • CSR(客户端渲染):HTML 几乎是一具空壳,全部内容由浏览器下载 JavaScript 后再渲染出来。它是 SPA 的默认形态:开发简单、交互流畅,但首屏性能与 SEO 最差,且首屏时间高度依赖 JS 包体积与设备性能。本文把它与 SSR/SSG/ISR 并列为四种渲染时机与位置的策略。

  • Hydration(水合 / 注水):服务端渲染出来的 HTML 只是一张「静态照片」,需要在客户端重新执行组件代码、建立状态并绑定事件监听,这个激活过程就叫水合。它的尴尬之处在于:为了激活页面,客户端仍然要下载并执行完整的组件 JS,因此 SSR 只改善了首屏观感,并没有减少总 JavaScript 量——这个「水合税」正是 Islands 架构、可恢复性与服务端组件等新方案要集中解决的目标。

  • Islands(岛屿架构):页面默认全部是静态 HTML,只有真正需要交互的小块(购物车、搜索框、评论区)被标记为「岛屿」并单独水合。它把水合成本从「整页」压缩到「几个组件」,是 Astro 的核心主张,也是目前性价比最高的一套性能方案。判断标准很简单:如果页面九成是内容、一成是交互,就不该为那一成交互付出整页水合的代价。

  • Resumability(可恢复性):Qwik 提出的激进方案:彻底不做水合。服务端把组件状态与事件处理器的位置序列化进 HTML,客户端加载时「从中断的地方继续执行」,只下载被真正触发的那段交互代码。理论上无论应用多大,首屏 JS 都接近恒定,直接从根上消灭了水合税。代价是心智模型全新、调试困难、生态极小,因此更适合首屏极度敏感的营销页与电商页。

  • RSC(React 服务端组件):只在服务端执行、代码不会下发到浏览器的 React 组件:它们可以直接读数据库、访问文件系统,把渲染结果(而非组件代码)流式传给客户端。它让「服务端逻辑」与「客户端交互」在同一棵组件树里混合,是 React 自 Hooks 以来最大的架构变化。特别注意:RSC 不等于 SSR——RSC 的产物是组件树描述,SSR 的产物是 HTML,两者通常配合使用。

  • PPR(部分预渲染):Partial Prerendering:把页面拆成静态外壳(构建时生成,立即推送给浏览器)与动态内容(请求时渲染,流式填充)两部分。用户先看到完整骨架,动态数据到位后局部更新。它试图同时拿到 SSG 的首屏速度与 SSR 的动态性,是渲染策略演进中「又要又要」的一次认真尝试。

  • 流式渲染:服务端不等所有数据就绪再返回,而是把已就绪的 HTML 分块流式推送给浏览器,配合 Suspense 实现「先到先显示、慢的稍后补」。它显著改善了存在慢数据源场景下的首屏体验,是 React 18+ 与 Next.js App Router 的重要能力,也是把「最慢的接口」从首屏关键路径上摘除的关键手段。

  • 同构渲染:同一套组件代码既能在服务端渲染出 HTML、又能在客户端激活交互,也称 Universal。它避免了「一套服务端模板 + 一套客户端 SPA」的重复开发,但要求代码不能依赖浏览器专有 API(或必须做环境判断与降级),这是所有 SSR 方案的基础假设,也是 SSR 项目最常见的踩坑来源。

  • 微前端:把大型前端应用拆成多个可独立开发、独立部署的子应用,各子应用甚至可以使用不同框架,由容器应用统一集成与路由。它解决的是「多个团队协作一个巨型应用」的组织问题,而不是技术问题。代价是样式隔离、共享依赖、跨应用通信都变得复杂,且容易造成依赖重复加载,因此只适合确实存在多团队并行的场景。

响应式与状态管理

  • 响应式(Reactivity):当数据变化时,依赖它的界面自动更新,而不需要开发者手动去操作 DOM。这是现代框架区别于 jQuery 的根本特征,也是本文贯穿始终的主线之一。实现路径主要有三条:脏检查(AngularJS)、虚拟 DOM diff(React 与 Vue 2)、细粒度依赖追踪(Vue 3 的 Proxy、Solid 与 Svelte 的 Signals)。理解一个框架属于哪条路径,就能预判它的性能特征与调优方式。
  • 双向绑定:视图与数据相互绑定:数据变化驱动界面更新,用户在界面上的输入也自动写回数据(如 ng-model、v-model)。它在表单密集的管理后台里写起来极为爽快,但在大型应用中容易造成「不知道数据究竟在哪个环节被改掉」的调试困境。这正是 React 坚持单向数据流、以及 Vue 在 3.x 中更强调单向传递的重要原因。
  • 单向数据流:数据只能从父组件流向子组件——props 向下传、事件向上抛,任何状态变更都必须走明确的入口(如 dispatch 一个 action、调用一次 setState)。它牺牲了一点点书写便利,换来的是可预测性与可调试性:任何一次界面变化都能追溯到某一次明确的状态变更。这是 Flux/Redux 与 React 最核心的设计主张。
  • MVC / MVP / MVVM:三种经典的界面分层架构,区别主要在于「谁持有视图逻辑、谁负责更新」。MVVM 用 ViewModel 作为 View 与 Model 之间的桥梁,通过数据绑定自动同步两者,典型实现是 Knockout、AngularJS 与 Vue 2,它把开发者从「手动同步 DOM 与数据」中解放出来,是 2010 到 2015 年的主流范式。随着组件化与单向数据流兴起,这三个词在新项目里已很少被提起,但它们的分层思想仍隐含在每个框架里。
  • Flux:Facebook 在 2014 年提出的应用架构思想,核心是「单向数据流 + 集中式 Store」:Action 经 Dispatcher 进入 Store,Store 变更后再驱动 View 更新。它本身不是一个库而是一套约束,Redux 是它最著名的实现,Vuex 也借鉴了同样的思路。它要解决的问题很明确:传统 MVC 在大型应用中数据流双向交织,出问题时根本无法追踪来源。
  • Redux:2015 年由 Dan Abramov 与 Andrew Clark 发布的 Flux 实现,用单一 Store、纯函数 reducer、不可变数据这三件套实现可预测的状态管理,配合时间旅行调试一度成为 React 项目的标配。对它的批评集中在样板代码过多——实现一个功能要在 action、reducer、常量三处来回改。如今官方推荐使用 Redux Toolkit 大幅简化写法,而大量场景已被 Zustand、TanStack Query 等更轻的方案取代。
  • Vuex:Vue 2 时代的官方状态管理库,基于 Flux 思想,用 state、mutations、actions、getters 组织状态。它长期被诟病的两点是:mutations 与 actions 职责重叠(同步改还是异步改的区分令人困惑),以及 TypeScript 支持很弱。Vue 3 时代官方已明确改用 Pinia 作为继任者。
  • Pinia:Vue 3 的官方状态管理库,也是 Vuex 的继任者。它去掉了 mutations,只保留 state、getters、actions,API 更接近普通对象;同时原生支持 TypeScript 类型推断,并且每个 store 独立定义、不再需要嵌套 modules。对于新的 Vue 项目,它应该是默认选择而非可选项。
  • Zustand:轻量的 React 状态管理库:用一个 create() 函数创建 store,通过 Hook 订阅,甚至不需要用 Provider 包裹整个应用。它体现了 React 社区近年明显的「去样板化」趋势——把 Redux 的仪式感压缩到几行代码。适合中小规模的全局状态;非常复杂的场景仍需配合其他方案。
  • Jotai:原子化的 React 状态管理库:状态被拆成一个个独立的 atom,组件只订阅自己真正用到的 atom,因此更新粒度极细、通常无需手动做重渲染优化。它的模型接近 Signals 与 Recoil,适合需要精确控制更新范围、或状态结构天然分散的场景。
  • Recoil:Meta 在 2020 年发布的 React 状态管理实验库,同样采用 atom 与 selector 的原子化模型,支持异步状态与派生状态。它的历史贡献是验证了「细粒度订阅」在 React 中确实可行,为后来的 Signals 浪潮提供了实践依据;但它长期停留在实验状态、维护不活跃,实际项目更常选择 Jotai 或 Zustand。
  • MobX:基于「透明响应式」的状态管理库:用 observable 标记数据、computed 定义派生值,框架自动追踪哪些组件用到了哪些数据,并精确更新。它的心智模型是「像操作普通对象一样改状态,界面自己会更新」,与 Redux 的显式不可变更新形成鲜明对比。这一思路在 Vue 生态是绝对主流,在 React 生态则属于少数派。
  • Signals(信号):一种细粒度响应式原语:每个 signal 是一个可读写的容器,读取它的地方自动成为订阅者,写入时只通知真正读过它的订阅者,从而绕过虚拟 DOM diff 直接定位到要更新的 DOM 节点。2023 年之后它几乎成为全行业共识——Vue 3.6 的 alien-signals、Svelte 5 的 Runes、Angular 的 Signals、Solid 与 Qwik 的自研实现,都不约而同走向同一个方向。本文把它视为继虚拟 DOM 之后的下一代响应式范式。
  • 依赖收集:响应式系统的关键机制:在数据被读取(get)时记录「谁在读我」,在数据被写入(set)时通知这些订阅者。Vue 2 用 Object.defineProperty 拦截读写,Vue 3 与现代框架改用 Proxy,Solid 与 Svelte 则进一步在编译期就把依赖关系确定下来。它是「自动更新」这件事能够成立的技术基础,也决定了各框架在新增属性、数组索引等边界情况下的表现差异。
  • 脏检查:Dirty Checking:AngularJS 的做法——不去追踪具体依赖关系,而是在每次事件后遍历所有 watcher、比较新旧值,反复循环直到数据稳定。它的优点是实现简单、对数据没有侵入;致命缺点是当 watcher 数量上千时性能急剧下降,且循环上限会抛出著名的 digest 迭代错误。这是 AngularJS 被诟病最多的一点,也直接促使 React 与 Vue 用完全不同的方案取而代之。
  • 不可变数据:更新时不修改原对象,而是返回一个新对象(如 […list, item])。它让「数据是否变化」只需比较引用即可判断,极大简化了变更检测——React 的 setState 与 Redux 的 reducer 都依赖这一约定。代价是会产生大量临时对象,因此在深层嵌套结构上需要结构共享(如 Immer 提供的写时复制)来避免深拷贝开销。
  • Hooks:React 16.8(2019)引入的能力:useState、useEffect、useMemo 等让函数组件也能持有状态与副作用,从而取代了绝大多数 class 组件的场景。它彻底改变了 React 的写法与整个生态,并直接影响了 Vue 的 Composition API 与 Svelte 的 Runes 设计。代价是引入了闭包陷阱、依赖数组与调用顺序等必须遵守的规则,至今仍是新手最容易踩坑的地方。
  • Context:React 内置的跨层级数据传递机制:用 Provider 提供值、useContext 消费,避免逐层透传 props。它非常适合主题、语言、当前登录用户这类低频变化的数据;但对于高频变化的状态,Context 更新会导致所有消费者一起重渲染,性能不如细粒度的状态库。把它当成「轻量版 Redux」来用是最常见的误用。

框架与元框架

  • jQuery:2006 年 John Resig 发布的 JavaScript 库,用类似 $(selector) 的统一选择器抹平各浏览器的 DOM 操作差异,并提供链式调用、事件、动画与 AJAX 封装。在浏览器严重碎片化的年代,它让开发者不必再为 IE 写兼容分支,因此统治了将近十年。它的衰落不是因为做得差,而是因为:浏览器标准化之后「抹平差异」的价值消失了,同时 SPA 需要的是状态驱动的声明式更新,而非一步步操作 DOM 的命令式写法。
  • Backbone:2010 年 Jeremy Ashkenas 发布的轻量 MVC 库,提供 Model、Collection、View、Router 与事件系统,是最早让前端代码具备结构的方案之一。它的哲学是「只给骨架、不做绑定」——视图更新仍然要开发者手写,因此在 AngularJS 与 React 相继出现后迅速被取代,但它确立的「前端也要有 Model 与 Router」的观念影响深远。
  • Knockout:2010 年发布的 MVVM 库,以「声明式绑定 + 依赖追踪的 observable」著称,是最早把数据绑定做扎实的方案。它的 observable 思想深刻影响了后来的 Vue 与 MobX——可以说 Vue 的响应式系统里能看到 Knockout 的影子。因性能模型与生态规模的限制,它未能延续到下一个时代。
  • Ember:2011 年发布的「约定优于配置」全栈式框架,由 Rails 核心贡献者 Yehuda Katz 等人创建,内置路由、数据层(Ember Data)、CLI 与极其严格的升级路径。它的强约定让大团队能长期保持一致,代价是学习成本高、灵活性低。它是「元框架」思路最早的完整实践——本文第 10 章讨论的 Next.js 与 Nuxt,许多理念都能追溯到 Ember。
  • AngularJS(Angular 1.x):Angular 1.x 的专有叫法(2010—2016),与 2016 年之后重写的 Angular 2+ 是两个完全不兼容的产品,这也是前端史上最著名的一次断裂式升级。它以双向绑定、依赖注入与指令(directive)著称,是第一个让「用增强的 HTML 写应用」成为主流的框架。2018 年进入长期支持阶段,2022 年正式停止支持。
  • Angular(2+):Google 主导的全能型前端框架,2016 年在 AngularJS 之上彻底重写而来:TypeScript 优先、组件化、依赖注入、RxJS 深度集成。它每 6 个月发布一个大版本,到 2026 年已发布至 22,并改为 12 个月周期;需要注意的是 19 及更早版本已经结束支持,升级必须按 19→20→21→22 逐版本进行,不可跳版。它的优势是「开箱即用的完整方案」与强约定,适合大型企业与长期维护项目;代价是学习曲线陡峭、历史包袱重。
  • React:Meta(Facebook)2013 年开源的 UI 库,核心主张是「界面是状态的函数」与单向数据流,用虚拟 DOM 加 diff 把声明式描述转换成最小 DOM 操作。它的四次架构跃迁构成本文第 6 章的主线:Fiber(16)、Hooks(16.8)、并发渲染(18)、服务端组件(19)。React 只解决视图层,路由、状态、数据请求全部交给生态,因此极度灵活但选型成本高。2026 年 2 月 React 归入 Linux 基金会,治理结构发生实质变化。
  • Vue:尤雨溪 2014 年发布的渐进式框架,核心主张是「可以只用一部分,也可以全用」——从在老页面里引入一个 script 增强局部交互,到完整 SPA,都不需要推翻重来。它用模板语法加响应式系统显著降低了上手门槛:2.x 采用虚拟 DOM,3.x 改用 Proxy 响应式并引入 Composition API,3.6 起提供可跳过虚拟 DOM 的 Vapor Mode。它在中国与欧洲的中小企业中份额很高,而文档质量是它最被公认的竞争力。
  • Svelte:Rich Harris 2016 年提出的「把框架编译掉」的思路:没有运行时虚拟 DOM,组件在构建阶段就被编译成直接操作 DOM 的原生代码,因此包体积极小、运行时开销极低。2024 年 10 月 Svelte 5 正式发布,引入 Runes 作为显式响应式原语,这是一次不兼容的范式升级。配套的 SvelteKit 是它的官方元框架。它的理念深刻影响了后来的 Vue Vapor Mode。
  • Solid:Ryan Carniato 创建的细粒度响应式框架:语法神似 React(JSX 加 Hooks 风格写法),底层却完全不同——组件只在初始化时执行一次,之后依靠 Signals 精确更新 DOM,既没有虚拟 DOM 也没有重渲染概念。它在各类性能基准中长期名列前茅,代价是生态规模与工具链成熟度远不及三大框架。
  • Qwik:Builder.io 推出的框架,主打可恢复性(Resumability):不做水合,把状态与事件处理器位置序列化进 HTML,首屏 JavaScript 量接近恒定。它解决的是「应用越大首屏越慢」这一根本矛盾,但心智模型与调试方式都是全新的,且 2025 年末转为独立社区治理。适合对首屏时间极度敏感的营销页与电商页。
  • Preact:React 的 3KB 轻量替代品,API 高度兼容——通过 preact/compat 可以直接运行大量 React 生态库,代价是去掉了 React 中较少使用的部分(如合成事件系统)。它适合体积敏感的场景,或需要把组件嵌入第三方页面的情况,也是 Astro 等框架推荐的选项之一。
  • Lit:Google 推出的轻量库,构建在 Web Components 标准之上,提供响应式属性与高效的模板更新(基于 tagged template)。它的定位是「浏览器原生的组件层」:产物是标准自定义元素,因此可以被任何框架甚至纯 HTML 页面直接复用,常用于设计系统、微前端集成与嵌入式组件。
  • Alpine:极轻量的「HTML 增强」库,让你直接在标签上写 x-data、x-on:click 这类属性来实现交互,完全不需要构建步骤。它被称为「Tailwind 时代的 jQuery」——非常适合给服务端渲染的页面加一点点交互(下拉菜单、弹窗、Tab 切换),但不适合构建复杂 SPA。
  • 元框架:Meta-framework:建立在某个 UI 框架之上、补齐路由、数据加载、渲染模式与部署能力的上层框架,例如 React 之上的 Next.js 与 Remix、Vue 之上的 Nuxt、Svelte 之上的 SvelteKit。2020 年之后,前端的主要创新从框架本身转移到了元框架层——「选 React 还是 Vue」的重要性下降,「选哪个元框架」反而成为真正的架构决策。
  • Next.js:Vercel 维护的 React 元框架,2016 年发布,是最早把 SSR/SSG 工程化、也是目前最主流的 React 生产方案。它先后引入了文件路由、ISR、App Router(基于 RSC)与 Server Actions。需要留意的风险:2025 年底 RSC 相关实现连续曝出高危漏洞(如 CVE-2025-55182),Next.js 自 2026 年 7 月起改为月度安全发布节奏,使用 RSC 的项目应建立跟进安全公告的流程。
  • Nuxt:Vue 生态的元框架,2016 年发布,提供文件路由、SSR/SSG、自动导入与模块生态(Nuxt Modules)。Nuxt 4 进一步强化了目录约定与类型支持,2026 年 3 月的 4.4 版本引入了 Vue Router v5。它是 Vue 项目做服务端渲染时的默认选择,也是 Vue 阵营对抗 Next.js 的主力。
  • Remix:由 React Router 团队创建的 React 元框架,主张「拥抱 Web 标准」——用 HTML form 与 HTTP 语义表达数据变更,用 loader 与 action 处理数据读写,因此天然支持渐进增强:即使 JavaScript 尚未加载完成,表单依然可用。Remix v2 之后与 React Router v7 走上合并路线,强调应用的韧性与简单心智模型。
  • SvelteKit:Svelte 的官方元框架,基于 Vite 构建,提供文件路由、SSR/SSG、服务端 load 函数与 form actions。它把 Svelte 的编译期优势延伸到全栈场景,产物体积极小,是内容型站点与性能敏感项目的强力选项,也让 Svelte 从「玩具框架」变成可用的生产方案。
  • Astro:以「内容优先」为定位的元框架,核心是岛屿架构与默认零 JavaScript——页面默认渲染为静态 HTML,只有显式标记了 client 指令的组件才会下发 JS。它最大的特色是支持在同一页面里混用 React、Vue、Svelte、Solid 的组件。2026 年 1 月被 Cloudflare 收购。它适合博客、文档、营销站等内容型站点,是本文第 19 章在「内容为主」场景下的首推。
  • TanStack:一个以「无头(headless)、框架无关、类型安全」著称的工具库家族,包含 TanStack Query(数据请求与缓存)、TanStack Router(类型安全路由)、TanStack Table 与 TanStack Start(全栈框架)等。它的走红反映了一个明确的生态趋势:把逻辑与界面彻底解耦,让同一套能力同时服务 React、Vue、Solid 等多个框架。
  • Vapor Mode:Vue 3.6 引入的编译策略:组件可以绕过虚拟 DOM,被直接编译为精确的 DOM 操作指令,性能与内存占用接近 Solid 与 Svelte,同时模板语法完全不变。它的意义在于——虚拟 DOM 首次成为主流框架里的「可选项」,开发者可以按组件粒度决定是否启用。本文把它列为 2026 年最重要的架构信号。
  • Runes(符文):Svelte 5 的显式响应式原语,以 $ 符号开头:state 表示状态、derived 表示派生值、effect 表示副作用、props 表示组件属性等。它取代了 Svelte 4 那种「靠编译器猜测哪个 let 声明是状态」的隐式魔法,让响应式边界显式可控、也更容易被工具分析,代价是升级到 Svelte 5 需要改写组件代码。
  • Zoneless(无 Zone):Angular 移除 zone.js 的现代化方案:不再靠拦截所有异步事件来「猜测何时需要变更检测」,而是用 Signals 显式通知框架哪里发生了变化。它显著减少了无谓的检查次数、降低包体积、改善调试体验,是 Angular 近年最重要的性能改进,也标志着 Angular 在响应式路线上与 Signals 阵营合流。
  • Zone.js:Angular 用来实现自动变更检测的库:它给浏览器几乎所有异步 API(setTimeout、事件监听、Promise、XHR)打上补丁,任务结束后通知 Angular 跑一遍变更检测。这个设计让开发者「什么都不用做界面就会更新」,代价是性能不可控、调试调用栈变深、与部分第三方库冲突。它最终被 Zoneless 方案取代。
  • 依赖注入(DI):组件不自己创建所依赖的对象(如 HttpClient),而是声明「我需要什么」,由框架在构造时把依赖注入进来。它让代码与具体实现解耦,便于单元测试(可以注入 mock)与运行时替换。Angular 从 1.x 起就把依赖注入作为核心机制,这也是它与 React、Vue 在设计哲学上最显著的差异之一。
  • RxJS:Reactive Extensions for JavaScript:基于 Observable 的响应式编程库,提供 map、switchMap、debounceTime 等上百个操作符来编排异步流。Angular 深度集成它(HttpClient 直接返回 Observable),它非常擅长处理复杂的异步场景,如搜索防抖、请求竞态取消、多数据源合并。但操作符数量庞大、调试困难,也是 Angular 被认为难上手的主要原因之一。
  • Observable:表示一个「随时间推移可以产生多个值」的数据流,可以被订阅,并支持变换、过滤与组合。它与 Promise 的关键区别是:Promise 只产生一个结果且创建后立即执行,Observable 可以产生多个值且通常是惰性的(只有被订阅才执行),还能取消。它是 RxJS 的核心抽象。
  • 指令(Directive):在模板中以属性或标签形式出现、用来给元素附加行为的标记。Angular 中指令分为组件指令、结构指令与属性指令(如条件渲染与列表循环);Vue 中则以 v- 前缀出现(v-if、v-for、v-model)。它是「声明式」思想的具体载体——开发者描述想要什么效果,而不是一步步指挥 DOM 怎么做。
  • 管道(Pipe):在模板中对数据进行格式化展示的机制,Angular 称 Pipe、Vue 中也有同名概念,写法如把价格套上货币格式。它把展示层的格式化逻辑从组件代码中抽离出来,让模板保持简洁。需要注意的原则是:管道只负责展示,不应该承载业务计算,否则会让逻辑散落在模板里难以测试。
  • 生命周期:组件从创建、挂载、更新到销毁所经历的各个阶段,框架在每个阶段提供钩子供开发者介入(如 mounted、useEffect、onDestroy)。理解生命周期是排查「内存泄漏、重复请求、拿到 undefined 的 DOM」这类问题的关键。各框架的模型差异很大:Vue 有明确的挂载与更新钩子,React 函数组件则把大部分场景统一收敛到 useEffect。
  • 副作用:组件渲染之外的操作:发起网络请求、订阅事件、手动操作 DOM、写本地存储等。声明式框架要求渲染过程是「纯」的(同样的状态必然产出同样的界面),因此副作用必须放在明确的入口(useEffect、watchEffect、onMounted)并且通常需要返回清理函数,否则极易造成内存泄漏或请求竞态。
  • 组件化:把界面拆成独立、可复用、自包含(结构加样式加行为)的单元。它是现代前端的基石,解决了「一个页面几千行 jQuery 代码」的维护灾难。真正的难点从来不在拆分,而在组件之间的通信方式、状态的归属划分,以及复用逻辑的抽象——Hooks 与组合式函数就是为了最后一件事而诞生的。
  • Fiber:React 16(2017)重写的内部调度架构,把渲染工作拆成一个个可中断、可恢复、可设置优先级的单元(fiber 节点)。它解决的是「庞大的组件树一次性渲染会长时间占用主线程」的问题,为后来的并发渲染、Suspense 与时间切片打下基础。这是一次几乎不改动公开 API 的内部重构,被公认为 React 团队最成功的架构决策。
  • Suspense:React 提供的声明式加载边界:组件在等待异步内容(代码或数据)时,由最近的 Suspense 边界显示占位内容,就绪后自动切换。它把「加载状态」从每个组件内部的手写判断,提升为组件树上的一层声明,配合流式服务端渲染与 RSC 使用时效果最佳。
  • 并发渲染:React 18 的核心能力:允许渲染过程被中断、恢复、跳过或按优先级重新排序,从而让「响应用户输入」优先于「执行大量计算」。它通过 useTransition 与 useDeferredValue 等 API 暴露给开发者。需要准确理解的是:并发渲染改变的是调度方式,它并不让渲染本身变快,而是让卡顿变得不可见。
  • JSX:JavaScript 的语法扩展,允许在 JS 代码中直接书写类 HTML 的标签结构,编译后变成普通的函数调用。它让「结构」与「逻辑」写在同一处,争议一直很大,但确实显著提升了组件的表达能力。Vue 与 Solid 同样支持 JSX,只是它们各自更推荐使用模板语法。
  • Portal(传送门):把组件渲染到 DOM 树的另一个位置(通常是 body 下),但逻辑上它仍然属于原来的组件树,因此事件冒泡与上下文传递照常工作。它解决了弹窗、抽屉、悬浮提示被父级容器的溢出隐藏或层级上下文裁切的经典问题。Vue 中的对应概念叫 Teleport。
  • 渐进式:Vue 的核心设计主张:框架可以逐层采用,从在老页面里引入一个 script 增强局部交互,一路用到完整的单页应用,都不需要推翻重来。它大幅降低了采用门槛,是 Vue 能在中小企业快速普及的关键。含义相近但不同的词是「渐进增强」——先保证基础功能可用,再叠加高级能力。
  • 声明式:描述「界面应该长什么样」,由框架负责把它变成现实;与之相对的是命令式。声明式是 React、Vue、Svelte 的共同基础,它让界面与状态一一对应,因而可以被推导、测试与优化。代价是开发者失去了对更新时机的精确控制,必须理解框架的重渲染规则才能做性能优化。
  • 命令式:直接描述操作步骤——选中这个节点、改它的文本、给它加个类名,jQuery 就是典型代表。它的优势是直观、完全可控、没有框架开销;劣势是当状态变多时,需要手动同步的地方呈指数增长,稍有遗漏就会出现界面与数据不一致。
  • 函数式:把计算视为函数的组合,尽量避免共享状态与副作用的编程范式。在前端的具体体现是:纯函数组件、不可变数据、用 Hooks 组合复用逻辑。它提升了代码的可测试性与可推理性,React 那句「界面是状态的函数」正是这一思想的直接产物。
  • 约定优于配置:框架预设一套目录结构与命名规则,开发者只要按约定放文件就能自动获得路由、布局等能力,无需编写配置文件。Ember 与 Rails 是早期代表,Next.js 与 Nuxt 的文件路由是现代代表。它大幅提升开发效率,代价是「不按约定就要绕开框架」,灵活性被约束。

构建工具链

  • Webpack:2012 年发布、2015 年后成为事实标准的模块打包器,以 loader 与 plugin 机制把 JS、CSS、图片等一切资源都当作模块处理,并提供了代码分割、热更新、Tree Shaking 等关键能力。它的强大与复杂是一体两面:配置文件繁琐、大型项目构建缓慢,而这正是后来 Vite 与 esbuild 能够崛起的直接原因。

  • Vite:尤雨溪 2020 年发布的构建工具:开发时利用浏览器原生 ESM 按需编译,不需要先把整个应用打包完,因此冷启动与热更新都极快;生产构建则使用 Rollup。它重新定义了前端的开发体验,并成为 Vue、Svelte、Solid 等框架的默认工具。Vite 8 起改用 Rust 编写的 Rolldown 作为统一内核,消除开发与生产两套引擎的差异。

  • Rollup:专注于库打包的构建工具,以输出产物干净、Tree Shaking 效果好著称。它是 Vite 生产构建的默认内核,也是众多开源库的打包选择。它不太适合直接用于应用开发(缺少开发服务器等配套能力),但作为被嵌入的「打包引擎」被广泛使用。

  • esbuild:用 Go 编写的极快打包器与转译器,因为直接编译为原生代码且高度并行,速度通常比 Webpack 与 Babel 快一到两个数量级。它的意义在于证明了「换一门语言重写工具链」能带来数量级的性能提升,直接启发了后来的 Rust 系工具(Rspack、Rolldown、Turbopack)。在 Vite 中它常用于依赖预构建与 TypeScript 转译。

  • Rspack:字节跳动开源的 Rust 版打包器,高度兼容 Webpack 的配置与插件生态,主打「配置基本不用改、构建速度快 5 到 10 倍」。对于有大量存量 Webpack 配置的大型项目,它是迁移成本最低的提速方案。2026 年已发布 2.x 版本。

  • Turbopack:Vercel 用 Rust 编写的打包器,定位为 Webpack 的继任者与 Next.js 的默认构建引擎。它针对增量计算做了深度优化(函数级缓存),目标是让项目无论多大,更新耗时都接近恒定。目前主要在 Next.js 生态内使用。

  • Rolldown:用 Rust 编写的 Rollup 兼容打包器,由 Vue/Vite 团队主导,目标是成为 Vite 统一的开发与生产内核,从而消除「开发用 ESM 按需编译、生产用 Rollup 打包」这种双引擎带来的行为差异。Vite 8 已将其设为默认,Rolldown 1.0 于 2026 年 5 月发布。

  • Parcel:零配置打包器,主打开箱即用——不需要写配置文件,自动识别并处理各类资源。它在 2018 年前后以极低的上手门槛著称,但在需要深度定制的大型项目中不如 Webpack 灵活;随着 Vite 出现(同样易用但更快、生态更好),它逐渐被边缘化。

  • Grunt:2012 年前后的任务运行器,用配置对象描述压缩、合并、编译等一系列任务。它正式开启了前端工程化的序幕,但因为配置冗长、且任务之间靠临时文件传递中间结果(很慢),很快被后来的 Gulp 取代。

  • Gulp:基于流(stream)的任务运行器:用代码而非配置描述构建流程,中间结果在内存中传递,因此比 Grunt 明显更快。它在 2014 到 2016 年是主流方案,但随着 Webpack 把「打包」这件事整体接管,单纯的任务编排需求减少,Gulp 逐步退场。

  • Browserify:2011 年发布的工具,让 Node.js 风格的 require 语法能在浏览器中直接使用,从而把 npm 生态第一次带进前端。它是前端模块化进程中的关键一步,也是 Webpack 出现之前最主流的打包方案。

  • HMR(热模块替换):Hot Module Replacement:修改代码后不刷新整个页面,只替换发生变化的模块,并尽量保留应用当前状态(已填写的表单、组件内部状态)。它极大提升了开发效率,是现代开发服务器的核心能力,也是开发者体感上最明显的体验差异来源。

  • Tree Shaking(摇树优化):基于 ESM 静态结构的分析,把没有被真正 import 的导出从最终产物中剔除,就像摇动树木把枯叶摇下来。它依赖 ESM(CommonJS 无法静态分析),并且要求库正确声明副作用标记。它是「引入一个库却不会让包体积失控」的技术基础。

  • 代码分割:把打包产物按路由或组件拆成多个文件,访问时只加载当前需要的那一部分。它解决了单页应用「首屏必须下载整个应用」的问题,是首屏性能优化最有效的手段之一,通常通过动态 import 语法配合框架级懒加载实现。

  • 懒加载:资源(代码、图片、组件)在真正需要时才加载,而不是一开始全部下载。它是代码分割的目的所在,常见用法是路由级懒加载与图片延迟加载。需要注意过度懒加载会造成「点击后要等待」的卡顿感,必须与预取策略一起权衡。

  • 冷启动:开发服务器从启动到可用所耗费的时间。传统的打包式工具需要先把整个应用打包完才能启动,项目越大越慢;而 Vite 这类按需编译的工具几乎瞬间启动。冷启动时间直接决定开发者的日常体感,是 Vite 能够迅速取代 Webpack 的关键原因之一。

样式方案

  • Sass / SCSS:最成熟的 CSS 预处理器,提供变量、嵌套、mixin、函数与模块化能力,让 CSS 具备基本的编程能力。它曾是大型项目的标配;随着 CSS 原生支持自定义属性(变量)与嵌套语法,以及原子化方案兴起,它的必要性在下降,但在海量存量项目中仍是主流。
  • Less:另一个 CSS 预处理器,语法比 Sass 更接近原生 CSS、上手更简单,早期因为被 Bootstrap 采用而广泛流行。随着 Sass 与 PostCSS 的竞争,以及原生 CSS 能力的补强,它在新项目中的使用率持续下降。
  • PostCSS:用 JavaScript 插件处理 CSS 的平台:它本身什么也不做,能力完全来自插件,例如自动添加浏览器前缀、语法降级、展开嵌套、支持未来语法。它通常作为 Tailwind 或 Sass 之外的底层处理层,存在于构建链路中被间接使用。
  • CSS Modules:一种默认局部作用域的 CSS 方案:构建时把类名编译成唯一哈希值,从根本上避免全局类名冲突。它没有运行时开销、可生成类型定义供 TypeScript 使用,是在「保持原生 CSS 写法」与「获得样式隔离」之间最平衡的折中方案。
  • CSS-in-JS:把样式写进 JavaScript 代码里(如 styled-components、Emotion),借助 JS 的能力实现动态样式、主题切换与按需注入。它的优势是样式与组件同生共死、天然无全局污染;代价是存在运行时开销、服务端渲染配置复杂。随着零运行时的编译型方案成熟,它的热度已明显回落。
  • Tailwind CSS:原子化 CSS 框架:提供大量单一职责的工具类,直接在标记中组合出需要的样式。它的真正价值并不在于「少写 CSS」,而在于消除命名负担与设计不一致——样式被约束在一套设计令牌之内,团队产出因此天然统一。主要争议是标记层变得冗长、可读性下降。
  • UnoCSS:按需生成的原子化 CSS 引擎,比 Tailwind 更灵活(支持完全自定义规则与预设),并且由于是即时生成而非预生成,产物更小、构建更快。它由 Vue 社区的 Anthony Fu 创建,代表原子化思路的进一步演进。
  • 原子化 CSS:每个类名只做一件事(一个属性对应一个值),通过组合而非新写规则来得到最终样式。它让 CSS 总体积趋于收敛——因为复用度极高,新增功能几乎不再增加样式体积。代价是标记层变长,需要配套工具与团队规范来约束。
  • BEM:Block、Element、Modifier 的缩写,一种 CSS 命名约定,写法如 块__元素–修饰符。它在全局 CSS 时代用命名规范人为制造出作用域与语义关系,曾是大型项目的主流规范。随着 CSS Modules、CSS-in-JS 与原子化方案提供了真正的作用域隔离,BEM 的必要性下降,但它的块层思想仍有价值。
  • Design Tokens(设计令牌):把颜色、间距、字号、圆角、阴影等设计决策抽象为与平台无关的变量(通常是 JSON 描述),再编译输出到 Web、iOS、Android 以及设计工具中。它解决了设计与代码长期不一致的根源问题——设计稿改了主色,各端只需重新编译令牌即可同步。它是设计系统真正落地的技术基础。

路由与数据请求

  • 路由(Router):把 URL 映射到对应界面或组件的机制。前端路由在单页应用中通过 History API 拦截地址变化、不刷新页面地切换视图,并支持嵌套路由、路径参数、导航守卫与数据预加载。它与数据请求并称为单页应用的两条主动脉。
  • React Router:React 生态事实上的标准路由库,历经 v4 的「路由即组件」重写、v6 的嵌套路由与 Hooks 化,到 v7 与 Remix 合流、具备数据加载与服务端能力。它的演进本身就是理解 React 单页应用架构变迁的一个缩影。
  • Vue Router:Vue 官方路由库,提供嵌套路由、动态路由、导航守卫与路由级懒加载,并与 Vue 的响应式系统深度配合。Nuxt 4.4 起引入 Vue Router v5。它是 Vue 单页应用的标配,也是理解 Vue 生态约定的入口之一。
  • REST:一种基于 HTTP 的资源导向接口风格:用 URL 表示资源、用请求方法表示操作、用状态码表示结果。它简单、可缓存、与 Web 基础设施天然契合,至今仍是绝大多数项目的默认选择。主要痛点是接口返回粒度固定,容易出现数据取不足或取过多的情况。
  • GraphQL:Facebook 2015 年开源的查询语言:客户端在一个请求里精确声明需要哪些字段,服务端严格按声明返回,从根本上解决过度获取与请求瀑布的问题。它带来强类型 Schema 与自省能力,但也引入了缓存复杂、N+1 查询、权限粒度难控制等新难题,因此更适合多端消费且字段差异大的场景。
  • tRPC:让 TypeScript 前后端共享类型定义、客户端直接调用服务端函数而无需手写接口层的方案。它把「API 契约」从运行时约定变成了编译期保证,极大提升了全栈 TypeScript 项目的开发体验,但要求前后端同语言、通常同仓库,适用范围有限。
  • 乐观更新:在发起写操作时先假定成功、立即更新界面,待服务端确认失败后再回滚并提示用户。它让界面交互达到「零延迟」的质感,是提升体验的关键技巧,但必须妥善处理失败回滚、并发冲突与重复提交,否则会造成界面与服务端数据长期不一致。

跨端方案

  • 跨端:用一套代码覆盖多个端(Web、iOS、Android、桌面、小程序)的目标。过去四十年出现过编译型、桥接型、WebView 型、容器型等多条路线,共同难题始终是三点:性能与原生体验的差距、原生能力的覆盖度,以及「一套代码适配所有端」最终往往演变成「为每个端单独写适配代码」。
  • React Native:Meta 2015 年发布的跨端框架:用 React 的写法描述界面,但渲染的是真正的原生组件(而非网页),通过桥接或 JSI 与原生模块通信。它让 Web 开发者能够产出接近原生体验的 App,是「一次学习、多处编写」的代表。代价是深度使用原生能力时仍需编写原生代码,且版本升级的兼容性问题长期突出。
  • Flutter:Google 2017 年发布的 UI 工具包,使用 Dart 语言,自带渲染引擎直接绘制界面,不依赖平台原生控件。它的优势是各端表现完全一致、性能接近原生;代价是不使用平台原生组件(观感可能与系统不一致)、产物体积较大,且团队需要学习 Dart。
  • Electron:用 Web 技术(Chromium 加 Node.js)构建桌面应用的框架,VS Code、Slack、Discord 都基于它。优势是 Web 开发者几乎零门槛就能产出跨平台桌面应用;代价非常直白——每个应用都打包了一整个 Chromium,内存占用与安装包体积都很大。
  • Tauri:Electron 的轻量替代方案:用操作系统自带的 WebView 渲染界面、用 Rust 编写后端逻辑,产物体积与内存占用通常只有 Electron 的十分之一量级。代价是需要引入 Rust 工具链,且不同系统的 WebView 版本差异会带来兼容性问题。
  • Capacitor / Ionic:Ionic 是基于 Web 组件的跨端 UI 组件库,Capacitor 是其配套的运行时容器,负责把 Web 应用打包进原生 WebView 并暴露原生 API 给 JavaScript 调用。它们是 WebView 路线的现代形态,适合内容型、表单类、对原生性能要求不高的应用。
  • Cordova:早期把 Web 应用打包成原生 App 的开源容器(前身是 PhoneGap),通过插件机制调用摄像头、通讯录等原生能力。它正式开启了混合应用的时代,但因 WebView 的性能与体验差距明显,逐渐被 React Native、Flutter 与小程序取代。
  • 小程序:运行于超级 App(微信、支付宝等)内部的轻量应用形态,使用自有的 DSL 与双线程架构(逻辑层与渲染层分离),兼具 Web 的发布效率与接近原生的体验。它在中国市场极端重要,也因此催生了下面这些「一套代码编译到多个小程序平台」的方案。
  • uni-app / Taro:国内的「一套代码编译到多端」方案:uni-app 基于 Vue 语法,Taro 早期基于 React 语法,都能输出小程序、H5、App 等多端产物。它们解决的是国内特有的多端碎片化现实问题,代价是必须严格遵循框架约束,且深度依赖编译器做兼容性处理。
  • Weex:阿里巴巴开源的跨端方案,用 Vue 语法编写、渲染到原生组件,曾被视为 React Native 的有力竞争者。因后续维护投入不足与生态萎缩,它最终被捐赠给 Apache 并逐渐停止活跃开发,是跨端路线中「投入巨大但未能持续」的典型案例。

工程化与质量

  • ESLint:可配置的 JavaScript 与 TypeScript 静态检查工具,通过规则集发现潜在错误、风格问题与不安全写法,并支持自动修复。它是团队代码质量的第一道防线,配合社区共享配置(如 Airbnb 规范)可以在几天内统一全团队的编码风格。
  • Prettier:有主见的代码格式化工具:它不讨论「怎样更好看」,只强制推行一种格式,从而彻底终结团队中关于缩进、换行与引号的无休止争论。它与 ESLint 有明确分工——ESLint 管代码对不对,Prettier 管代码好不好看,两者配合时需要配置以避免规则冲突。
  • Jest:Meta 出品的测试框架,内置断言、Mock、覆盖率统计与快照测试,曾长期是前端测试的事实标准。它的优势是开箱即用;劣势是在 ESM 与 TypeScript 场景下配置繁琐、执行速度偏慢,因此 Vite 生态中的大量项目已改用 Vitest。
  • Vitest:基于 Vite 的测试框架,直接复用 Vite 的转译能力与配置文件,因此启动极快、且与项目构建配置天然一致,同时兼容大部分 Jest 的 API。它是「工具链统一」这一趋势的典型产物,也是当前 Vite 项目的默认测试选择。
  • Cypress:端到端测试工具,在真实浏览器中运行测试,提供时间旅行调试与自动等待机制,特别擅长验证「用户真实的完整操作路径」。它的开发体验优秀,但只能在 Chromium 系与 Firefox 上运行,且大规模并行执行的成本较高。
  • Playwright:微软推出的端到端测试工具,支持 Chromium、Firefox、WebKit 三大引擎与多语言 API,提供自动等待、网络拦截、移动端模拟,并内置 Trace Viewer 便于定位失败原因。它已成为新项目端到端测试的主流选择。
  • Monorepo(单体仓库):把多个包或多个应用放在同一个代码仓库中统一管理,配合工作区机制实现依赖共享、统一构建与原子化提交。它解决了多仓库协作中「改一个库要发布三次才能验证」的痛苦,代价是需要额外工具(Turborepo、Nx 或 pnpm workspace)以及更精细的持续集成设计。
  • 包管理器(npm / yarn / pnpm):JavaScript 的依赖管理工具三强:npm 是 Node 官方方案与事实标准;yarn 以安装速度与确定性(引入锁文件)起家;pnpm 采用硬链接加符号链接的内容寻址存储,显著节省磁盘空间并天然杜绝幽灵依赖,近年成为新项目与单体仓库的推荐选择。无论选哪个,锁文件都是保证「所有环境装到完全相同版本」的关键,必须提交进仓库。
  • 语义化版本(SemVer):版本号格式为主版本号、次版本号、修订号,约定只有破坏性变更才升主版本号、兼容的新功能升次版本号、问题修复升修订号。它让依赖范围表达式有了明确语义,是整个 npm 生态得以运转的基础契约。现实中 0.x 版本不受此约束,且各库对「什么算破坏性」判断不一,因此锁文件仍然是必需的。
  • Serverless:一种云计算执行模型:开发者只写函数代码,平台负责扩缩容与运维,按实际调用量计费。在前端语境下它通常与边缘函数结合,用于服务端渲染、A/B 分流、鉴权等轻量服务端逻辑,让前端团队无需运维即可拥有服务端能力。代价是冷启动延迟与较强的厂商绑定。
  • 边缘计算(Edge Computing):把计算放到离用户最近的 CDN 节点上执行,从而把网络往返从跨洲级别缩短到同城级别。在前端领域它支撑了边缘服务端渲染、边缘中间件与个性化分发,是 Vercel、Cloudflare 等平台竞相提供的能力,也让「前端工程师写一点服务端逻辑」成为常态。
  • CDN:内容分发网络:把静态资源缓存到遍布全球的节点上,用户就近获取,从而降低访问延迟、减轻源站压力,并天然具备吸收流量峰值的能力。它是静态站点生成方案能够取得极致性能的物理基础,也是现代前端部署中不可或缺的一层。
  • Vercel:Next.js 的母公司,提供面向前端的一体化部署平台——推送代码即部署、自动生成预览环境、全球边缘网络,并深度投入 Turbopack 与 AI 相关工具链。它定义了「前端云平台」这一品类,也是把 React 与 Next.js 生态商业化、并推动其快速迭代的主要力量。
  • Cloudflare:全球性的边缘网络与云服务商,提供 CDN、Workers 边缘函数、R2 对象存储等产品。2026 年 1 月它收购了 Astro,这是「基础设施公司向上收购框架」的标志性事件,也让「框架治理是否中立」成为技术选型时一个新增的考量维度。
版本与支持状态查询
  • Angular:angular.dev/reference/releases(官方发布与支持矩阵)
  • React:react.dev/versions(含 15—19 各版本存档文档与 CHANGELOG)
  • Vue:github.com/vuejs/core/releases(CHANGELOG 最权威)
  • Next.js:nextjs.org/blog(含安全公告)
  • 通用 EOL 查询:endoflife.date
  • 安全公告:各项目 GitHub Security Advisories 页
本文档的使用方式
  • 技术评审:直接引用第 17 章对比矩阵与第 19 章场景推荐
  • 升级决策:对照第 5/6/7/8 章版本表确认当前版本的支持状态
  • 新人培训:第 1—3 章的演进脉络可作为前端史通识材料
  • 性能优化:第 18 章的三层杠杆按 P0→P2 顺序执行

数据说明:本文档版本与日期基于各框架官方发布日志、官方博客、Wikipedia 版本表及 endoflife 数据交叉核对,核实时点为 2026 年 9 月。前端生态迭代极快,次要/补丁版本请以官方 CHANGELOG 为准。

文档结构:全景时间轴 → 时代分期 → 框架族谱 → 各框架版本史与模块生态 → 工程化生态 → 横向对比 → 选型建议 → 未来趋势。
在这里插入图片描述

Logo

一站式 AI 云服务平台

更多推荐