当前位置: 首页 > news >正文

React 的 `cache()` 函数

文章目录

  • 前言
      • 一、核心作用
      • 二、工作原理
      • 三、使用场景
        • 1. 避免重复数据请求
        • 2. 优化昂贵计算
      • 四、缓存规则详解
      • 五、与其它缓存方式对比
      • 六、服务端特殊行为
      • 七、最佳实践
      • 八、缓存失效策略
      • 九、使用限制
      • 十、与数据获取库集成
      • 总结:何时使用 cache()


前言

React 的 cache() 函数是 React 19 引入的重要 API,主要用于优化重复计算和数据获取。以下是对 cache() 函数的详细解析:


一、核心作用

cache() 创建一个缓存版本的函数,当相同参数重复调用时直接返回缓存结果:

import { cache } from 'react';const cachedFn = cache(fn);

二、工作原理

  1. 首次调用:执行函数并缓存结果
  2. 相同参数再次调用:直接返回缓存值(不执行函数)
  3. 不同参数调用:重新执行并缓存新结果

三、使用场景

1. 避免重复数据请求
const getData = cache(async (id) => {const res = await fetch(`https://api.example.com/data/${id}`);return res.json();
});async function Component({ id }) {const data = await getData(id); // 相同id只请求一次
}
2. 优化昂贵计算
const calculateSum = cache((a, b) => {// 复杂计算逻辑return a + b; 
});function Component() {const result = calculateSum(5, 10); // 相同参数直接返回缓存
}

四、缓存规则详解

行为结果
相同参数调用返回缓存值
不同参数调用执行函数并缓存新结果
服务端组件间调用同一请求共享缓存
客户端组件间调用整个应用生命周期共享缓存

五、与其它缓存方式对比

方法适用场景缓存范围持久性
cache()跨组件/服务端-客户端全局请求/会话级
useMemo单组件内部组件实例渲染周期
useCallback事件处理函数组件实例依赖变更前
React.memo组件渲染结果组件实例Props 不变时

六、服务端特殊行为

在 RSC(服务器组件)中:

  1. 缓存自动绑定到当前请求
  2. 请求结束时缓存自动清除
  3. 不同请求之间的缓存完全隔离
// 服务端组件
export default async function Page() {const data = await getData(1); // 缓存绑定到该HTTP请求
}

七、最佳实践

  1. 纯函数优先:只缓存无副作用的函数

    // ✅ 推荐:纯函数
    const getPrice = cache((productId) => ...)// ❌ 避免:有副作用函数
    const updateDB = cache(() => { ... }) // 危险!
    
  2. 客户端组件使用注意

    'use client';
    import { cache } from 'react';// 客户端需单例模式
    const cachedFn = cache(fn);
    export default function ClientComp() {// 使用cachedFn
    }
    
  3. 避免缓存大型对象

    // ❌ 不推荐
    const getHugeData = cache(() => 1GB数据)// ✅ 推荐
    const getDataChunk = cache((chunkId) => 小块数据)
    

八、缓存失效策略

React 未内置失效机制,需手动实现:

// 自定义带失效时间的缓存
const createTimedCache = (fn, ttl = 60_000) => {const cache = new Map();return (...args) => {const key = JSON.stringify(args);if (cache.has(key)) {const { timestamp, value } = cache.get(key);if (Date.now() - timestamp < ttl) return value;}const value = fn(...args);cache.set(key, { value, timestamp: Date.now() });return value;};
};

九、使用限制

  1. 参数必须可序列化:对象/数组需结构稳定
  2. 避免闭包陷阱
    function Component() {// ❌ 错误:每次渲染创建新函数const badCache = cache((x) => ...);// ✅ 正确:模块级缓存return <Child />
    }// 模块级缓存
    const goodCache = cache((x) => ...);
    

十、与数据获取库集成

配合 Next.js / SWR 等库:

// Next.js 示例
import { cache } from 'react';export const revalidate = 3600; // 每小时重新验证const getData = cache(async (id) => {const res = await fetch(`https://...`);return res.json();
});export async function generateStaticParams() {const data = await getData();return data.map(item => ({ id: item.id }));
}

总结:何时使用 cache()

场景推荐使用
跨组件共享数据获取逻辑
避免重复 API 请求
计算密集型操作优化
事件处理函数
状态更新逻辑
需要即时失效的缓存❌ (需扩展)

通过合理使用 cache(),可显著提升 React 应用性能,特别在 RSC 架构中能有效减少不必要的计算和网络请求。

http://www.dtcms.com/a/287525.html

相关文章:

  • 使用 Gunicorn 部署 Django 项目
  • XSS相关理解
  • Ubuntu20.04 samba配置
  • 针对大规模语言模型的上下文工程技术调研与总结(翻译并摘要)
  • 考研复习-数据结构-第七章-查找
  • 论文略读:Are Large Language Models In-Context Graph Learners?
  • 编程实现Word自动排版:从理论到实践的全面指南
  • 【Linux服务器】-zabbix通过proxy进行分级监控
  • Vue3生命周期函数
  • 多进程服务器
  • 【愚公系列】《MIoT.VC》001-认识、安装 MIoT.VC 软件
  • 安装postgresql
  • 深度学习Depth Anything V2神经网络实现单目深度估计系统源码
  • OpenCV 官翻8 - 其他算法
  • warning: _close is not implemented and will always fail
  • 驾驭 Spring Boot 事件机制:8 个内置事件 + 自定义扩展实战
  • Custom SRP - Custom Render Pipeline
  • SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView
  • 立创EDA中双层PCB叠层分析
  • 原码、反码和补码在计算机中的运算规则有何不同?
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(上)
  • 小谈相机的学习过程
  • 软考 系统架构设计师系列知识点之杂项集萃(112)
  • jvm-sandbox-repeater 录制和回放
  • 基于深度学习的微表情识别算法研究
  • 智慧园区工程监控与工单管理系统需求文档
  • Go语言里的map
  • RocketMQ源码级实现原理-NameServer路由机制
  • 解锁C++性能密码:TCMalloc深度剖析
  • 低代码平台ToolJet实战总结