news 2026/4/2 12:57: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/4/1 1:30:55

告别文献 “乱炖”!宏智树 AI 手把手教你写出有灵魂的文献综述

作为深耕论文写作科普的教育博主&#xff0c;后台总能刷到这样的求助&#xff1a;“读了几十篇文献&#xff0c;写出来的综述像‘大杂烩’”“观点堆砌没逻辑&#xff0c;被导师批‘没找到研究缺口’”“参考文献格式错一堆&#xff0c;查重率还居高不下”。文献综述不是简单的…

作者头像 李华
网站建设 2026/3/27 3:44:48

0x3f第32天复习 (12;30-12:50)

子串基础前缀和思考前缀和的定义是什么和为k的子数组1min ac两数之和接雨水三数之和ac字母异位词分组ac最长连续序列ac移动零ac无重复字符的最长子串ac找到字符串中所有字母异位词ac滑动窗口最大值1min ac1min ac最小覆盖子串1min ac1min ac思考买卖股票的最佳时机1min ac1min …

作者头像 李华
网站建设 2026/3/26 2:31:20

大模型算法社招面试全攻略:技术要点+简历优化+代码题解析

本文作者分享了从国企跳槽至大模型算法领域社招的完整经历。详细介绍了职业规划考量、简历准备技巧&#xff0c;以及大模型相关技术面试要点&#xff0c;包括SFT、RAG、Agent等热门技术方向。同时提供了常见代码题考察情况和业务方向分析&#xff0c;为想进入大模型领域的求职者…

作者头像 李华
网站建设 2026/4/1 10:54:30

算法题 增减字符串匹配

942. 增减字符串匹配 问题描述 给定只含 "I"&#xff08;增加&#xff09;和 "D"&#xff08;减少&#xff09;的字符串 s&#xff0c;令 n s.length。 根据 s 构造一个排列 perm&#xff08;长度为 n 1&#xff09;&#xff0c;使得对于所有的 i&#x…

作者头像 李华
网站建设 2026/3/27 7:25:55

基于Django的蔬菜批发管理系统设计与实现

基于Django的蔬菜批发管理系统设计与实现 一、系统开发背景与意义 蔬菜批发行业作为农产品流通的关键环节&#xff0c;长期面临供应链效率低、损耗率高、交易流程繁琐等问题。传统模式下&#xff0c;供应商信息分散导致采购比价困难&#xff0c;库存依赖人工盘点易造成积压或缺…

作者头像 李华
网站建设 2026/3/31 12:39:34

京东价格API:历史价格趋势分析与定价参考技术实现

本文介绍如何通过京东开放平台API获取商品历史价格数据&#xff0c;并基于时间序列分析构建定价参考模型。以下为完整技术方案&#xff1a;一、API接入准备认证流程开发者需注册京东宙斯账号&#xff0c;申请price_histroy接口权限&#xff0c;获取app_key和app_secret。请求头…

作者头像 李华