news 2026/6/15 19:38:28

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

作者头像

张小明

前端开发工程师

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

文章目录

  • 前言
  • Guidelines
  • Rendering Patterns
    • Animate SVG wrappers, not SVG elements directly
      • 核心问题
      • 反例:直接动画
      • 推荐:动画容器
      • 典型场景
    • Use content-visibility: auto for long lists
      • 核心问题
      • 反例:普通列表
      • 推荐:content-visibility
      • 额外技巧
    • Prevent hydration mismatch with inline scripts
      • 核心问题
      • 反例:SSR 内直接修改 DOM
      • 推荐做法
      • 场景
    • Use explicit conditional rendering
      • 核心问题
      • 反例:用 &&
      • 推荐:用三元
      • 额外注意
  • 总结

前言

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 中的实际收益

Rendering Patterns

这是系列的第四部分。

Animate SVG wrappers, not SVG elements directly

「不要直接在 SVG 元素上做动画」

核心问题

  • SVG 元素本身(<path><circle>)渲染成本高
  • 动画会频繁触发 repaint / reflow
  • 会严重影响性能,尤其在大量节点或复杂图形中

反例:直接动画

<svg width="100"height="100"><circle cx="50"cy="50"r="40"fill="red"style={{transform:`rotate(${angle}deg)`}}/></svg>

每次angle更新,浏览器必须重绘整个<circle>

推荐:动画容器

<div style={{transform:`rotate(${angle}deg)`}}><svg width="100"height="100"><circle cx="50"cy="50"r="40"fill="red"/></svg></div>

好处:

  • 浏览器只在<div>上做 GPU transform
  • <svg>内容不会被重复绘制
  • 动画性能大幅提升

典型场景

  • 仪表盘指针
  • loading spinner
  • 图表动态旋转

Use content-visibility: auto for long lists

「长列表使用 content-visibility 延迟渲染」

核心问题

  • 浏览器渲染大 DOM(数百 / 千行)性能低
  • 每次 scroll / paint 都计算 layout

反例:普通列表

<ul>{data.map(item=><li key={item.id}>{item.name}</li>)}</ul>
  • 1000 行 → 每次渲染 / scroll 都会 layout / paint

推荐:content-visibility

<ul style={{contentVisibility:'auto',containIntrinsicSize:'1000px'}}>{data.map(item=><li key={item.id}>{item.name}</li>)}</ul>

好处:

  • 浏览器只渲染可视区域
  • DOM 节点仍在 document flow
  • 性能接近虚拟列表,但不依赖 JS

额外技巧

  • contain-intrinsic-size提前占位
  • 表格、卡片、长文列表非常适用

Prevent hydration mismatch with inline scripts

「避免 hydration mismatch / 客户端渲染与服务端不一致」

核心问题

  • React SSR + RSC / Next.js
  • 服务端生成 HTML → 客户端 hydrate
  • 如果 inline JS 改变 DOM 或插入元素
  • 会导致Hydration Mismatch→ 控制台报错 / UI 闪烁

反例:SSR 内直接修改 DOM

<div dangerouslySetInnerHTML={{__html:`<script>document.body.style.background='red'</script>`}}/>
  • 服务端生成的 DOM 和客户端 React DOM不一致
  • React hydrate 失败

推荐做法

  • useEffect / useLayoutEffect在客户端处理
useEffect(() => { document.body.style.background = 'red' }, [])

SSR 阶段不改 DOM → 避免 mismatch

场景

  • 动态插入广告 / 脚本
  • 第三方库初始化
  • UI 初始化特效

Use explicit conditional rendering

「条件渲染用三元表达式,而不是 &&」

核心问题

  • false && <Component />会渲染false→ 有时造成空 DOM / Hydration mismatch
  • 特别在 SSR / Client Hydration 时容易出错

反例:用 &&

{isVisible && <Modal />}
  • SSR:isVisible=false→ 渲染false
  • Client:isVisible=true→ 渲染<Modal />
  • React 可能报 hydration mismatch

推荐:用三元

{isVisible ? <Modal /> : null}
  • SSR / Client 渲染保持一致
  • Hydration 安全

额外注意

  • 对列表也适用:
{/* ❌ 不推荐 */} {items.length && <List items={items} />} {/* ✅ 推荐 */} {items.length > 0 ? <List items={items} /> : null}

总结

Rendering Patterns =让浏览器和 React 都高效

  • SVG 动画 → wrapper transform
  • 长列表 → content-visibility
  • SSR → hydrate 安全
  • 条件渲染 → 明确三元
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:20:37

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

文章目录前言GuidelinesJavaScript PatternsBatch DOM CSS changes via classes核心问题反例&#xff1a;逐条改 style推荐&#xff1a;class 批量切换典型场景一句话总结Build index maps for repeated lookups核心问题反例推荐&#xff1a;构建索引 Map典型场景一句话总结Cac…

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

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

任务&#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/15 19:05:22

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

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

作者头像 李华