SuperAPI AI 工具集

react-native-expert

编程与开发

查看项目

更新于 10-15 15:39

技能介绍

用途

react-native-expert 是一个面向 React Native 与 Expo 的资深移动工程师技能,用于构建生产就绪的跨平台移动应用,主要覆盖性能优化、原生感 UI 和现代 React 移动端模式。资料说明该技能适用于构建 React Native 组件、实现相关功能等场景(原文在 description 中被截断,未完整提供)。

核心原则

在使用前需遵循若干原则:理解需求后再实现,明确需求、目标平台与约束;如果用户方案存在问题应直接指出,不阿谀奉承。简洁优先,编写解决问题所需的最少代码,不做推测性抽象或过早的灵活设计,若 200 行可缩写成 50 行则重写。原生优先于 JS,始终优先使用原生组件(原生堆栈、原生标签、原生模态、原生菜单),原生实现更快、可访问性更好、更符合各平台体验。外科手术式改动,编辑现有代码时只触碰必要部分,匹配既有风格,不擅自“改进”相邻代码。目标驱动执行,实现前先定义成功标准,并在两个平台上验证。

技术栈(2026)

资料给出如下技术栈与版本参考:框架 React Native 0.79+(新架构默认);平台 Expo SDK 53+;路由 Expo Router 4+;语言 TypeScript 5.5+;React 19(启用 React Compiler);动画 Reanimated 4+;手势 Gesture Handler 2.20+;列表 LegendList(主选)、FlashList(备选);图片 expo-image;状态 Zustand(单 store)或 Jotai(原子);数据获取 TanStack Query 5+;存储 MMKV(主选)、SecureStore(敏感数据);导航 Native Stack、Native Bottom Tabs;样式 StyleSheet.create、NativeWind(可选)。

资料还列出 2026 年关键架构事实:新架构(Fabric + TurboModules)为默认,无需选择加入;React Compiler 自动处理记忆化,memo()、useCallback() 和 useMemo() 很少需要用于记忆化目的,但对象引用稳定性对列表仍然重要;在 Reanimated shared value 上使用 .get() 和 .set(),不要直接使用 .value;getBoundingClientRect() 可用于同步测量(RN 0.82+);CSS boxShadow、gap 和 experimental_backgroundImage 取代旧的 shadow/margin/gradient 模式。

工作流程

每次实现遵循以下顺序:1) 安装,使用 Expo Router 做基于文件的路由,TypeScript 严格模式;新建项目时阅读 references/project-structure.md。2) 结构,按功能组织:app/ 放路由,components/ 放 UI,hooks/、services/、stores/;完整推荐布局见 references/project-structure.md。3) 实现,优先使用原生组件(native stack、native tabs、Pressable、expo-image);用 Platform.select() 或 .ios.tsx/.android.tsx 文件处理平台差异;平台特定模式见 references/platform-handling.md,导航与路由模式见 references/expo-router.md。4) 优化,默认使用虚拟化列表(LegendList > FlashList > FlatList,动态列表绝不用 ScrollView);只对 transform 和 opacity 做动画,绝不使用布局属性;列表项中优先使用 Zustand 选择器而非 React Context;完整 35+ 条规则目录见 references/performance-rules.md。5) 测试,在 iOS 和 Android 真机上测试;验证键盘处理、安全区域和刘海行为;用 Perf Monitor 检查列表滚动性能。

关键规则(始终适用)

这些规则用于防止崩溃和严重性能问题。

渲染安全:绝不将 && 与可能为假值的值一起使用——React Native 在 <Text> 外部渲染 0 或 "" 等假值时会崩溃,应使用三元表达式配合 null 或显式布尔强制;始终将字符串包裹在 <Text> 中,字符串作为 <View> 的直接子级会导致应用崩溃。

列表性能:始终使用虚拟化组件,首选 LegendList,FlashList 是可接受的替代方案;动态列表绝不使用 ScrollView 配合 .map()。保持列表项轻量,列表项内不进行查询、数据获取或昂贵计算,将预先计算的原始值作为 props 传入,在父级获取数据。保持稳定的对象引用,不要在传给虚拟化列表前对数据做 .map() 或 .filter(),而是在列表项内使用 Zustand 选择器转换数据。

导航:仅使用原生导航器。堆栈使用 @react-navigation/native-stack 或 Expo Router 的默认 <Stack>(使用 native-stack);标签使用 react-native-bottom-tabs 或来自 expo-router/unstable-native-tabs 的 <NativeTabs>;当原生体验重要时,绝不使用 @react-navigation/stack(基于 JS)或 @react-navigation/bottom-tabs。

动画:只对 transform 和 opacity 做动画,绝不使用 width、height、top、left、margin 或 padding,它们会在每一帧触发布局重新计算。存储状态、派生视觉,shared value 应表示实际状态(pressed、progress),而非视觉输出(scale、opacity),用 interpolate() 派生视觉。所有 Reanimated shared value 访问都使用 .get() 和 .set(),这是 React Compiler 兼容所必需的。

图片:始终使用 expo-image 而非 React Native 的 Image,它提供内存高效的缓存、blurhash 占位符和更好的列表性能。

样式(现代模式):子元素之间使用 gap 而非 margin;使用 CSS boxShadow 而非旧版 shadow 对象;使用 borderCurve 获得更平滑的圆角;使用原生渐变而非第三方库。

状态管理:派生值,绝不存储冗余状态;若某值可从现有 state/props 计算,则在渲染时计算。列表项中使用 Zustand 或 Jotai 而非 React Context。Zustand 擅长带持久化的单 store 模式(Zustand persist + MMKV);Jotai 擅长细粒度原子状态与派生原子。当下一状态依赖当前状态时使用 dispatch 更新器;对响应式默认值使用回退模式(undefined 初始状态 + ?? 运算符)。

模态与菜单:模态使用原生 <Modal presentationStyle="formSheet"> 或 React Navigation v7 的 presentation: 'formSheet' 配合 sheetAllowedDetents,避免基于 JS 的底部表单库;菜单使用 zeego 实现原生下拉和上下文菜单,绝不构建自定义 JS 菜单;可按压元素使用 react-native 或 react-native-gesture-handler 的 Pressable,绝不使用 TouchableOpacity 或 TouchableHighlight。

约束

必须做:所有列表使用 LegendList/FlashList(绝不用 ScrollView 配合 .map());为刘海处理 SafeAreaView / contentInsetAdjustmentBehavior="automatic";使用 Pressable 而非 Touchable 组件;在 iOS 和 Android 真机上测试;表单使用 KeyboardAvoidingView 并采用平台适当的 behavior;在自定义导航流程中处理 Android 返回按钮;所有图片渲染使用 expo-image;使用原生导航器(native-stack、native-bottom-tabs);使用 TypeScript 严格模式。

禁止做:对动态/大列表使用 ScrollView;列表项中使用内联样式对象(破坏记忆化);硬编码尺寸(使用 Dimensions API、flex 或百分比);忽略来自订阅/监听器的内存泄漏;跳过平台特定测试;使用 setTimeout/waitFor 做动画(使用 Reanimated);在 shared value 上使用 .value(使用 .get()/.set());使用 useAnimatedReaction 做派生(使用 useDerivedValue);在 state 中存储视觉值(存储状态、派生视觉);使用 TouchableOpacity 或 TouchableHighlight(使用 Pressable);使用 @react-navigation/stack(使用 native-stack);使用 React Native 的 Image 组件(使用 expo-image)。

参考指南

根据上下文加载详细指导:性能规则见 references/performance-rules.md(优化列表、动画、渲染、状态管理或审查性能问题时);Expo Router 见 references/expo-router.md(设置导航、标签、堆栈、深链、受保护路由或 Expo Router 4+ 模式时);项目结构见 references/project-structure.md(新建项目、配置 TypeScript、组织代码或定义依赖时);平台处理见 references/platform-handling.md(编写 iOS/Android 特定代码、SafeArea、键盘处理、状态栏或返回按钮时);存储模式见 references/storage-patterns.md(使用 MMKV、Zustand persist、SecureStore 持久化数据或 AsyncStorage 迁移时)。

输出格式

实现 React Native 功能时始终提供:带 TypeScript 类型的组件代码;存在差异时提供平台特定处理;若组件是屏幕则提供导航集成;对任何可能影响滚动/动画流畅度的内容提供性能说明。

限制

资料未提供该技能的收费、价格、支持平台或具体使用场景限制等信息。上述内容均来自资料原文,未做补充或推断。