news 2026/5/23 14:02:58

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/5/14 23:02:25

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

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

作者头像 李华
网站建设 2026/5/21 14:22:49

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

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

作者头像 李华
网站建设 2026/5/8 22:45:19

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

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

作者头像 李华
网站建设 2026/5/13 19:27:18

算法题 增减字符串匹配

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

作者头像 李华
网站建设 2026/5/23 10:56:01

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

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

作者头像 李华
网站建设 2026/5/13 6:24:14

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

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

作者头像 李华