Files
test-repo/docs/zh-cn/appendix/3-browser-and-frontend/frontend-frameworks.md
T
sanbuphy 07d82d046b feat(docs): restructure appendix content into organized directories
- Move standalone AI-related files into 8-artificial-intelligence directory
- Move development tools content into 2-development-tools directory
- Move server/backend content into 4-server-and-backend directory
- Create new index files for each section
- Update .gitignore to exclude old backup directories
- Update theme imports for new component locations
2026-02-15 01:57:52 +08:00

461 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 前端框架对比(React / Vue / Svelte / Angular
::: tip 🎯 核心问题
**为什么网页越来越复杂?前端技术为什么要不断演进?** 这个问题会带你理解从简单网页到现代 Web 应用的技术演变之路。
:::
---
## 1. 为什么要关注前端演进史?
### 1.1 从"电子海报"到"桌面应用"
想象一下你在街上看到的**海报**:
- ✅ 有内容(文字、图片)
- ✅ 有设计(颜色、排版)
- ❌ 但你跟它说话,它不会回应
- ❌ 你点击某个地方,不会发生什么
**最早的网页**就是这样的"电子海报":只能看、不能改、内容固定。
**现代网页**完全不同了。它们像**桌面应用**(VS Code、Figma):
- ✅ 可以编辑文档、画图、玩游戏
- ✅ 实时响应你的每个操作
- ✅ 甚至可以离线工作
**这种转变的核心原因: 网页的功能越来越复杂,需要更高效的技术和开发方式。**
### 1.2 一个生活的比喻:盖房子
前端技术的演进,就像盖房子方式的进化:
| 时代 | 🏠 盖房比喻 | 实际特点 | 优缺点 |
| --------- | ------------------ | ---------------------------- | --------------------------- |
| **2000s** | **贴海报** | 静态网页,写好 HTML 就行 | ✅ 简单 ❌ 不能互动 |
| **2010s** | **请工人手动装修** | jQuery 时代,手动操作每个元素 | ✅ 能互动 ❌ 代码乱、难维护 |
| **2020s** | **用乐高搭房子** | Vue/React 时代,组件化开发 | ✅ 高效、可维护 ❌ 学习曲线 |
::: tip 💡 从表格中你能看到什么?
**阶段一 → 阶段二**: 从"不能动"到"能动"。这是质的飞跃——网页开始有交互,但代价是代码变得混乱。
**阶段二 → 阶段三**: 从"能用"到"好用"。组件化让代码像积木一样可复用,大幅提升开发效率。
**核心思想**: 技术演进不是"为了新而新",而是为了解决上一个阶段的痛点。
:::
---
## 2. 第一阶段:静态网页与"切图"(2000s)
<FrontendEvolutionDemo />
### 2.1 这个时代是什么样的?
**开发方式**:
- 写几个 HTML 文件
- 内嵌一些 CSS 和 JavaScript
- 直接把文件拖到浏览器就能看效果
- 上传文件夹到服务器就完成部署
**特点**:
-**优点**: 简单直接,没有学习成本,写完就能跑
-**缺点**: 无法实现复杂交互,代码一多就乱
::: details 查看当时的项目结构
```
project/
├── index.html
├── login.html
├── css/
│ ├── bootstrap.css
│ └── custom.css
├── js/
│ ├── jquery.js
│ └── app.js
└── images/
```
**遇到的问题**:
1. **全局变量污染**: 所有变量都在全局命名空间,容易互相覆盖
2. **依赖管理混乱**: 必须按正确顺序加载 JS 文件,否则会报错
3. **代码难以复用**: 想复用某个功能,只能复制粘贴
:::
### 2.2 "切图"是什么?
<SliceRequestDemo />
你可能听说过"切图"这个词。它是早期前端的主要工作:
**什么是切图?**
设计师用 Photoshop 设计好页面 → 前端把设计切成小图片 → 用 HTML 把图片拼成页面
**为什么这么慢?**
网页上的每张小图片,浏览器都要发一次**网络请求**。请求越多,加载越慢。
::: tip 💡 雪碧图(Sprite)
为了减少请求数,出现了"雪碧图"技术:把很多小图合成一张大图。
优点是请求数变少,缺点是制作和维护都很麻烦。
这个阶段的教训:**请求太多是性能大敌**。
:::
---
## 3. 第二阶段:jQuery 时代 - "手动搬砖"(2010s)
### 3.1 为什么需要 jQuery?
随着网页变复杂,原生 JavaScript 的问题暴露出来:
-**API 繁琐**: 简单的操作也要写很多代码
-**浏览器兼容**: 不同浏览器的 API 不一样,要写很多兼容代码
-**选择器弱**: 找元素很麻烦
**jQuery** 诞生了。它让 JavaScript 变得简单:
```javascript
// 原生 JavaScript (繁琐)
const element = document.getElementById('title')
// jQuery (简洁)
const element = $('#title')
```
### 3.2 jQuery 的思路:亲手改页面
<JQueryVsStateDemo />
jQuery 的核心思路是**命令式**: 你告诉浏览器"怎么做"。
```javascript
// 找到标题元素
$('#title').text('新标题')
// 找到按钮并禁用
$('#submit-btn').attr('disabled', true)
// 找到列表并添加一项
$('ul').append('<li>新项目</li>')
```
**问题**: 你需要记住页面上有哪些元素,每次数据变化都要手动更新所有相关元素。
::: warning ⚠️ jQuery 的痛点
想象你在做一个购物车:
```javascript
// 用户点击"添加到购物车"
function addToCart() {
cartCount++ // 数据变化
// 你要手动更新所有相关地方
$('#cart-count').text(cartCount) // 右上角小红点
$('#cart-page-count').text(cartCount) // 购物车页面
$('#checkout-price').text(calculatePrice()) // 结算按钮
// 如果漏了一个地方,页面就不一致了!
}
```
**这就是"手动搬砖"的代价**: 容易出错,难以维护。
:::
### 3.3 移动端普及:响应式设计的出现
这个阶段还有一个重要变化:**手机和平板开始流行**。
<ResponsiveGridDemo />
网页必须适配不同屏幕。这需要**响应式布局**: 同一套 HTML/CSS,自动根据屏幕宽度变换布局。
**响应式布局的核心: 媒体查询 (Media Query)**
```css
/* 电脑屏幕(大于 640px) */
@media (min-width: 640px) {
.container {
display: flex;
}
}
/* 手机屏幕(小于 640px) */
@media (max-width: 640px) {
.container {
display: block;
}
}
```
::: tip 💡 响应式就像"智能相框"
想象你在不同房间看同一张照片:
- 在**大客厅**(电脑屏幕),照片可以摆大一些,旁边还能放其他装饰品
- 在**小卧室**(手机屏幕),照片需要缩小,其他装饰品要收起来
**响应式布局**就是"智能相框",它会自动根据房间大小调整展示方式。
:::
---
## 4. 第三阶段:从"手动搬砖"到"数据驱动"(Vue/React)
### 4.1 为什么需要新框架?
jQuery 时代的问题积累到一定程度:
- **代码一多就乱**: 到处都是 DOM 操作,难以维护
- **容易出 bug**: 漏更新一个地方,页面就不一致
- **协作困难**: 多人修改同一个文件,容易冲突
**Vue / React** 的核心思路:**只改数据,页面自动更新**。
### 4.2 Vue/React 的思路:声明式 UI
<ImperativeVsDeclarativeDemo />
**jQuery (命令式)**:
```javascript
// 你要告诉浏览器每一步怎么做
$('#title').text('新标题')
$('#title').css('color', 'red')
$('#title').show()
```
**Vue (声明式)**:
```javascript
// 你只需告诉浏览器"要显示什么"
data() {
return {
title: "新标题",
color: "red",
visible: true
}
}
```
::: tip 💡 命令式 vs 声明式
就像画一幅画:
- **命令式**: 你告诉画家"拿起笔,蘸红颜料,在坐标(10,10)画一个圈"
- **声明式**: 你直接给画家一张照片,"给我画成这样"
Vue/React 就是"声明式": 你描述"页面长什么样",框架负责"怎么把它画出来"。
:::
### 4.3 组件化:像搭乐高一样写页面
**Vue / React** 最强大的特性是**组件化**: 把页面拆成一个个独立的"积木"。
想象一下你在搭乐高:
- 你不需要"从头开始雕刻每一块积木"(从头写 HTML/CSS)
- 你只需要"按说明书把积木拼在一起"(把组件组合起来)
- 每个积木都是**独立的**,你可以在不同的套装里**重复使用**
**组件的好处**:
- **复用**: 写一个"商品卡片"组件,可以用 100 次
- **封装**: 组件内部的状态不影响别人
- **维护**: 修改一个组件,所有用到它的地方都会更新
### 4.4 SPA:单页应用的诞生
<RoutingModeDemo />
**Vue / React** 时代还有一个重要变化:**从 MPA 到 SPA**。
**MPA (Multi-Page Application)**:
- 点一个链接 → 整页刷新 → 显示新页面
- 就像**翻书**: 每翻一页都要把旧书合上、去书架拿新书
**SPA (Single-Page Application)**:
- 点一个链接 → 只刷新内容区域 → 页面不刷新
- 就像**同一本书里换章节**: 只擦掉旧内容、写上新内容
**SPA 的优点**:
-**体验丝滑**: 页面切换快
-**状态好管理**: 输入的内容、滚动位置都在
-**首屏可能慢**: 需要先下载 JavaScript
-**SEO 要额外处理**: 搜索引擎可能抓不到内容(需要 SSR/SSG)
---
## 5. 渲染策略:从 CSR 到 SSR/SSG
<RenderingStrategyDemo />
## 6. 第四阶段:工程化与构建工具(2015s-2020s)
### 6.1 为什么需要"工程化"?
前端项目越来越大,不能再靠"手动引入脚本"。
**工程化**就是用工具和规范,让开发更高效、代码更可靠、协作更顺畅。
::: tip 💡 工程化 = 从"手工作坊"到"现代化工厂"
想象一下你在家做饭 vs 开餐厅:
- **在家做饭**: 想吃什么就做什么,很自由
- **开餐厅**: 需要标准化的菜谱、规范的操作流程、统一的原材料采购
前端开发也一样:
- **小项目**: 怎么写都行
- **大项目**: 需要统一的代码规范、自动化工具、标准化流程
:::
### 6.2 构建工具:Webpack → Vite
**Webpack** (传统):
- 工作方式:**先打包,后服务**
- 启动时: 打包所有代码 → 启动服务器
- 问题:**慢**。项目越大,启动越慢(可能要等 30 秒)
**Vite** (现代):
- 工作方式:**按需编译**
- 启动时: 不打包,直接启动服务器
- 浏览器请求哪个文件,就实时编译哪个
- 优势:**快**。通常 1 秒内启动
| 对比项 | Webpack | Vite | 提升 |
| -------- | ------- | ------ | ------------ |
| 冷启动 | 30s+ | <1s | **快 30 倍** |
| 热更新 | 3-5s | <100ms | **快 30 倍** |
| 配置文件 | 几百行 | 几十行 | **大幅简化** |
::: tip 💡 为什么 Vite 这么快?
**Webpack** 就像**整备家当搬家**:先把所有东西打包,再出门。
**Vite** 就像**轻装旅行**:只带必需品,用到什么再买什么。
在开发环境,大多数时候你只需要修改几个文件,Vite 只编译这几个文件,当然快。
:::
---
## 7. 总结:演进的本质
前端技术的演进,本质上是在解决两个问题:
### 7.1 效率:从手动到自动
| 时代 | 开发方式 | 效率 |
| --------- | ------------------------ | ---------- |
| **2000s** | 手写 HTML/CSS/JS | ⭐ |
| **2010s** | jQuery + 手动 DOM 操作 | ⭐⭐ |
| **2020s** | Vue/React + 数据驱动 | ⭐⭐⭐ |
| **现在** | 组件化 + 工程化 + 自动化 | ⭐⭐⭐⭐⭐ |
### 7.2 规模:从个人到团队
| 时代 | 项目规模 | 协作方式 |
| --------- | ---------- | ----------------------- |
| **2000s** | 几个文件 | 单人就能维护 |
| **2010s** | 几十个文件 | 小团队,容易冲突 |
| **2020s** | 几百个文件 | 中团队,需要规范 |
| **现在** | 几千个文件 | 大团队,需要完整工程体系 |
---
## 8. 学习路线图
### 8.1 如果你是零基础
**第 1 步: HTML/CSS/JavaScript 基础**
- 理解网页的三大基石
- 能写出简单的静态页面
**第 2 步: 学习一个框架(Vue 推荐)**
- 理解"数据驱动"的思想
- 掌握组件化开发
**第 3 步: 实战项目**
- 做一个完整的单页应用
- 熟悉路由、状态管理、API 调用
### 8.2 如果你有基础
**进阶方向**:
- **工程化**: 学习 Vite/Webpack,理解构建流程
- **性能优化**: 学习懒加载、代码分割、缓存策略
- **TypeScript**: 为代码加上类型,提升可靠性
- **服务端渲染**: 学习 Nuxt/Next.js,解决 SEO 和首屏问题
---
## 9. 名词速查表 (Glossary)
| 名词 | 英文 | 用人话解释 |
| ---------------- | ----------------------- | --------------------------------------------- |
| **DOM** | Document Object Model | 文档对象模型。用对象树表示页面,可被 JS 读写。 |
| **jQuery** | - | 早期流行的 JS 库,简化了 DOM 操作。 |
| **Vue/React** | - | 现代前端框架,采用数据驱动和组件化开发。 |
| **组件** | Component | 可复用的 UI 单元,如按钮、卡片、导航栏。 |
| **MPA** | Multi-Page Application | 多页应用。每次跳转都重新加载整个页面。 |
| **SPA** | Single-Page Application | 单页应用。只加载一次,后续切换不刷新页面。 |
| **路由** | Routing | 管理页面之间切换的规则和过程。 |
| **SSR** | Server-Side Rendering | 服务端渲染。服务器生成 HTML 后发给浏览器。 |
| **SSG** | Static Site Generation | 静态站点生成。构建时预渲染页面为静态 HTML。 |
| **Webpack** | - | 传统打包工具,先打包后服务。 |
| **Vite** | - | 现代构建工具,按需编译,速度极快。 |
| **响应式** | Responsive Design | 页面自动适配不同屏幕尺寸的设计。 |
| **媒体查询** | Media Query | CSS 的条件判断,根据屏幕宽度应用不同样式。 |
| **命令式** | Imperative | 告诉程序"怎么做"。 |
| **声明式** | Declarative | 告诉程序"要什么"。 |
| **数据驱动** | Data-Driven | 只修改数据,界面自动更新。 |
| **Tree Shaking** | - | 摇树优化。自动移除未使用的代码,减小包体积。 |
| **代码分割** | Code Splitting | 把代码分成多个小块,按需加载。 |
---
## 总结
前端技术的演进,本质上是**从"手工"到"工业化"的进化**:
- **2000s**: 手工时代,简单直接
- **2010s**: 工具化时代,开始有框架
- **2020s**: 工业化时代,组件化 + 工程化
- **现在**: 智能化时代,AI 辅助开发
理解这个演进,你就能:
- 知道为什么要有 Vue/React
- 理解"数据驱动"的价值
- 明白工程化的必要性
- 快速上手新技术
**下一步建议**:
- 如果你想快速上手,学习 **Vue 3** (推荐) 或 **React**
- 如果你想深入理解,学习 **Vite** 构建流程
- 如果你想提升代码质量,学习 **TypeScript**
祝你学习愉快!