Frontend / MLE · Technical Fundamentals

TikTok useMemo:缓存计算、依赖身份与正确性边界

先测昂贵计算,再判断缓存是否有效,不把useMemo当副作用或业务状态保证。

题目重点:先测昂贵计算,再判断缓存是否有效,不把useMemo当副作用或业务状态保证。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练计算为纯函数,依赖采用对象身份比较;是否有自动Compiler优化依项目配置确认。

解题路线

  1. useMemo缓存某次计算结果,在依赖不变时复用;它不是保证组件不render,也不是改变源数据的持久store。计算应在没有memo时也正确。
  2. 所有反应式输入都要列为依赖,漏项会保留旧结果。每次render新建依赖对象可使缓存每次失效,应先让依赖语义和身份稳定,而非再层层套memo。
  3. 适用于确实昂贵且输入常不变的计算,或需要稳定结果身份配合memo子组件;短小加法可能比较/维护成本超过收益。先在生产模式和代表设备测。
  4. memo只减后续重算,不加速首次计算;返回的大对象也占缓存内存。React可丢缓存,不能把它当保存业务状态/资源唯一实例的正确性依赖。
  5. 计算中不可发请求、注册订阅或修改props,因为render可重复/放弃,开发严格检查也可能多调用;副作用放合适同步机制并管理清理。
  6. 启用React Compiler的项目可能减少手工memo需求,但不意味着任意代码无需性能观察。回答应问实际编译配置,不盲称useMemo已没用或处处必用。

手动走一遍

过滤大列表依赖items和filter,theme变而二者身份不变可复用;若items每render从父传新数组,即使值相同也可能重算。代码正确性不应依赖缓存永不丢。

规模与取舍

计算T(N)命中时省该工作,仍需依赖比较O(K),首次或失效仍T(N);缓存结果空间按结果大小,不是O(1)一概而论。

易错点与追问

容易失分的边界

  • useMemo阻止组件render。
  • 漏依赖当优化。
  • 计算回调带副作用。

继续深挖

  • useCallback与memo怎样配合?
  • 怎样证明优化有收益?
  • 什么时候ref或state才是正确工具?

技术参考

  • React useMemo:技术语义参考,具体题目按本文约定。
✓已复制微信号!