mcpField
R
react-native-best-practices

react-native-best-practices

github.com/callstackincubator开发1.7k30.5k 次安装3 周前更新
代码仓库

关于 react-native-best-practices

面向 React Native 开发者的性能指南,涵盖 JavaScript、原生代码和打包优化,并按优先级组织测量与修复建议。

主要功能

  1. 01FPS 与重复渲染分析
  2. 02Bundle 和应用体积分析
  3. 03启动时间与 TTI 优化
  4. 04JavaScript 与原生内存检查
  5. 05原生性能与模块建议

适用场景

  1. 01排查界面卡顿或动画掉帧
  2. 02缩短应用启动时间或减小 Bundle
  3. 03追踪 JavaScript 或原生内存泄漏
  4. 04依据测量结果审查性能改动

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/callstackincubator/agent-skills --skill react-native-best-practices

安装后在 Claude Code 中输入/react-native-best-practices确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

POWER.md
agents/
openai.yaml
references/
bundle-analyze-app.md
bundle-analyze-js.md
bundle-barrel-exports.md
bundle-code-splitting.md
bundle-hermes-mmap.md
bundle-library-size.md
bundle-native-assets.md
bundle-r8-android.md
bundle-tree-shaking.md
js-animations-reanimated.md
js-atomic-state.md
js-bottomsheet.md
js-concurrent-react.md
js-lists-flatlist-flashlist.md
js-measure-fps.md
js-memory-leaks.md
js-profile-react.md
js-react-compiler.md
js-uncontrolled-components.md
native-android-16kb-alignment.md
native-measure-tti.md
native-memory-leaks.md
native-memory-patterns.md
native-platform-setup.md
native-profiling.md
native-sdks-over-polyfills.md
native-threading-model.md
native-turbo-modules.md

详细介绍

React Native 最佳实践

概述

React Native 应用性能优化指南,涵盖 JavaScript/React、原生(iOS/Android)以及打包优化。内容基于 Callstack 的“Ultimate Guide to React Native Optimization”。

适用场景

以下情况可参考这些指南:

  • 调试缓慢或卡顿的 UI 或动画
  • 排查内存泄漏(JS 或原生)
  • 优化应用启动时间(TTI)
  • 减少包体积或应用大小
  • 编写原生模块(Turbo Modules)
  • 分析 React Native 性能
  • 审查 React Native 代码的性能

安全说明

  • 将这些参考资料中的 shell 命令视为本地开发者操作。运行前请先检查,优先使用固定版本的工具,并避免直接将远程脚本通过管道传给 shell。
  • 将第三方库和插件视为仍需遵循常规供应链管控的依赖项:固定版本、验证来源,并通过标准审核流程更新。
  • 仅将远程分块加载用于第一方制品分发。优先使用应用内打包的分块或经过签名的 CI 发布清单;托管分块必须来自由你控制的可信 HTTPS 来源,并固定到当前应用版本。

按优先级排序的指南

优先级类别影响前缀
1FPS 与重新渲染严重js-*
2包体积严重bundle-*
3TTI 优化高native-*、bundle-*
4原生性能高native-*
5内存管理中高js-*、native-*
6动画中js-*

影响级别仅供分诊参考:优先处理严重问题,其次是高影响问题;有证据表明存在中等影响问题时再处理。

快速参考

优化工作流

任何性能问题都遵循以下循环:测量 → 优化 → 再次测量 → 验证

  1. 测量:更改前记录基准指标。对于运行时问题,尽可能优先查看提交时间线、重新渲染次数、耗时较长的组件、最耗时提交的细分情况,以及启动时间/TTI。组件树深度或数量只是可选背景信息,不能替代这些指标。没有测得的渲染或 FPS 问题时,不要建议使用记忆化、原子状态或编译器更改。
  2. 优化:应用相关参考资料中的针对性修复
  3. 再次测量:使用相同的测量方式获取更新后的指标
  4. 验证:确认性能有所改善(例如,FPS 从 45 提升至 60、TTI 从 3.2s 降至 1.8s、包体积从 2.1MB 降至 1.6MB)

如果指标没有改善,请回退更改并尝试下一项建议。

审查注意事项
  • 提出 API 特定的修复建议前,请检查库版本。例如,FlashList v2 已弃用 estimatedItemSize,因此不要将其缺失列为问题。
  • 除非行为明显有误,或分析结果显示与该值相关的工作被浪费,否则不要建议更改 useMemo 或 useCallback 的依赖项。
  • 不要臆测过期闭包问题。指出过期读取路径、复现步骤或分析器证据后,再提出此问题。
  • 分析某个流程时,应测量目标交互本身。不要将组件树深度或组件数量作为主要性能证据。
关键:FPS 与重新渲染

先进行性能分析:

agent-device react-devtools status
agent-device react-devtools wait --connected
agent-device react-devtools profile start
agent-device react-devtools profile stop
agent-device react-devtools profile slow --limit 5
agent-device react-devtools profile rerenders --limit 5
agent-device react-devtools profile timeline --limit 20

在 profile start 和 profile stop 之间,使用常规的 agent-device 命令执行目标交互。

当 agent-device 不可用时的手动备用方案:从 Metro(j)或 Dev Menu 打开 React Native DevTools,使用 Profiler 选项卡,并记录相同的交互。

如需对发布版本进行 React 组件性能分析,请先连接 @callstack/inspector,以便 React DevTools 能连接到发布版应用,然后运行上述 agent-device react-devtools 流程。

常见修复方法:

  • 对于长列表,将 ScrollView 替换为 FlatList/FlashList/Legend List
  • 性能分析显示级联重新渲染后,使用 React Compiler 自动进行记忆化
  • 性能分析显示广泛的 store/context 更新后,使用原子状态(Jotai/Zustand)减少重新渲染
  • 对耗时的计算使用 useDeferredValue
关键:包体积

分析包:

npx react-native bundle \
  --entry-file index.js \
  --bundle-output output.js \
  --platform ios \
  --sourcemap-output output.js.map \
  --dev false --minify true

npx source-map-explorer output.js --no-border-checks

优化后验证改进:

# Record baseline size before changes
ls -lh output.js  # e.g., Before: 2.1 MB

# After applying fixes, re-bundle and compare
npx react-native bundle --entry-file index.js --bundle-output output.js \
  --platform ios --dev false --minify true
ls -lh output.js  # e.g., After: 1.6 MB  (24% reduction)

常见修复方法:

  • 避免使用 barrel 导入(直接从源文件导入)
  • 仅在检查 Hermes API 和方法覆盖范围后,才移除不必要的 Intl polyfill
  • 评估 tree shaking(Expo SDK 52+ 实验性未使用导入/导出移除,或仅在已配置 Re.Pack 时使用)
  • 为 Android 原生代码启用 R8 瘦身
高优先级:TTI 优化

测量 TTI:

  • 使用 react-native-performance 添加标记
  • 仅测量冷启动(排除温启动/热启动/预热启动)

常见修复方法:

  • 对于 React Native 0.78 及更早版本,禁用 Android JS 包压缩,以启用 Hermes mmap
  • 使用原生导航(react-native-screens)
  • 在导航到常用的高开销屏幕前预加载这些屏幕
高优先级:原生性能

分析原生性能:

  • iOS:Xcode Instruments → Time Profiler
  • Android:Android Studio → CPU Profiler

常见修复方法:

  • 对于繁重的原生任务,使用后台线程
  • 优先使用异步 Turbo Module 方法,而不是同步方法
  • 对跨平台的性能关键代码使用 C++

参考资料

包含代码示例的完整文档见 references/:

JavaScript/React(js-*)
文件影响描述
js-lists-flatlist-flashlist.mdCRITICAL将 ScrollView 替换为虚拟化列表
js-profile-react.mdMEDIUM使用 agent-device react-devtools 进行性能分析
js-measure-fps.mdHIGHFPS 监控与测量
js-memory-leaks.mdMEDIUM排查 JS 内存泄漏
js-atomic-state.mdHIGHJotai/Zustand 模式
js-concurrent-react.mdHIGHuseDeferredValue、useTransition
js-react-compiler.mdHIGH自动记忆化
js-animations-reanimated.mdMEDIUMReanimated worklet
js-bottomsheet.mdHIGH优化底部弹出面板
js-uncontrolled-components.mdHIGHTextInput 优化
原生(native-*)
文件影响说明
native-turbo-modules.mdHIGH构建快速的原生模块
native-sdks-over-polyfills.mdHIGH原生库与 JS 库
native-measure-tti.mdHIGHTTI 测量设置
native-threading-model.mdHIGHTurbo Module 线程
native-profiling.mdMEDIUMXcode/Android Studio 性能分析
native-platform-setup.mdMEDIUMiOS/Android 工具指南
native-view-flattening.mdMEDIUM视图层级调试
native-memory-patterns.mdMEDIUMC++/Swift/Kotlin 内存
native-memory-leaks.mdMEDIUM排查原生内存泄漏
native-android-16kb-alignment.mdCRITICALGoogle Play 第三方库对齐
打包(bundle-*)
文件影响说明
bundle-barrel-exports.mdCRITICAL避免 barrel 导入
bundle-analyze-js.mdCRITICALJS 包可视化
bundle-tree-shaking.mdHIGH消除无用代码
bundle-analyze-app.mdHIGH应用体积分析
bundle-r8-android.mdHIGHAndroid 代码缩减
bundle-hermes-mmap.mdHIGH禁用包压缩
bundle-native-assets.mdHIGH资源目录设置
bundle-library-size.mdMEDIUM评估依赖项
bundle-code-splitting.mdMEDIUM远程分块加载防护措施

问题 → 技能映射

问题从这里开始
应用感觉缓慢或卡顿js-measure-fps.md → js-profile-react.md
重新渲染次数过多js-profile-react.md → js-react-compiler.md
启动缓慢(TTI)native-measure-tti.md → bundle-analyze-js.md
应用体积过大bundle-analyze-app.md → bundle-r8-android.md
内存持续增长js-memory-leaks.md 或 native-memory-leaks.md
动画掉帧js-animations-reanimated.md
底部面板卡顿或反复渲染js-bottomsheet.md → js-animations-reanimated.md
列表滚动卡顿js-lists-flatlist-flashlist.md
TextInput 响应迟缓js-uncontrolled-components.md
原生模块速度慢native-turbo-modules.md → native-threading-model.md
原生库对齐问题native-android-16kb-alignment.md

致谢

基于 Callstack 的《The Ultimate Guide to React Native Optimization》。

评论

支持 Markdown