1. React 核心概念与特性解析
1.1 React 的本质与设计哲学
React 作为 Facebook 推出的 JavaScript 库,其核心定位是构建用户界面的声明式、组件化解决方案。不同于传统 jQuery 式的命令式 DOM 操作,React 提出了"UI 即数据映射"的理念,通过虚拟 DOM 实现高效的视图更新机制。
声明式编程范式体现在开发者只需关注 UI 的目标状态,而无需手动处理 DOM 更新的具体过程。例如,当我们需要渲染一个计数器时:
javascript复制function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>当前计数: {count}</p>
<button onClick={() => setCount(count + 1)}>增加</button>
</div>
);
}
在这个例子中,我们只声明了"当点击按钮时计数应该增加",而 React 自动处理了 DOM 更新的具体实现。这种抽象使得代码更易于理解和维护。
1.2 组件化架构的实践要点
组件化是 React 的核心设计模式,其优势主要体现在:
- 可复用性:将 UI 拆分为独立组件,可以在不同场景重复使用
- 可维护性:每个组件封装自身的状态和逻辑,修改时不影响其他部分
- 可测试性:独立组件更容易进行单元测试
在大型项目中,合理的组件划分尤为关键。建议遵循单一职责原则,将组件分为:
- 展示组件:只负责 UI 渲染,通过 props 接收数据
- 容器组件:处理业务逻辑,管理状态
- 布局组件:负责页面整体结构
- 高阶组件:用于逻辑复用
1.3 虚拟 DOM 的深度解析
虚拟 DOM 是 React 性能优化的核心机制,其工作原理可分为三个阶段:
- 内存表示阶段:React 在内存中构建轻量的 JavaScript 对象树,模拟真实 DOM 结构
- 差异计算阶段:状态变化时生成新虚拟 DOM,通过 Diff 算法比较新旧树的差异
- 批量更新阶段:将计算出的最小变更集批量应用到真实 DOM
这种机制的优势在于:
- 减少直接 DOM 操作:浏览器 DOM 操作成本高昂,虚拟 DOM 在内存中完成大部分计算
- 跨平台能力:虚拟 DOM 可以渲染到不同平台(Web、Native、Canvas 等)
- 性能优化:通过批量更新和差异计算,最小化重绘和回流
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. React 核心 API 与模式
2.1 状态管理的艺术:state 与 props
理解 state 和 props 的区别是掌握 React 的关键:
| 特性 | state | props |
|---|---|---|
| 所有权 | 组件内部私有 | 父组件传递 |
| 可变性 | 可通过 setState 修改 | 只读,不可直接修改 |
| 数据流 | 组件内部维护 | 单向父→子传递 |
| 初始化 | 构造函数或 useState | 父组件传递或默认值 |
最佳实践:
- 避免将 props 复制到 state("派生状态"问题)
- 状态提升:当多个组件需要共享状态时,应将其提升到最近的共同祖先
- 使用不可变数据更新状态,确保可预测性
2.2 组件通信的完整方案
React 组件通信根据组件关系有不同的解决方案:
- 父子通信:
- 父→子:通过 props
- 子→父:通过回调函数
javascript复制// 父组件
function Parent() {
const handleChildEvent = (data) => {
console.log('来自子组件的数据:', data);
};
return <Child onEvent={handleChildEvent} />;
}
// 子组件
function Child({ onEvent }) {
return <button onClick={() => onEvent('Hello')}>触发事件</button>;
}
-
跨层级通信:
- Context API:适合全局共享的数据(如主题、用户信息)
- 状态管理库:Redux、MobX 等适合复杂应用状态
-
兄弟组件通信:
- 通过共同的父组件中转
- 使用发布订阅模式
- 共享状态管理
2.3 生命周期与副作用管理
React 生命周期分为三个阶段,理解它们对性能优化至关重要:
类组件生命周期:
-
挂载阶段:
- constructor:初始化 state 和绑定方法
- render:返回 JSX
- componentDidMount:DOM 就绪,适合发起请求
-
更新阶段:
- shouldComponentUpdate:性能优化关键
- render
- componentDidUpdate:DOM 更新完成
-
卸载阶段:
- componentWillUnmount:清理定时器、取消请求等
函数组件与 Hooks:
- useEffect 合并了多个生命周期功能:
- 无依赖数组:componentDidMount + componentDidUpdate
- 空依赖数组:仅 componentDidMount
- 返回函数:componentWillUnmount
javascript复制useEffect(() => {
// 相当于 componentDidMount
const timer = setInterval(() => {}, 1000);
return () => {
// 相当于 componentWillUnmount
clearInterval(timer);
};
}, []); // 空依赖数组
3. React 高级特性与性能优化
3.1 Hooks 深度解析
Hooks 是 React 16.8 的革命性特性,它解决了类组件的多个痛点:
核心 Hooks:
-
useState:函数组件中添加状态
- 注意:状态更新是异步且会合并的
- 函数式更新确保获取最新状态
-
useEffect:处理副作用
- 依赖数组决定何时重新执行
- 清理函数防止内存泄漏
-
useMemo/useCallback:性能优化
- useMemo:缓存计算结果
- useCallback:缓存函数引用
自定义 Hooks:
封装可复用的逻辑,例如:
javascript复制function useWindowSize() {
const [size, setSize] = useState({
width: window.innerWidth,
height: window.innerHeight
});
useEffect(() => {
const handleResize = () => setSize({
width: window.innerWidth,
height: window.innerHeight
});
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return size;
}
3.2 性能优化实战技巧
-
避免不必要的渲染:
- React.memo 缓存组件
- shouldComponentUpdate 或 PureComponent 浅比较
- 合理拆分组件,隔离变化部分
-
虚拟化长列表:
- 使用 react-window 或 react-virtualized
- 只渲染可见区域的项目
-
代码分割:
- React.lazy + Suspense 实现路由懒加载
- 动态 import() 语法
javascript复制const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>加载中...</div>}>
<LazyComponent />
</Suspense>
);
}
- useReducer 管理复杂状态:
- 适合有复杂状态逻辑的场景
- 便于测试和复用
3.3 常见问题与解决方案
问题1:状态更新不同步
- 原因:setState 是异步的
- 解决:使用函数式更新或 useEffect 监听
问题2:无限渲染循环
- 原因:在渲染过程中直接修改状态
- 解决:确保状态更新有条件判断
问题3:内存泄漏
- 原因:未清理订阅或异步操作
- 解决:在 useEffect 返回清理函数
问题4:大型列表卡顿
- 原因:同时渲染过多 DOM 节点
- 解决:虚拟化或分页加载
4. React 生态系统与工程化
4.1 状态管理方案选型
根据项目规模选择合适的方案:
-
Context API:
- 适合简单的全局状态
- 配合 useReducer 可扩展性更强
-
Redux:
- 严格的单向数据流
- 中间件支持(如 redux-thunk、redux-saga)
- 适合大型复杂应用
-
MobX:
- 响应式编程模型
- 更简洁的代码
- 适合中小型项目
-
Recoil:
- Facebook 官方实验状态管理
- 原子化状态设计
- 更好的 TypeScript 支持
4.2 路由解决方案
React Router 是事实标准,最新 v6 版本的重要改进:
- 声明式路由配置:
javascript复制<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="*" element={<NotFound />} />
</Route>
</Routes>
- 相对路由和链接
- 改进的导航 API
- 数据加载和提交的新模式
4.3 测试策略
完整的 React 测试应包含:
-
单元测试:
- Jest 测试工具链
- 测试纯函数和自定义 Hooks
-
组件测试:
- React Testing Library
- 测试组件渲染和交互
-
端到端测试:
- Cypress 或 Playwright
- 测试完整用户流程
测试示例:
javascript复制test('计数器增加', () => {
render(<Counter />);
const button = screen.getByText('增加');
fireEvent.click(button);
expect(screen.getByText('当前计数: 1')).toBeInTheDocument();
});
5. React 与 TypeScript 集成
5.1 类型定义基础
TypeScript 为 React 带来类型安全:
- 组件 Props 类型:
typescript复制interface ButtonProps {
text: string;
disabled?: boolean;
onClick: () => void;
}
function Button({ text, disabled = false, onClick }: ButtonProps) {
return <button disabled={disabled} onClick={onClick}>{text}</button>;
}
- Hooks 类型:
typescript复制const [count, setCount] = useState<number>(0);
const user = useRef<User | null>(null);
5.2 高级类型技巧
- 泛型组件:
typescript复制interface ListProps<T> {
items: T[];
renderItem: (item: T) => React.ReactNode;
}
function List<T>({ items, renderItem }: ListProps<T>) {
return <div>{items.map(renderItem)}</div>;
}
-
类型工具:
- Partial:所有属性可选
- Required:所有属性必选
- Pick/Omit:选择/排除属性
-
类型安全的 Context:
typescript复制interface ThemeContextType {
theme: 'light' | 'dark';
toggleTheme: () => void;
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
6. React 18 新特性解析
6.1 并发渲染模式
React 18 引入了并发渲染器,主要改进:
-
自动批处理:
- 多个状态更新自动合并为单个渲染
- 减少不必要的重复渲染
-
过渡更新:
- 区分紧急和非紧急更新
- 使用 startTransition 标记非关键更新
javascript复制function App() {
const [resource, setResource] = useState(initialResource);
const [isPending, startTransition] = useTransition();
function handleClick() {
startTransition(() => {
setResource(fetchNewResource());
});
}
return (
<div>
<button onClick={handleClick} disabled={isPending}>
{isPending ? '加载中...' : '加载数据'}
</button>
<Suspense fallback={<Spinner />}>
<Profile resource={resource} />
</Suspense>
</div>
);
}
6.2 新的 Hooks API
-
useId:
- 生成唯一 ID
- 解决 SSR 时 ID 不匹配问题
-
useSyncExternalStore:
- 用于集成外部状态管理
- 确保与 React 并发特性兼容
-
useInsertionEffect:
- 专门用于 CSS-in-JS 库
- 在 DOM 变更前同步执行
7. React 项目实战经验
7.1 项目结构组织
合理的项目结构能提高可维护性:
code复制src/
├── assets/ # 静态资源
├── components/ # 通用组件
│ ├── ui/ # 无状态UI组件
│ └── features/ # 业务功能组件
├── hooks/ # 自定义Hooks
├── pages/ # 页面组件
├── store/ # 状态管理
├── services/ # API服务
├── utils/ # 工具函数
├── styles/ # 全局样式
├── App.tsx # 根组件
└── main.tsx # 入口文件
7.2 代码规范与质量
-
ESLint 配置:
- react-hooks/rules-of-hooks
- react-hooks/exhaustive-deps
- jsx-a11y 可访问性规则
-
Prettier 代码格式化:
- 统一代码风格
- 与 ESLint 集成
-
Git 提交规范:
- Conventional Commits
- Husky + lint-staged 预检查
7.3 性能监控与优化
-
性能指标:
- FCP (First Contentful Paint)
- LCP (Largest Contentful Paint)
- TTI (Time to Interactive)
-
分析工具:
- React DevTools Profiler
- Lighthouse
- Web Vitals
-
优化策略:
- 按需加载第三方库
- 图片懒加载和优化
- 服务端渲染或静态生成
8. React 面试深度准备
8.1 核心概念问题解析
虚拟 DOM 的权衡:
- 优势:跨平台、性能优化、开发体验
- 劣势:内存占用、初始渲染成本
- 适用场景:频繁更新的动态应用
Hooks 的设计原理:
- 基于调用顺序的存储机制
- 为什么不能在条件中使用
- 自定义 Hook 的状态隔离
8.2 编码题常见模式
- 实现 usePrevious:
javascript复制function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value;
});
return ref.current;
}
- 防抖/节流 Hook:
javascript复制function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debouncedValue;
}
- 数据获取 Hook:
javascript复制function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
const json = await response.json();
setData(json);
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
8.3 系统设计问题
设计一个可复用的表单系统:
- 表单状态管理
- 验证规则配置
- 错误提示机制
- 提交处理
- 字段联动
实现无限滚动列表:
- 视窗计算
- 数据分块加载
- 滚动位置恢复
- 性能优化
9. React 进阶资源与学习路径
9.1 深入理解 React 原理
-
Fiber 架构解析:
- 任务分片与调度
- 优先级机制
- 渲染过程
-
事件系统:
- 合成事件机制
- 事件委托
- 与原生事件的区别
-
协调算法:
- Diff 算法的具体实现
- key 的作用原理
- 列表更新的优化策略
9.2 推荐学习资源
-
官方文档:
- React 官方文档(含 beta 版新特性)
- React RFCs 了解设计决策
-
开源项目:
- Next.js 源码
- React 生态库(如 react-query、react-hook-form)
-
技术博客:
- Dan Abramov 的博客
- React 团队的技术文章
-
视频课程:
- React Conf 会议视频
- 高级 React 模式课程
10. React 未来发展趋势
10.1 服务端组件
React 服务端组件(RSC)是未来的重要方向:
-
核心优势:
- 减少客户端 bundle 大小
- 自动代码分割
- 直接访问后端资源
-
使用模式:
javascript复制// 服务端组件
async function Note({ id }) {
const note = await db.notes.get(id);
return <NoteView note={note} />;
}
// 客户端组件
'use client';
function NoteView({ note }) {
return (
<div>
<h1>{note.title}</h1>
<p>{note.content}</p>
</div>
);
}
10.2 编译时优化
React 正在探索更多编译时优化:
-
React Forget:
- 自动记忆化
- 减少手动 useMemo/useCallback
-
更快的 JSX 转换:
- 编译时优化 JSX 生成
- 减少运行时开销
-
元框架集成:
- 与 Next.js、Remix 深度整合
- 更智能的代码分割
11. React 项目常见问题解决方案
11.1 状态管理困境
问题:组件状态过多导致混乱
- 解决方案:
- 使用 reducer 整合相关状态
- 提取自定义 Hook 封装逻辑
- 考虑状态管理库
问题:全局状态更新导致过多重渲染
- 解决方案:
- 精细化状态划分
- 使用 selectors 精确订阅
- 考虑原子化状态方案
11.2 性能瓶颈分析
组件渲染过多
- 使用 React.memo
- 避免在渲染中创建新对象/函数
- 使用 useMemo/useCallback
大型列表卡顿
- 虚拟化列表
- 分页加载
- 减少 DOM 节点复杂度
JS 执行时间过长
- 代码分割
- 优化复杂计算
- Web Worker 处理 CPU 密集型任务
11.3 测试策略实施
单元测试覆盖不足
- 优先测试业务逻辑
- 使用测试驱动开发(TDD)
- 覆盖率工具监控
集成测试困难
- Mock 外部依赖
- 使用 MSW 模拟 API
- 测试用户交互流程
E2E 测试不稳定
- 明确测试边界
- 使用可靠的等待策略
- 定期维护测试用例
12. React 与 Web 标准演进
12.1 Web Components 集成
React 与 Web Components 可以互补:
- 在 React 中使用 Web Components:
javascript复制function App() {
return (
<div>
<my-web-component prop="value">
<p>插入内容</p>
</my-web-component>
</div>
);
}
- 将 React 组件导出为 Web Components:
javascript复制class MyReactComponent extends HTMLElement {
connectedCallback() {
const root = createRoot(this);
root.render(<ReactComponent />);
}
}
customElements.define('my-react-component', MyReactComponent);
12.2 现代 CSS 方案
React 生态中的 CSS 解决方案:
-
CSS Modules:
- 本地作用域
- 类型安全导入
-
CSS-in-JS:
- styled-components
- Emotion
- 主题和动态样式
-
Utility-First CSS:
- Tailwind CSS
- 与 React 组件高度契合
12.3 WebAssembly 结合
React 与 WASM 的集成模式:
- 性能敏感模块用 WASM 实现
- 通过 React 管理 UI 和状态
- 共享内存通信
javascript复制import init, { calculate } from './wasm-module/pkg';
function App() {
const [result, setResult] = useState(null);
useEffect(() => {
init().then(() => {
setResult(calculate(42));
});
}, []);
return <div>计算结果: {result}</div>;
}
13. React 团队协作最佳实践
13.1 代码评审要点
-
组件设计:
- 单一职责原则
- 合理的 props 设计
- 可复用性评估
-
状态管理:
- 状态位置是否合理
- 是否遵循不可变原则
- 派生状态处理
-
性能考量:
- 不必要的渲染
- 大型组件拆分
- 内存泄漏风险
13.2 文档规范
-
组件文档:
- Props 类型和说明
- 使用示例
- 交互行为描述
-
自定义 Hook 文档:
- 输入输出说明
- 副作用描述
- 使用场景示例
-
项目文档:
- 架构设计
- 状态管理方案
- 开发工作流
13.3 设计系统集成
React 在设计系统中的实践:
-
组件库架构:
- 基础组件
- 业务组件
- 主题系统
-
文档工具:
- Storybook
- Docz
- Docusaurus
-
版本发布:
- 语义化版本
- ChangeLog
- 向后兼容策略
14. React 安全实践
14.1 常见安全漏洞防范
-
XSS 防护:
- 默认转义内容
- 谨慎使用 dangerouslySetInnerHTML
- 净化用户输入
-
CSRF 防护:
- 同源策略
- CSRF token
- SameSite cookie
-
敏感信息保护:
- 不在客户端存储密钥
- 环境变量管理
- 代码混淆
14.2 权限控制实现
-
路由级权限:
- 高阶组件包装
- 路由守卫
-
组件级权限:
- 条件渲染
- 自定义指令
-
API 级权限:
- 请求拦截器
- 错误处理
javascript复制function withAuth(Component) {
return function AuthenticatedComponent(props) {
const { user } = useAuth();
if (!user) {
return <Redirect to="/login" />;
}
return <Component {...props} />;
};
}
14.3 性能与安全权衡
-
代码分割 vs 安全审计:
- 确保关键安全检查不被延迟加载
-
服务端渲染 vs XSS 风险:
- 正确处理服务器端数据注入
-
第三方依赖 vs 供应链安全:
- 定期更新依赖
- 审计高风险包
15. React 项目部署与运维
15.1 构建优化
-
分析工具:
- webpack-bundle-analyzer
- source-map-explorer
-
优化策略:
- 代码分割
- 按需加载
- 压缩资源
-
环境区分:
- 不同环境配置
- 特性开关
15.2 部署策略
-
静态部署:
- CDN 分发
- 版本化部署
-
服务端渲染:
- Node.js 服务器
- 缓存策略
-
渐进式更新:
- 蓝绿部署
- 金丝雀发布
15.3 监控与错误追踪
-
性能监控:
- Web Vitals
- 自定义指标
-
错误收集:
- Error Boundaries
- Sentry/Bugsnag
-
用户行为分析:
- 点击热图
- 交互追踪
javascript复制class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error, info) {
logErrorToService(error, info.componentStack);
}
render() {
return this.state.hasError
? <FallbackUI />
: this.props.children;
}
}
16. React 与移动开发
16.1 React Native 核心原理
-
架构设计:
- JavaScript 线程与原生通信
- 桥接机制
- 新架构(Fabric、TurboModules)
-
性能优化:
- 列表优化
- 内存管理
- 原生模块开发
-
代码共享:
- 通用业务逻辑
- 设计系统统一
16.2 跨平台开发策略
-
渐进式策略:
- 核心逻辑共享
- 平台特定实现
-
工具链:
- Metro 打包工具
- Hermes 引擎
- Flipper 调试
-
测试方案:
- 单元测试
- 组件测试
- 端到端测试
16.3 混合开发模式
-
WebView 集成:
- 通信协议
- 性能优化
-
原生模块:
- 平台特定功能
- 性能敏感操作
-
微前端集成:
- React 作为微应用
- 与原生容器通信
17. React 状态管理进阶
17.1 状态机模式
-
有限状态机:
- 明确的状态转换
- XState 库实现
-
应用场景:
- 复杂表单流程
- 多步骤交互
- UI 状态管理
javascript复制const toggleMachine = createMachine({
id: 'toggle',
initial: 'inactive',
states: {
inactive: { on: { TOGGLE: 'active' } },
active: { on: { TOGGLE: 'inactive' } }
}
});
function Toggle() {
const [state, send] = useMachine(toggleMachine);
return (
<button onClick={() => send('TOGGLE')}>
{state.matches('inactive') ? 'Off' : 'On'}
</button>
);
}
17.2 原子化状态
-
Recoil 核心概念:
- Atoms:状态单元
- Selectors:派生状态
- 异步数据查询
-
Jotai 轻量方案:
- 更简单的 API
- 类似的原子模型
- 与 React 深度集成
17.3 状态持久化
-
本地存储策略:
- localStorage
- IndexedDB
- 加密敏感数据
-
同步策略:
- 乐观更新
- 冲突解决
- 离线优先
-
服务端状态同步:
- React Query
- SWR
- Apollo Client
18. React 与后端集成
18.1 GraphQL 集成
-
Apollo Client:
- 查询与变更
- 缓存管理
- 实时订阅
-
Relay 现代版:
- 编译时优化
- 数据依赖声明
- 分页处理
-
REST 与 GraphQL 混合:
- 渐进式迁移
- 网关层整合
18.2 服务端渲染深度优化
-
数据获取策略:
- getServerSideProps
- getStaticProps
- 流式渲染
-
性能优化:
- 组件级缓存
- 部分水合
- Islands 架构
-
SEO 优化:
- 结构化数据
- 动态元标签
- 社交媒体卡片
18.3 边缘计算集成
-
边缘函数:
- 靠近用户的渲染
- 个性化内容
- A/B 测试
-
架构模式:
- 边缘 SSR
- 静态生成 + 边缘补充
- 渐进式增强
-
工具链:
- Next.js Edge Runtime
- Deno Deploy
- Cloudflare Workers
19. React 设计模式进阶
19.1 复合组件模式
-
Context 组合:
- 隐式状态共享
- 灵活的组件结构
-
插槽模式:
- children 属性
- 具名插槽
-
控制反转:
- 渲染属性
- 组件注入
javascript复制function Toggle({ children }) {
const [on, setOn] = useState(false);
const toggle = () => setOn(!on);
return children({ on, toggle });
}
function App() {
return (
<Toggle>
{({ on, toggle }) => (
<div>
<button onClick={toggle}>{on ? 'On' : 'Off'}</button>
{on && <div>内容</div>}
</div>
)}
</Toggle>
);
}
19.2 状态降级策略
-
本地优先原则:
- 状态尽量靠近使用它的组件
- 避免过早全局化
-
状态提升边界:
- 识别自然组件层级
- 寻找最小共享祖先
-
状态机管理:
- 复杂状态逻辑提取
- 明确状态转换
19.3 依赖注入模式
-
Context 作为 DI 容器:
- 提供服务和配置
- 多层覆盖
-
Hook 作为服务接口:
- 封装外部依赖
- 便于测试替换
-
组件组合替代继承:
- 功能增强组件
- 装饰器模式
20. React 测试策略进阶
20.1 组件测试金字塔
-
单元测试:
- 纯函数
- 工具函数
- 自定义 Hook
-
集成测试:
- 组件组合
- 状态交互
- Context 集成
-
E2E 测试:
- 用户旅程
- 关键路径
- 跨系统验证
20.2 测试工具链
-
测试运行器:
- Jest
- Vitest
-
测试库:
- React Testing Library
- @testing-library/react-hooks
-
模拟工具:
- MSW (Mock Service Worker)
- jest.mock
-
可视化测试:
- Storybook 交互测试
- Percy 快照测试
20.3 测试模式与技巧
-
查询优先级:
- 优先使用语义化查询
- 避免测试实现细节
-
异步测试:
- waitFor
- findBy 查询
- 模拟延迟
-
覆盖率策略:
- 关键路径优先
- 边界条件覆盖
- 避免过度追求数字
javascript复制test('异步数据加载', async () => {
render(<AsyncComponent />);
// 初始加载状态
expect(screen.getByText('加载中...')).toBeInTheDocument();
// 等待数据加载完成
const data = await screen.findByText('加载完成');
// 验证最终状态
expect(data).toBeInTheDocument();
});
21. React 性能分析工具
21.1 开发工具套件
-
React DevTools:
- 组件树检查
- Props 和状态查看
- 性能分析器
-
Chrome DevTools:
- Performance 面板
- Memory 分析
- 网络请求监控
-
Webpack Bundle Analyzer:
- 包大小可视化
- 重复依赖检测
- 优化机会识别
21.2 性能指标解读
-
加载性能:
- TTI (Time to Interactive)
- FCP (First Contentful Paint)
- LCP (Largest Contentful Paint)
-
运行时性能:
- 帧率分析
- 长任务检测
- 内存使用趋势
-
React 特定指标:
- 组件渲染次数
- 渲染时间
- 不必要的重渲染
21.3 性能优化工作流
-
测量:
- 建立性能基准
- 识别瓶颈
-
分析:
- 定位问题根源
- 评估优化影响
-
优化:
- 应用优化策略
- 验证改进效果
-
监控:
- 持续性能跟踪
- 回归预防
22. React 与微前端架构
22.1 集成方案比较
-
构建时集成:
- 模块联合 (Module Federation)
- 共享依赖
- 版本协调
-
运行时集成:
- iframe 隔离
- Web Components 封装
- 脚本注入
-
服务端集成:
- 边缘组合
- 片段组装
- 渐进式加载
22.2 状态共享策略
-
事件总线:
- 自定义事件
- 发布订阅模式
-
URL 驱动:
- 路由状态同步
- 查询参数共享
-
全局存储:
- 共享状态库
- 本地存储同步
22.3 样式隔离方案
-
CSS-in-JS:
- 自动作用域
- 动态主题支持
-
Shadow DOM:
- 原生隔离
- 组件封装
-
命名约定:
- BEM 方法论
