⚛️ React 19 + TypeScript 深度学习笔记 ------ 从组件化思维到 WebGPU 端侧 AI 落地
前言 :2026 年,React 依然是大型前端项目的首选框架。但在 AI 时代,React 的玩法已经完全不同------你不只是在写 UI,而是在用组件搭建智能应用。本文将以两个真实项目为蓝本:一个端侧 AI 大模型浏览器推理 (DeepSeek-R1-WebGPU),一个经典 TodoList 全栈实践,从 0 到 1 深入 React 19 + TypeScript + Vite + TailwindCSS 的现代化技术栈。全文约 8000 字,建议先收藏再阅读。
📋 目录
- [为什么 React 是 AI 时代大型项目的首选](#为什么 React 是 AI 时代大型项目的首选 "#1-%E4%B8%BA%E4%BB%80%E4%B9%88-react-%E6%98%AF-ai-%E6%97%B6%E4%BB%A3%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%E7%9A%84%E9%A6%96%E9%80%89")
- 项目一览:两个实战项目全景
- 技术栈全景图
- [工程化基石:Vite + TypeScript + ESLint](#工程化基石:Vite + TypeScript + ESLint "#4-%E5%B7%A5%E7%A8%8B%E5%8C%96%E5%9F%BA%E7%9F%B3vite--typescript--eslint")
- [JSX:React 最骄傲的特性](#JSX:React 最骄傲的特性 "#5-jsxreact-%E6%9C%80%E9%AA%84%E5%82%B2%E7%9A%84%E7%89%B9%E6%80%A7")
- 组件化思维:函数就是组件
- [React Hooks 深度剖析](#React Hooks 深度剖析 "#7-react-hooks-%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90")
- [TailwindCSS:告别手写 CSS 的时代](#TailwindCSS:告别手写 CSS 的时代 "#8-tailwindcss%E5%91%8A%E5%88%AB%E6%89%8B%E5%86%99-css-%E7%9A%84%E6%97%B6%E4%BB%A3")
- [传统 CSS 的优雅:Todo App 样式全解](#传统 CSS 的优雅:Todo App 样式全解 "#9-%E4%BC%A0%E7%BB%9F-css-%E7%9A%84%E4%BC%98%E9%9B%85todo-app-%E6%A0%B7%E5%BC%8F%E5%85%A8%E8%A7%A3")
- [WebGPU 端侧 AI:浏览器里跑大模型](#WebGPU 端侧 AI:浏览器里跑大模型 "#10-webgpu-%E7%AB%AF%E4%BE%A7-ai%E6%B5%8F%E8%A7%88%E5%99%A8%E9%87%8C%E8%B7%91%E5%A4%A7%E6%A8%A1%E5%9E%8B")
- [AI 时代程序员的 React 学习路线](#AI 时代程序员的 React 学习路线 "#11-ai-%E6%97%B6%E4%BB%A3%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84-react-%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF")
- 总结与展望
1. 为什么 React 是 AI 时代大型项目的首选
🥊 React vs Vue:定位不同
| 维度 | React | Vue |
|---|---|---|
| 入门门槛 | 较高(JSX、Hooks 思维、纯函数心智模型) | 较低(template + script + style 三明治,直觉友好) |
| 项目规模 | 大型项目首选 | 中小型项目更灵活 |
| AI 训练数据 | GitHub 上 React 代码量远超 Vue,AI 对 React 的"理解"更深 | 相对较少 |
| 生态丰富度 | 全球最大组件生态,npm 包数量碾压级领先 | 中文社区活跃但总量偏少 |
| 组件模型 | 函数即组件,极简哲学 | SFC(单文件组件),template/script/style 分离 |
🎯 核心认知 :React 比 Vue 难入门,但 AI 时代这个差距正在缩小------因为 AI 写 React 代码非常强!GitHub 上 React 训练数据量远超 Vue,这意味着你描述需求,AI 能产出更高质量的 React 代码。大型项目 + AI 辅助 = React 是不二之选。
📊 React 的护城河
React 四大护城河:
├── 🧩 组件化:函数即组件,积木式搭建
├── 🔄 响应式:数据驱动视图,告别 DOM 操作
├── 🎣 Hooks:函数式状态管理,逻辑复用利器
└── 🌍 生态:全球最大的前端组件 & 工具链生态
2. 项目一览:两个实战项目全景
🧠 项目一:DeepSeek-R1-WebGPU ------ 浏览器端 AI 推理
ruby
deepseek-r1-webgpu/
├── readme.md # 📖 超详细教学笔记(React/TS/TailwindCSS/WebGPU 全覆盖)
├── webgpu/
│ ├── index.html # HTML 入口
│ ├── vite.config.ts # Vite + React + TailwindCSS 插件配置
│ ├── eslint.config.js # ESLint 代码规范配置
│ ├── tsconfig.json # TypeScript 配置
│ ├── package.json # 依赖:React 19, Vite 8, TailwindCSS
│ └── src/
│ ├── main.tsx # React 应用入口
│ ├── App.tsx # 主组件(WebGPU 检测、UI 布局)
│ ├── App.css # 传统 CSS(Vite 模板风格)
│ └── index.css # TailwindCSS 入口(@import "tailwindcss")
核心亮点:
- 🔥 在浏览器中通过 WebGPU 运行 DeepSeek-R1-Distill-Qwen-1.5B 蒸馏推理模型
- 🤗 使用 HuggingFace Transformers.js + ONNX Runtime Web
- 🔒 数据不出浏览器,完全离线可用,隐私安全
- 🎨 TailwindCSS 原子化 CSS 实现界面布局
✅ 项目二:React Todo App ------ 经典 CRUD 全栈实践
bash
react-todo-app/
├── index.html
├── vite.config.ts
├── package.json # React 19 + Vite 8 + Oxlint
├── src/
│ ├── main.tsx # 应用入口
│ ├── App.tsx # 完整 Todo 逻辑(284 行)
│ ├── App.css # 精美样式(340 行)
│ └── index.css # 全局样式
核心亮点:
- ✅ 完整 CRUD:新增、删除、切换状态、清除已完成
- 💾 localStorage 持久化:刷新不丢失数据
- 🎯 三种筛选:全部 / 进行中 / 已完成
- 🎬 流畅动画:slideIn 入场、slideOut 退场、checkPop 勾选弹跳
- 📱 响应式布局:移动端自适应
3. 技术栈全景图
🔧 核心技术栈(两个项目统一采用)
┌──────────────────────────────────────────────────────┐
│ 技术栈全景图 │
├──────────────────────────────────────────────────────┤
│ │
│ 🏗️ 构建工具 Vite 8 极速 HMR,毫秒级冷启动 │
│ ⚛️ UI 框架 React 19 最新函数式组件 + Hooks │
│ 🔷 类型系统 TypeScript 6 类型安全,AI 友好 │
│ 🎨 样式方案 TailwindCSS 4 原子化 CSS(WebGPU 项目)│
│ 传统 CSS BEM + 动画(Todo 项目) │
│ 📏 代码规范 ESLint 10 团队协作代码风格统一 │
│ 🌐 端侧 AI WebGPU 浏览器 GPU 加速推理 │
│ │
└──────────────────────────────────────────────────────┘
📦 核心依赖详解
| 依赖 | 版本 | 作用 |
|---|---|---|
react |
^19.2.6 | UI 组件库,函数式编程模型 |
react-dom |
^19.2.6 | React 的 DOM 渲染器 |
@vitejs/plugin-react |
^6.0.1 | Vite 的 React 插件(使用 Oxc 编译器) |
typescript |
~6.0.2 | 静态类型检查,AI 辅助编程的基石 |
@tailwindcss/vite |
- | TailwindCSS 的 Vite 插件(原子 CSS 按需生成) |
eslint |
^10.3.0 | 代码风格约束工具 |
4. 工程化基石:Vite + TypeScript + ESLint
⚡ Vite:下一代前端构建工具
typescript
// vite.config.ts ------ 极其简洁的配置
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [react(), tailwindcss()], // 两个插件搞定一切!
})
Vite 的核心优势:
- 🚀 毫秒级冷启动:基于 ESM 的按需编译,不用打包整个应用
- 🔥 HMR 热更新:修改代码,浏览器毫秒级刷新,保持组件状态
- 📦 开箱即用:TS、JSX、CSS 全部原生支持,零配置
- 🧩 插件生态 :React 插件使用 Oxc(Rust 编写),编译速度极快
📖 冷知识 :Vite 提供了两个 React 插件------
@vitejs/plugin-react(基于 Oxc/Rust)和@vitejs/plugin-react-swc(基于 SWC/Rust)。两者都是用 Rust 写的,性能差异不大,官方推荐前者。
🔷 TypeScript:类型安全 = AI 友好
json
// tsconfig.app.json ------ 关键配置解读
{
"compilerOptions": {
"target": "es2023", // 输出最新的 ES 标准
"lib": ["ES2023", "DOM"], // 包含 DOM 类型定义
"module": "esnext", // 使用 ESM 模块系统
"jsx": "react-jsx", // JSX 编译模式(React 19 新 JSX Transform)
"moduleResolution": "bundler", // 模块解析策略:bundler 模式
"allowImportingTsExtensions": true, // 允许 import 时写 .ts/.tsx 后缀
"verbatimModuleSyntax": true, // 强制显式 import type
"noUnusedLocals": true, // 未使用的局部变量报错
"noUnusedParameters": true, // 未使用的参数报错
"erasableSyntaxOnly": true // 只允许可擦除的类型语法(TS 6 新特性)
}
}
为什么 TS 对 AI 编程特别重要?
arduino
AI 生成代码 → TypeScript 类型检查 → 编译报错 → AI 自动修复
↓
类型定义 = AI 的"说明书",生成更精准的代码
🎯 核心认知 :TypeScript 的类型定义就是给 AI 的"上下文说明书"。类型越精确,AI 生成的代码质量越高。这也是为什么大型 AI 项目几乎全是 React + TS 的原因。
📏 ESLint:代码规范的守护者
javascript
// eslint.config.js ------ Flat Config 新格式
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { defineConfig, globalIgnores } from 'eslint/config'
export default defineConfig([
globalIgnores(['dist']), // 忽略构建产物
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended, // JS 基础规则
tseslint.configs.recommended, // TS 规则
reactHooks.configs.flat.recommended, // Hooks 规则(不能条件调用等)
reactRefresh.configs.vite, // Vite HMR 导出约束
],
languageOptions: {
globals: globals.browser, // 浏览器全局变量
},
},
])
5. JSX:React 最骄傲的特性
🤔 什么是 JSX?
JSX = JavaScript with XML ------ 在 JS 代码里直接写 HTML 标签,编译后转为原生 DOM 操作。
jsx
// ❌ 传统做法:手动操作 DOM
const div = document.createElement('div');
div.className = 'container';
div.innerHTML = '<h1>Hello</h1>';
document.getElementById('root').appendChild(div);
// ✅ React + JSX:声明式 UI
function App() {
return (
<div className="container">
<h1>Hello</h1>
</div>
);
}
🔑 JSX 的核心规则
jsx
// 1️⃣ 为什么用 className 而不是 class?
<div className="container"> {/* ✅ class 是 JS 关键字(OOP),不能用 */}
<div class="container"> {/* ❌ JS 引擎会认为你在声明一个类 */}
// 2️⃣ {} 大括号:从 JSX 世界回到 JS 世界
const name = 'React';
<h1>Hello, {name}</h1> // 输出:Hello, React
<h1>Hello, {1 + 1}</h1> // 输出:Hello, 2
// 3️⃣ 条件渲染
{error && <div className="error">{error}</div>} // 短路求值
{isReady ? <App /> : <Loading />} // 三元表达式
// 4️⃣ 列表渲染
{todos.map(todo => <li key={todo.id}>{todo.text}</li>)} // map + key
🧠 JSX 编译原理
scss
JSX 代码 → Babel/Oxc → React.createElement() → 虚拟 DOM 树 → 真实 DOM
React 19 使用 New JSX Transform ("jsx": "react-jsx"),不再需要手动 import React from 'react',编译器自动注入。
6. 组件化思维:函数就是组件
🧱 组件 = 函数 + HTML + CSS + JS
这是 React 和 Vue 最大的思维差异:
xml
Vue 组件(SFC 三明治):
┌──────────────────┐
│ <template> │ ← HTML 模板
│ <div>...</div> │
│ </template> │
│ <script> │ ← JS 逻辑
│ export default │
│ </script> │
│ <style> │ ← CSS 样式
│ .class {...} │
│ </style> │
└──────────────────┘
一个 .vue 文件 = 一个组件(好入门 ✅)
React 组件(纯函数):
┌──────────────────┐
│ function App() {│ ← JS 函数(组件本体)
│ // JS 逻辑 │
│ const [x,setX] │
│ = useState() │
│ return ( │
│ <div> │ ← HTML (JSX)
│ ... │
│ </div> │
│ ) │
│ } │
│ // CSS 通过 import './App.css' 引入
│ export default App
└──────────────────┘
一个 .tsx 函数 = 一个组件(更灵活 ✅)
🎯 核心认知 :React 的组件就是返回 HTML(JSX)的 JavaScript 函数 。函数
return之前是 JS 逻辑层,return里面是 UI 层。CSS 通过 import 引入。函数即组件------这是 React 最简洁也最强大的设计哲学。
🏗️ 组件搭积木
jsx
// 功能单元 = 组件
// 项目 = 组件树
function App() { // 🏠 根组件
return (
<div>
<Header /> // 📐 头部组件
<TodoInput onAdd={handleAdd} /> // ✍️ 输入组件
<TodoList // 📋 列表组件
todos={todos}
onToggle={handleToggle}
onDelete={handleDelete}
/>
<Footer count={todos.length} /> // 📊 底部组件
</div>
);
}
这就是"积木式"搭建------每个组件是一个独立的功能单元,组合在一起就成为完整的应用。
7. React Hooks 深度剖析
🎣 Hooks 是什么?
Hooks = 以
use开头的函数,让函数组件拥有"状态"和"生命周期"能力。这是 React 函数式思想的核心。
7.1 useState ------ 响应式数据状态
typescript
// 数据状态驱动界面状态
// 数据有不同的状态 → 界面有不同的表现 → 川剧变脸
const [state, setState] = useState(null); // 初始值 null
const [error, setError] = useState<string | null>(null);
const [loadingMessage, setLoadingMessage] = useState('');
const [todos, setTodos] = useState<Todo[]>([]); // 利用 TS 类型推断
数据驱动视图的完整流程:
perl
用户操作
│
▼
调用 setState('新值')
│
▼
React 标记组件需要重新渲染
│
▼
组件函数重新执行,state 已是新值
│
▼
JSX 根据新的 state 生成新的 UI
│
▼
React 比较新旧虚拟 DOM(Diffing)
│
▼
只更新变化的部分到真实 DOM(Reconciliation)
🎯 核心认知 :你不再需要
document.querySelector+innerHTML这样的 DOM 操作。数据变了,界面自动跟着变------这就是 React 响应式的本质。
7.2 useState 的高级用法 ------ 惰性初始化
typescript
// ❌ 常见做法:每次渲染都会执行 JSON.parse
const [todos, setTodos] = useState<Todo[]>(
JSON.parse(localStorage.getItem('react-todo-list') || '[]')
);
// ✅ 惰性初始化:只执行一次
const [todos, setTodos] = useState<Todo[]>(() => {
const saved = localStorage.getItem('react-todo-list');
return saved ? JSON.parse(saved) : [];
});
7.3 useEffect ------ 生命周期 & 副作用
typescript
// useEffect(副作用函数, 依赖数组)
// 1️⃣ 空依赖 []:组件挂载时执行一次
useEffect(() => {
console.log('组件已挂载完成');
// 初始化第三方库、API 调用、事件监听
}, []);
// 2️⃣ 有依赖 [todos]:依赖变化时执行
useEffect(() => {
localStorage.setItem('react-todo-list', JSON.stringify(todos));
}, [todos]);
// 3️⃣ 无依赖数组:每次渲染后都执行(极少使用)
useEffect(() => {
console.log('每次渲染都执行');
});
// 4️⃣ 清理函数:组件卸载时执行
useEffect(() => {
const timer = setInterval(() => {}, 1000);
return () => clearInterval(timer); // 清理!
}, []);
7.4 useCallback ------ 缓存函数引用
typescript
// 避免子组件不必要的重新渲染
const handleAdd = useCallback(() => {
const text = inputValue.trim();
if (!text) return;
const newTodo: Todo = {
id: Date.now().toString(),
text,
completed: false,
};
setTodos((prev) => [newTodo, ...prev]);
setInputValue('');
}, [inputValue]); // inputValue 变化时重新创建函数
// setTodos 使用函数式更新,不依赖外部 todos
const handleToggle = useCallback((id: string) => {
setTodos((prev) =>
prev.map((todo) =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
)
);
}, []); // 空依赖!永远不需要重新创建
🎯 关键技巧 :
setState(prev => ...)使用函数式更新,callback 不再依赖外部 state,可以实现空依赖数组的 useCallback。这是 React 性能优化的核心模式。
7.5 React Hooks 全景对照表
| Hook | 用途 | 触发时机 | 类比(类组件) |
|---|---|---|---|
useState |
响应式数据 | 调用 setter 时触发重渲染 | this.state + this.setState |
useEffect |
副作用/生命周期 | 依赖变化后异步执行 | componentDidMount/Update/Unmount |
useCallback |
缓存函数引用 | 依赖变化时重建 | this.method.bind(this) |
useMemo |
缓存计算结果 | 依赖变化时重新计算 | getDerivedStateFromProps |
useRef |
持有可变引用 | 不触发重渲染 | createRef / 实例属性 |
8. TailwindCSS:告别手写 CSS 的时代
💡 为什么 TailwindCSS 是革命性的?
css
传统 CSS 开发模式:
┌─────────────────────────────────────────────┐
│ 1. 想一个 class 名字(最头疼的事) │
│ 2. 打开 .css 文件 │
│ 3. 写选择器 + 属性:值 │
│ 4. 回到 HTML,加上 class │
│ 5. 样式不对?回到步骤 2 │
│ → 效率低下,上下文频繁切换 │
└─────────────────────────────────────────────┘
TailwindCSS 开发模式:
┌─────────────────────────────────────────────┐
│ 直接在 HTML 标签上写类名! │
│ <div className="flex items-center gap-4"> │
│ → 几乎不需要写 CSS,原子类组合搞定一切 │
└─────────────────────────────────────────────┘
🧬 原子类(Atomic CSS)哲学
TailwindCSS 提供了一套完整的原子 CSS 类名,每个类名只做一件事:
jsx
<div className="flex flex-col h-screen mx-auto items-center justify-end text-gray-500 bg-white">
{/*
flex → display: flex
flex-col → flex-direction: column
h-screen → height: 100vh
mx-auto → margin-left/right: auto(水平居中)
items-center → align-items: center
justify-end → justify-content: flex-end
text-gray-500 → color: #6b7280
bg-white → background-color: white
*/}
</div>
📐 间距系统
ini
TailwindCSS 间距单位:1 单位 = 0.25rem = 4px
m-1 = 4px p-4 = 16px
m-2 = 8px p-6 = 24px
m-4 = 16px mb-1 = margin-bottom: 4px
m-8 = 32px px-4 = padding-left/right: 16px
🎨 自定义值
jsx
// 方括号语法:任何值都可以自定义
<div className="max-w-[400px]"> // max-width: 400px
<div className="text-[#667eea]"> // color: #667eea
<div className="w-[510px]"> // width: 510px
⚙️ TailwindCSS 运行原理
markdown
1. 你写 className="flex items-center gap-4"
2. Vite 的 @tailwindcss/vite 插件扫描你的 JSX 文件
3. 提取所有用到的原子类名
4. 从 Tailwind 库中查找这些类名对应的 CSS 规则
5. 只把你用到的 CSS 打包进最终产物
→ 生产环境 CSS 文件极小!通常 < 10KB
🎯 核心认知 :TailwindCSS 已经成为 Vibe UI 的基本构成。原子类名天然语义化(
text-center、bg-blue-500),特别适合自然语义编程------你告诉 AI "这个 div 需要水平居中、蓝色背景",AI 就能精准生成对应的 Tailwind 类名。这是一种更适合 AI 时代的 UI 表达方式。
🆚 TailwindCSS vs 传统 CSS 选择场景
| 场景 | TailwindCSS | 传统 CSS |
|---|---|---|
| 快速布局 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 复杂动画 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 组件库 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 学习曲线 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| AI 生成代码质量 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
💡 最佳实践 :混合使用。布局和常规样式用 TailwindCSS ,复杂动画和特殊效果用传统 CSS。两个项目中,DeepSeek-R1-WebGPU 使用 TailwindCSS 做主布局,Todo App 使用传统 CSS 做精美动画------各取所长。
9. 传统 CSS 的优雅:Todo App 样式全解
虽然 TailwindCSS 很方便,但传统 CSS 在动画、伪元素、复杂选择器方面仍有不可替代的优势。以下是 Todo App 的样式精华:
🎨 渐变与毛玻璃
css
/* 页面背景:135° 渐变 */
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
/* 卡片:毛玻璃效果 */
.todo-app {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20px); /* 背景模糊 */
border-radius: 24px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15); /* 多层阴影 */
}
/* 渐变文字 */
.todo-header h1 {
background: linear-gradient(135deg, #667eea, #764ba2);
-webkit-background-clip: text; /* 背景裁剪到文字 */
-webkit-text-fill-color: transparent; /* 文字透明,露出背景 */
}
🎬 三层动画系统
css
/* 1️⃣ 入场动画:从上方滑入 + 缩放 */
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-16px) scale(0.95);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
/* 2️⃣ 退场动画:向右滑出 + 缩放到无 */
@keyframes slideOut {
from {
opacity: 1;
transform: translateX(0) scale(1);
max-height: 60px;
}
to {
opacity: 0;
transform: translateX(40px) scale(0.9);
max-height: 0;
padding-top: 0;
padding-bottom: 0;
margin-bottom: -8px;
}
}
/* 3️⃣ 勾选动画:弹跳效果 */
@keyframes checkPop {
0% { transform: scale(0); }
60% { transform: scale(1.3); } /* 过冲!弹跳的关键 */
100% { transform: scale(1); }
}
🎯 cubic-bezier 缓动函数
css
.todo-item {
/* cubic-bezier(0.4, 0, 0.2, 1) = ease-in-out 的标准曲线 */
transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);
animation: slideIn 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
🎯 核心认知 :
cubic-bezier(0.4, 0, 0.2, 1)是 Material Design 标准的缓动曲线------先加速、后减速,产生"自然感"。比默认的ease更有"质感"。
📱 响应式设计
css
@media (max-width: 480px) {
.todo-app {
padding: 24px 18px; /* 缩小内边距 */
border-radius: 18px; /* 减小圆角 */
}
.todo-input-area {
flex-direction: column; /* 水平布局 → 垂直布局 */
gap: 8px;
}
.todo-input-area button {
padding: 12px;
border-radius: 12px;
}
}
🖱️ 微交互细节
css
/* 输入框聚焦发光 */
.todo-input-area input:focus {
border-color: #667eea;
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.12); /* 外发光 */
}
/* 按钮悬浮上浮 */
.todo-input-area button:hover {
transform: translateY(-2px); /* 向上浮 2px */
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5); /* 阴影加深 */
}
/* 删除按钮悬浮变红 */
.todo-delete:hover {
background: #fee2e2; /* 浅红背景 */
color: #ef4444; /* 红色文字 */
}
10. WebGPU 端侧 AI:浏览器里跑大模型
🌐 端侧模型 vs 云端 API
┌────────────────────────────────────────────────────────┐
│ 云端 API 调用 │
│ ┌──────┐ 网络请求 ┌──────────┐ │
│ │ 浏览器 │ ───────────→ │ OpenAI │ │
│ │ │ ←─────────── │ DeepSeek │ │
│ └──────┘ 返回结果 │ 服务器 │ │
│ └──────────┘ │
│ 问题:💰 贵、🔓 不安全(上下文随请求发送到远程) │
├────────────────────────────────────────────────────────┤
│ 端侧模型推理 │
│ ┌─────────────────────┐ │
│ │ 浏览器 │ │
│ │ ┌───────────────┐ │ │
│ │ │ WebGPU 加速 │ │ │
│ │ │ Transformers.js│ │ │
│ │ │ ONNX Runtime │ │ │
│ │ │ 模型本地推理 │ │ │
│ │ └───────────────┘ │ │
│ └─────────────────────┘ │
│ 优势:🆓 免费、🔒 数据不出浏览器、📡 离线可用 │
└────────────────────────────────────────────────────────┘
🧠 项目使用的模型
arduino
DeepSeek-R1-Distill-Qwen-1.5B-ONNX
├── DeepSeek-R1 → 原版推理大模型(671B 参数,需要数据中心集群)
│ └── Distill → 知识蒸馏(将大模型的能力"压缩"到小模型)
│ └── Qwen-1.5B → 千问架构,只有 15 亿参数
│ └── ONNX → 开放神经网络交换格式(跨平台推理标准)
最终:1.5B 参数 → 浏览器中运行 → WebGPU 加速 → 实时推理!
🔍 WebGPU 检测
typescript
// 检测浏览器是否支持 WebGPU
const IS_WEBGPU_AVAILABLE = !!navigator.gpu;
// !! 双重取反 = 转 boolean
// navigator.gpu 为 undefined 时 → !undefined = true → !!undefined = false
// navigator.gpu 有值时 → !obj = false → !!obj = true
🏗️ 项目架构:HuggingFace + Transformers.js
┌──────────────────────────────────────────────┐
│ 浏览器中的 AI 推理流水线 │
├──────────────────────────────────────────────┤
│ │
│ 🤗 HuggingFace(抱抱脸) │
│ 全球最大开源模型社区 │
│ 提供模型托管 & 分发 │
│ │ │
│ ▼ │
│ 📦 ONNX 格式模型文件 │
│ .onnx 文件 → 跨平台推理格式 │
│ │ │
│ ▼ │
│ ⚡ Transformers.js │
│ HuggingFace 官方 JS SDK │
│ 在浏览器中加载 & 运行 Transformer 模型 │
│ │ │
│ ▼ │
│ 🎮 ONNX Runtime Web │
│ WebGPU 后端 → GPU 加速推理 │
│ 比纯 CPU 推理快 5-10 倍 │
│ │ │
│ ▼ │
│ 💬 用户看到结果 │
│ 完全在浏览器内!无网络请求! │
│ │
└──────────────────────────────────────────────┘
🔮 端侧 AI 的应用前景
端侧模型的应用场景:
├── 📱 手机端 → 本地语音助手、实时翻译
├── 🚗 汽车端 → 离线语音指令、本地导航
├── 🤖 Agent → 任务划分 & 本地决策
├── 🔒 隐私计算 → 敏感数据处理、医疗诊断
└── 💻 浏览器 → 随时下载、随时使用、离线可用
🎯 核心认知 :不是所有 AI 任务都需要 GPT-5 级别的云端大模型。开源小参数模型(1B~7B 参数)已经能出色完成许多特定任务------分类、提取、摘要、简单推理。端侧模型 = 便宜 + 安全 + 离线可用,是 AI 应用的重要方向。
11. AI 时代程序员的 React 学习路线
🗺️ 从 0 到 AI 架构师
bash
阶段 1:基础入门(1-2 周)
├── ✅ JSX 语法 → 理解"在 JS 中写 HTML"
├── ✅ 函数组件 → 理解"函数返回 UI"
├── ✅ Props → 理解"父传子"
├── ✅ useState → 理解"数据驱动视图"
└── ✅ 条件/列表渲染 → 理解"动态 UI"
阶段 2:核心进阶(2-4 周)
├── ✅ useEffect → 理解"副作用和生命周期"
├── ✅ useCallback/useMemo → 理解"性能优化"
├── ✅ 自定义 Hooks → 理解"逻辑复用"
├── ✅ TypeScript 泛型 → 理解"类型安全组件"
└── ✅ 项目实战 → 做一个 Todo App / 博客
阶段 3:工程化实战(1-2 月)
├── ✅ Vite 配置 → 理解构建工具
├── ✅ TailwindCSS → 理解原子化 CSS
├── ✅ ESLint → 理解代码规范
├── ✅ React Router → 理解前端路由
├── ✅ 状态管理 → Zustand / Jotai / Redux
└── ✅ 完整项目 → 带后端的前端应用
阶段 4:AI 架构师(持续)
├── ✅ RAG 应用 → 知识库 + 向量检索 + LLM
├── ✅ Agent 开发 → 多 Agent 协作编排
├── ✅ 端侧 AI → WebGPU / ONNX 浏览器推理
├── ✅ Prompt Engineering → 用 AI 辅助写 React
└── ✅ 产品化部署 → Vercel / Cloudflare / Docker
🤖 用 AI 加速 React 学习
markdown
不要让 AI 替你写代码,而要让 AI:
1. 解释你不理解的代码 → "这个 useEffect 为什么这么写?"
2. 给出多种实现方案 → "这个功能有哪些实现方法?"
3. 审查你的代码 → "这段代码有什么问题?"
4. 生成测试用例 → "给这个组件写 3 个测试"
5. 对比技术方案 → "TailwindCSS vs CSS Modules 的优劣?"
12. 总结与展望
📝 核心要点回顾
csharp
React 技术栈全景 ── 六大核心认知:
1️⃣ 组件化
函数就是组件 = function App() { return <JSX>; }
搭积木方式搭建页面
2️⃣ 响应式
数据驱动视图 → 改数据 = 改界面
不需要手动操作 DOM
3️⃣ JSX
JavaScript + XML → 在 JS 中写 HTML
className 不是 class(class 是 JS 关键字)
4️⃣ Hooks
useState → 响应式状态
useEffect → 副作用/生命周期
useCallback → 缓存函数(性能优化)
5️⃣ TailwindCSS
原子 CSS 类 → 几乎不再需要写 .css 文件
Vibe UI 的基本构成 → AI 友好的样式表达
6️⃣ TypeScript
类型安全 = AI 的"代码说明书"
大型项目 + AI 辅助 → 不可或缺
🔄 两个项目的互补关系
| 维度 | DeepSeek-R1-WebGPU | Todo App |
|---|---|---|
| 重点 | 技术栈教学 + 端侧 AI 概念 | 完整 CRUD 项目实践 |
| 样式 | TailwindCSS 原子化 | 传统 CSS 动画 + 渐变 |
| 状态 | useState + useEffect 多状态 | useState + useCallback 性能优化 |
| 特色 | WebGPU 浏览器 AI | localStorage 持久化 + 动画系统 |
| 难度 | 概念理解为主 | 动手实践为主 |
🚀 下一步行动
- 亲手写:不要只看不写,自己从头创建 Vite + React + TS 项目
- 拆组件 :把 Todo App 的
App.tsx拆成 4-5 个独立组件 - 加功能:给 Todo App 加上拖拽排序、截止日期、深色模式
- 读文档 :React 官方文档 是最好的学习资源
- 用 AI:遇到不懂的代码,让 AI 解释;写好的代码,让 AI 审查
📖 参考资源