news 2026/5/6 5:26:12

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/5/5 20:17:08

收藏!小白程序员必学:大模型时代的AI智能体核心指南

在人工智能技术突飞猛进的当下&#xff0c;AI智能体&#xff08;AI Agents&#xff09;正逐步成为人类与大模型&#xff08;如大语言模型&#xff09;交互的核心载体。不同于传统的指令式交互&#xff0c;智能体是具备任务执行、问题解决与服务提供能力的AI系统&#xff0c;通过…

作者头像 李华
网站建设 2026/4/29 12:38:05

基于深度学习的农产品价格智能预测系统

基于深度学习的农产品价格智能预测系统 目录 项目概述 数据集介绍 系统架构设计 项目目录结构 数据库设计 算法原理与实现 数据预处理流程 模型训练过程 模型评估方法 系统界面详解 技术栈详解 使用说明 项目概述 1.1 项目背景 农产品价格预测是农业市场分析的核心问题之一。…

作者头像 李华
网站建设 2026/5/5 21:05:27

暗网揭秘:打破对互联网隐蔽侧面的十大误解与真相

暗网揭秘 — (10 of 365) 回答关于暗网最常被问到的问题 打破关于互联网隐蔽侧的迷思与误解 Abhay Parashar 阅读时间 8 分钟1天前 我一直收到并阅读大量关于暗网的问题 —— 无论是在 LinkedIn 和 X 上的直接消息&#xff0c;还是在 Reddit、Quora 和 Stack Overflow 等社交平…

作者头像 李华
网站建设 2026/5/3 1:49:28

【开源】5个适合 .NET 开发者的开源个人博客系统

文章目录前言一、Blog.Core&#xff1a;前后端分离架构的全能框架&#x1f31f; 项目简介&#x1f527; 技术栈&#x1f4cc; 地址二、Lin-Cms-Dotnetcore&#xff1a;仿掘金风格的 CMS 系统&#x1f31f; 项目简介&#x1f527; 技术架构&#x1f4cc; 地址三、FytSoaCms&…

作者头像 李华
网站建设 2026/5/2 12:24:55

软件测试面试题小结(一)

一、判断题 1&#xff0e;软件测试的目的是尽可能多的找出软件的缺陷。&#xff08;Y&#xff09; 2&#xff0e;Beta 测试是验收测试的一种。&#xff08;Y&#xff09; 3&#xff0e;验收测试是由最终用户来实施的。&#xff08;N&#xff09; 4&#xff0e;项目立项前测…

作者头像 李华