最佳实践
这些最佳实践也可作为 Agent Skill 提供给你的 coding agent。使用 npx skills add lynx-community/skills 安装,即可在编辑器中获得自动检测和自动修复能力。
本页介绍使用 ReactLynx 开发时的常见模式和陷阱,重点关注 Lynx 的双线程架构。
原生 API 调用使用 'background only'
严重程度:关键
在 Lynx 的双线程架构中,主线程负责 React 组件渲染和 JSX 求值,后台线程管理 effects、事件处理和原生模块调用。在主线程上调用 lynx.getJSModule 或 NativeModules 等原生 API 会导致 UI 阻塞、同步开销和用户体验下降。
错误示例
正确示例
原生模块调用在后台线程执行的上下文中是允许的:
允许的上下文
原生模块调用在以下上下文中是安全的:
useEffect/useLayoutEffecthooksuseImperativeHandle实现- Ref 回调
- 事件处理函数(
bindtap等) - 使用
'background only'指令标记的函数
'background only' 指令
当包含原生调用的函数不自然地属于上述上下文之一时,将 'background only' 指令作为函数体的第一条语句:
单引号和双引号均可:'background only' 和 "background only"。
正确使用事件处理函数
严重程度:中
ReactLynx 中的事件处理函数运行在后台线程上,因此可以安全地进行原生模块调用、API 请求和繁重计算。
事件处理类型
基本用法
推荐使用函数引用而非内联函数以获得更好的性能:
事件传播
使用 bindtap 冒泡:
使用 catchtap 阻止传播:
使用 dataset
通过 data- 属性传递自定义数据,而非使用闭包:
要点
- 使用函数引用而非内联箭头函数以获得更好的性能
- 仅在需要阻止事件传播时使用
catchtap - 尽可能使用
dataset传递数据而非闭包 - 优先使用
currentTarget而非target来访问监听元素的数据
使用主线程脚本实现流畅动画
严重程度:中
在 Lynx 的多线程架构中,事件在主线程上触发,但常规 JS 事件处理函数在后台线程上执行。这种往返会导致动画和手势处理中明显的延迟。主线程脚本提供主线程上的同步事件处理,消除响应延迟。
错误示例
正确示例
使用方法
- 为事件属性添加
main-thread:前缀:
- 使用
'main thread'指令声明函数:
使用 main-thread:ref
使用 useMainThreadRef() 获取可在主线程上使用的节点对象:
在主线程中维护状态
使用 MainThreadRef 在主线程函数调用之间持久化状态:
规则
提升静态 JSX 元素
严重程度:低
当 JSX 元素在组件函数内部定义时,它们会在每次渲染时重新创建。对于永远不会改变的静态元素,这是不必要的开销。将它们提取为组件外部的常量。
错误示例
正确示例
这对于大型静态 SVG 节点尤其有帮助,因为重新创建它们的成本很高。
如果你的项目使用了 React Compiler,它会自动提升静态 JSX 元素并优化组件重新渲染,无需手动提升。