Request Memoization 是 React 的一个功能,在单次渲染过程中自动去重相同的请求。 即使多个组件请求相同的数据,实际上只会发起一次网络请求。
关键特性:
⚠️ 重要:需要使用 React 的 cache() API
import { cache } from 'react';
const getData = cache(async (url) => {
return await fetch(url);
});
只有用 cache() 包装的函数才会启用 Request Memoization!
📅 页面渲染时间:2025-12-17T09:54:09.471Z
下面有 3 个组件,它们都调用了 fetchData(DATA_ID)。 因为使用了 cache() API 包装, 所以虽然有 4 次调用(ComponentA、ComponentB、ComponentC 两次), 但实际只会执行一次函数逻辑。
📋 查看验证方法:
[FETCH #N] 日志下面 3 个组件都请求了相同的 API,但实际只发起了一次网络请求:
Fetch #: 1
Request ID: dw8jf
Time: 2025-12-17T09:54:09.598Z
Fetch #: 1
Request ID: dw8jf
Time: 2025-12-17T09:54:09.598Z
第 1 次调用:
Fetch #: 1
Request ID: dw8jf
第 2 次调用:
Fetch #: 1
Request ID: dw8jf
✅ 预期结果:
所有组件的 Fetch # 和 Request ID 应该相同, 证明它们共享了同一次请求的结果。
查看终端日志,应该只看到一次 [FETCH] 日志。
| 特性 | Request Memoization | Data Cache |
|---|---|---|
| 作用范围 | 单次渲染周期 | 跨请求持久化 |
| 生命周期 | 渲染完成后失效 | 持久化到文件系统 |
| 去重机制 | 同一渲染中的重复请求 | 不同请求之间的缓存 |
| 是否可禁用 | ❌ 无法禁用(React 内置) | ✅ 可以禁用(cache: 'no-store') |
| 刷新页面 | 新的渲染周期,重新请求 | 使用缓存,不重新请求 |
例如:Header、Sidebar、Main 都需要显示用户信息。 不需要担心重复请求,React 会自动去重。
不需要通过 props 传递数据,每个组件都可以独立请求, React 会确保只发起一次网络请求。
使用 Suspense 并行渲染多个组件时,相同的请求会被自动去重, 提高性能和减少网络请求。
刷新页面,查看有多少次 [FETCH] 日志。 如果 Request Memoization 生效,应该只有一次。
页面上显示的所有 Request ID 应该相同,证明它们共享了同一次请求。
打开浏览器开发者工具的 Network 标签(注意:这里看不到服务端的网络请求)。 在服务端,相同的请求只会发起一次。
每次刷新都是新的渲染周期,Request Memoization 会重置, 所以每次刷新都会看到一次新的 FETCH 日志。