news 2026/6/15 14:20:37

WHAT - Vercel react-best-practices 系列(五)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WHAT - Vercel react-best-practices 系列(五)

文章目录

  • 前言
  • Guidelines
  • JavaScript Patterns
    • Batch DOM CSS changes via classes
      • 核心问题
      • 反例:逐条改 style
      • 推荐:class 批量切换
      • 典型场景
      • 一句话总结
    • Build index maps for repeated lookups
      • 核心问题
      • 反例
      • 推荐:构建索引 Map
      • 典型场景
      • 一句话总结
    • Cache repeated function calls
      • 核心问题
      • 反例
      • 推荐:简单 memo
      • React 中更推荐:
      • 一句话总结
    • Use toSorted() instead of sort() for immutability
      • 核心问题
      • 反例
      • 推荐:toSorted(ES2023)
      • 兼容方案
      • 一句话总结
    • Early length check for array comparisons
      • 核心问题
      • 反例
      • 推荐:提前剪枝
      • 场景
      • 一句话总结
  • JS 性能心法
    • 总结

前言

react-best-practices

React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.

Guidelines


在这个系列,我会逐条拆解,每一条都给出:

  • 核心问题是什么
  • 为什么会慢(本质原因)
  • 典型业务场景
  • 反例代码
  • 推荐写法
  • 在 React / Next.js 中的实际收益

JavaScript Patterns

这是系列的第五部分。

这一部分其实非常“工程味”,不再是 React 专属,而是JS / DOM / 数据结构层面的硬功夫

这些点看起来“小”,但在表格、列表、频繁交互里都是实打实的性能差异

Batch DOM CSS changes via classes

样式一次性切换,不要逐条改

核心问题

每一次:

el.style.xxx=...

都可能触发:

  • style recalculation
  • layout
  • paint

多次修改 = 多次成本

反例:逐条改 style

el.style.width='200px'el.style.height='100px'el.style.background='red'

推荐:class 批量切换

el.classList.add('active')
.active{width:200px;height:100px;background:red;}

浏览器只需要一次 style 计算

典型场景

  • hover / active 状态
  • 拖拽高亮
  • 表格行选中
  • 动态主题切换

一句话总结

DOM 改一次,CSS 管所有

Build index maps for repeated lookups

多次查找,用 Map,不要 filter / find

核心问题

array.find(...)
  • O(n)
  • 在 render / 循环中反复执行 → O(n²)

反例

items.map(item=>{constuser=users.find(u=>u.id===item.userId)return{...item,user}})

推荐:构建索引 Map

constuserMap=newMap(users.map(u=>[u.id,u]))items.map(item=>{constuser=userMap.get(item.userId)return{...item,user}})

复杂度从 O(n²) → O(n)

典型场景

  • 表格数据 join
  • id → entity 映射
  • 权限校验
  • diff 对比

一句话总结

先建索引,再查数据

Cache repeated function calls

相同输入,不要重复算

核心问题

formatPrice(price)

如果:

  • 在 render 中
  • 在循环里
  • 输入值重复

白算很多次

反例

{items.map(i=>(<span>{formatPrice(i.price)}</span>))}

推荐:简单 memo

constcache=newMap()functionformatPriceCached(price){if(cache.has(price))returncache.get(price)constresult=formatPrice(price)cache.set(price,result)returnresult}

React 中更推荐:

constformatted=useMemo(()=>formatPrice(price),[price])

一句话总结

算过的值,记下来

Use toSorted() instead of sort() for immutability

不要原地排序

核心问题

array.sort()
  • 原地修改
  • 破坏不可变数据
  • React 中可能导致状态错乱

反例

constsorted=items.sort((a,b)=>a.age-b.age)setItems(sorted)

items 被直接改了

推荐:toSorted(ES2023)

constsorted=items.toSorted((a,b)=>a.age-b.age)setItems(sorted)

返回新数组,原数组不变

兼容方案

[...items].sort(...)

一句话总结

React 状态 = 不可变

Early length check for array comparisons

先比长度,再比内容

核心问题

arraysEqual(a,b)

如果:

  • 长度不同
  • 却仍然逐项对比

纯浪费

反例

functionisEqual(a,b){returna.every((v,i)=>v===b[i])}

推荐:提前剪枝

functionisEqual(a,b){if(a.length!==b.length)returnfalsereturna.every((v,i)=>v===b[i])}

场景

  • memo / shouldComponentUpdate
  • diff 算法
  • selection 对比
  • 权限数组变化检测

一句话总结

先 cheap check,再 expensive check

JS 性能心法

少动 DOM
少扫数组
少算重复
不改原数据
先剪枝

总结

JS 性能不是靠“更快算法”,而是靠“少做事”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 7:43:54

北数云内测|一句话创建你的第一个智能体

任务&#xff1a;一句话创建你的第一个智能体 任务时间&#xff1a;1.15-1.18 操作流程&#xff1a;见流程图创建完成后&#xff0c;将截图发至群内&#xff0c;并北方算网小助手一句话介绍你的智能体小助手会记录并核实发放奖励哦~内测长期任务&#xff1a;体验并提交bug或建议…

作者头像 李华
网站建设 2026/6/15 13:54:44

9 款 AI 写论文哪个好?实测揭秘!宏智树 AI 凭硬核实力登顶

毕业季的论文战场硝烟四起&#xff0c;“9 款 AI 写论文哪个好” 的灵魂拷问&#xff0c;成为高校生社群的热议焦点。市面上的 AI 写作工具琳琅满目&#xff0c;却大多难逃 “文字拼接”“文献造假”“逻辑断层” 的三大魔咒。作为深耕论文写作科普的测评博主&#xff0c;我耗时…

作者头像 李华
网站建设 2026/6/15 14:18:26

大模型强化学习训练全攻略:从RLHF到RLVR,算法、框架与性能优化详解

文章解析了大模型从预训练到后训练的转变&#xff0c;重点介绍强化学习(RL)在大模型中的应用。详细阐述了SFT、RLHF和RLVR三大训练阶段&#xff0c;PPO和GRPO等核心算法&#xff0c;以及RL训练面临的基础设施挑战&#xff0c;特别是混合负载问题。同时介绍了字节跳动的verl框架…

作者头像 李华
网站建设 2026/6/6 6:57:32

springboot宠物医院管理系统的设计与实现

SpringBoot宠物医院管理系统的设计与实现 第一章 系统整体架构设计 SpringBoot宠物医院管理系统以“流程标准化、数据一体化、服务高效化”为核心目标&#xff0c;采用“前端交互-业务服务-数据存储”三层架构。系统核心包含七大功能模块&#xff1a;宠物档案管理模块、预约挂号…

作者头像 李华
网站建设 2026/6/14 22:18:31

导师推荐!8款AI论文软件测评:研究生开题报告必备工具

导师推荐&#xff01;8款AI论文软件测评&#xff1a;研究生开题报告必备工具 2026年AI论文工具测评&#xff1a;为什么需要这份榜单&#xff1f; 在当前学术研究日益数字化的背景下&#xff0c;研究生群体在撰写开题报告、文献综述及论文写作过程中面临诸多挑战。从选题构思到内…

作者头像 李华