mcpField
R
react-native-best-practices

react-native-best-practices

github.com/ilteoood开发2406 次安装1 周前更新
代码仓库

关于 react-native-best-practices

面向 React Native 应用的性能优化指南,覆盖 JavaScript、iOS 与 Android 原生层及打包。提供以测量为基础的流程和参考资料,用于分析、定位并验证针对性改动。

主要功能

  1. 01测量、优化、验证工作流
  2. 02JavaScript 与 React 性能分析指引
  3. 03原生性能与内存管理指引
  4. 04Bundle 与应用体积分析
  5. 05启动时间与 TTI 优化
  6. 06按优先级组织的参考指南

适用场景

  1. 01排查界面卡顿或动画掉帧
  2. 02定位内存泄漏或过多重复渲染
  3. 03缩短启动时间或减小 Bundle
  4. 04审查原生模块的性能

安装

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

$npx skills add https://github.com/ilteoood/harness --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