正在加载,请稍候…

React Native 性能优化:Hermes、新架构与更多实践

全面指南,涵盖 Hermes 引擎、新架构迁移、FlatList 调优及原生模块最佳实践,助你打造高性能 React Native 应用。

React Native Performance Optimization: Hermes, New Architecture, and Beyond

React Native 性能优化:Hermes、新架构与更多实践

React Native 已经发生了巨大的变化。随着 Hermes JavaScript 引擎成为默认选项,以及新架构(Fabric + JSI)在主流应用中逐步推广,开发者拥有了强大的新工具来构建真正高性能的移动体验。

理解 React Native 线程模型

React Native 运行在三个线程上:

  • JS 线程:执行你的 JavaScript 代码
  • 主/UI 线程:处理原生 UI 渲染
  • 影子线程:使用 Yoga 计算布局

传统的 React Native 通过异步桥接在 JS 和原生之间通信,导致帧率下降和卡顿。新架构用 JSI(JavaScript Interface)取代了桥接,实现了同步的原生调用。

React Native Performance Optimization: Hermes, New Architecture, and Beyond illustration

启用并优化 Hermes

Hermes 是专门为 React Native 优化的 JavaScript 引擎。它在构建时将 JavaScript 预编译为字节码,从而减少启动时间和内存占用。

启用 Hermes

android/app/build.gradle 中:

project.ext.react = [
  enableHermes: true
]

ios/Podfile 中:

use_react_native!(
  :hermes_enabled => true
)

Hermes 性能特性

Hermes 在启动时间、内存效率和可交互时间(TTI)方面表现出色。来自生产应用的数据显示,与 V8 相比,Hermes 的 TTI 提升了 40-60%。

使用 Hermes 进行性能分析

通过 Flipper 或独立分析器使用 Hermes 分析器:

npx react-native start --experimental-debugger

React Native Performance Optimization: Hermes, New Architecture, and Beyond illustration

迁移到新架构

新架构包括:

  • Fabric:用于同步 UI 操作的新渲染器
  • JSI:无需桥接的直接 JS 到原生绑定
  • TurboModules:通过 JSI 实现的懒加载原生模块
  • Codegen:类型安全的原生模块接口

逐步迁移

在 Android 中启用新架构:

// android/gradle.properties
newArchEnabled=true

在 iOS 中启用新架构:

cd ios && RCT_NEW_ARCH_ENABLED=1 bundle exec pod install

创建 TurboModule 规范文件 NativeMyModule.ts

import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
  multiply(a: number, b: number): Promise<number>;
  getDeviceInfo(): Promise<{ model: string; os: string }>;
}

export default TurboModuleRegistry.getEnforcing<Spec>('MyModule');

优化 FlatList 和 VirtualizedList

FlatList 是最常被误用的组件之一。当所有项具有固定高度时,使用 getItemLayout

const ITEM_HEIGHT = 80;

<FlatList
  data={items}
  getItemLayout={(data, index) => ({
    length: ITEM_HEIGHT,
    offset: ITEM_HEIGHT * index,
    index,
  })}
  renderItem={({ item }) => <ItemRow item={item} />}
/>

记忆化 renderItem

const renderItem = useCallback(({ item }) => (
  <MemoizedItemRow item={item} />
), []);

const MemoizedItemRow = React.memo(({ item }) => {
  return (
    <View style={styles.row}>
      <Text>{item.title}</Text>
      <Text>{item.subtitle}</Text>
    </View>
  );
}, (prevProps, nextProps) => prevProps.item.id === nextProps.item.id);

React Native Performance Optimization: Hermes, New Architecture, and Beyond illustration

关键参数 windowSize 和 maxToRenderPerBatch

<FlatList
  windowSize={5}
  maxToRenderPerBatch={10}
  initialNumToRender={8}
  updateCellsBatchingPeriod={50}
  removeClippedSubviews={true}
/>

图片优化

使用 react-native-fast-image 实现更好的缓存:

import FastImage from 'react-native-fast-image';

<FastImage
  style={styles.image}
  source={{
    uri: 'https://example.com/image.jpg',
    priority: FastImage.priority.normal,
    cache: FastImage.cacheControl.immutable,
  }}
  resizeMode={FastImage.resizeMode.cover}
/>

使用 JSI 的原生模块最佳实践

使用新架构,为性能关键操作编写 JSI 模块:

// ios/MyJSIModule.cpp
void MyJSIModule::install(jsi::Runtime& runtime) {
  auto multiply = jsi::Function::createFromHostFunction(
    runtime,
    jsi::PropNameID::forAscii(runtime, "multiply"),
    2,
    [](jsi::Runtime& runtime, const jsi::Value& thisValue,
       const jsi::Value* args, size_t count) -> jsi::Value {
      double a = args[0].asNumber();
      double b = args[1].asNumber();
      return jsi::Value(a * b);
    }
  );
  runtime.global().setProperty(runtime, "multiply", std::move(multiply));
}

避免常见性能陷阱

避免在 render 中使用匿名函数:

// 不好 - 每次渲染创建新函数
<TouchableOpacity onPress={() => handlePress(item.id)}>

// 好 - 稳定引用
const handleItemPress = useCallback(() => handlePress(item.id), [item.id]);
<TouchableOpacity onPress={handleItemPress}>

对耗时操作使用 InteractionManager:

import { InteractionManager } from 'react-native';

useEffect(() => {
  const task = InteractionManager.runAfterInteractions(() => {
    processLargeDataset(data);
  });
  return () => task.cancel();
}, [data]);

测量性能

使用自定义性能标记:

import { PerformanceObserver, performance } from 'react-native';

performance.mark('render-start');
// 渲染代码
performance.mark('render-end');
performance.measure('render-duration', 'render-start', 'render-end');

const observer = new PerformanceObserver((list) => {
  list.getEntries().forEach((entry) => {
    console.log(`${entry.name}: ${entry.duration}ms`);
  });
});
observer.observe({ entryTypes: ['measure'] });

结论

2026 年的 React Native 性能优化是一门多层次的学科。从采用 Hermes 和新架构开始,获得基础性能提升。通过正确的 FlatList 配置优化列表。通过摇树优化和懒加载最小化包体积。使用 Flipper 尽早并频繁地进行性能分析。这些技术的组合可以让你的 React Native 应用接近原生性能。