React Server Components 实战指南
RSC 的渲染模型、Server/Client 组件边界、数据获取模式与 Next.js App Router 落地经验。
Redux、Zustand、Jotai、Recoil、Context 的状态边界设计与大型项目选型决策树。
「你们项目用什么状态管理?」是高级前端面试的必答题。答案不是推荐某个库,而是展示状态分类能力和选型决策过程。
| 状态类型 | 特征 | 推荐方案 |
|---|---|---|
| 本地 UI 状态 | 开关、输入值、hover | useState / useReducer |
| 共享 UI 状态 | 主题、侧边栏、Modal | Context + useReducer |
| 服务端缓存 | API 数据、分页、失效 | TanStack Query / SWR |
| 全局客户端状态 | 用户信息、权限、购物车 | Zustand / Redux Toolkit |
| 原子化派生状态 | 表单字段间联动 | Jotai / Valtio |
| URL 状态 | 筛选、分页、Tab | nuqs / React Router searchParams |
核心原则:不要把所有状态都放进全局 Store。
适合:大型团队、复杂异步流程、需要时间旅行调试
// RTK Slice 示例
const userSlice = createSlice({
name: "user",
initialState: { profile: null, loading: false },
reducers: {
setProfile: (state, action) => {
state.profile = action.payload;
},
},
extraReducers: (builder) => {
builder.addCase(fetchUser.fulfilled, (state, action) => {
state.profile = action.payload;
state.loading = false;
});
},
});
优势:生态成熟、DevTools、RTK Query 一体化 劣势:模板代码多、学习曲线陡、小项目过度设计
适合:中等复杂度、快速迭代、不需要中间件生态
import { create } from "zustand";
interface AuthStore {
user: User | null;
login: (credentials: Credentials) => Promise<void>;
logout: () => void;
}
const useAuthStore = create<AuthStore>((set) => ({
user: null,
login: async (credentials) => {
const user = await api.login(credentials);
set({ user });
},
logout: () => set({ user: null }),
}));
优势:API 极简、无 Provider 包裹、TS 友好 劣势:缺少标准化异步模式、大型项目需自建规范
适合:原子化状态、细粒度订阅、表单联动
import { atom, useAtom } from "jotai";
const priceAtom = atom(0);
const quantityAtom = atom(1);
const totalAtom = atom((get) => get(priceAtom) * get(quantityAtom));
优势:自动依赖追踪、避免不必要的重渲染 劣势:原子数量膨胀时难以维护
需要状态管理吗?
├── 只是组件内部 → useState
├── 跨 2-3 层组件 → 组合/Props 或 Context
├── 服务端数据 → TanStack Query
├── 全局 + 复杂异步 + 大团队 → Redux Toolkit
├── 全局 + 中等复杂度 → Zustand
└── 细粒度派生 + 表单联动 → Jotai
订单中心原 Redux + saga,全局 store 800+ 行,改一个筛选条件要动 4 个文件。迁移策略:
| 阶段 | 动作 | 结果 |
|---|---|---|
| M1 | 新接口全走 TanStack Query | 删除 60% useEffect fetch |
| M2 | UI 态(sidebar、主题)迁 Zustand | Redux 体积 -40% |
| M3 | 遗留订单编辑保留 RTK slice | 避免大爆炸 |
Rejected Jotai 全局化:团队 12 人,原子分散难 grep;Zustand 单 store 更可审计。
迁移后:首屏少 dispatch 23 次,DevTools 噪音下降,新人 onboard 从 2 周缩到 3 天。