as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
AWS
ドキュメント
Support
Contact Us
My Cases
開発
設計と開発
公開
リファレンス
サポート

shopify-react-native-performance-lists-profiler

shopify-react-native-performance-lists-profiler

@amazon-devices/shopify__react-native-performance-lists-profilerは、@shopify/react-native-performance-navigation上にある拡張ライブラリです。FlatListコンポーネントとFlashListコンポーネントをプロファイリングするためのユーティリティを提供します。

インストール

  1. package.jsonファイルにJavaScriptライブラリの依存関係を追加します。

    クリップボードにコピーしました。

     "dependencies": {
     ...
     "@amazon-devices/react-navigation__native": "~2.0.0",
     "@amazon-devices/react-navigation__stack": "~2.0.0",
     "@amazon-devices/shopify__flash-list": "~2.0.0",
     "@shopify/react-native-performance-lists-profiler": "npm:@amazon-devices/shopify__react-native-performance-lists-profiler@~1.1.0",
     "@amazon-devices/keplerscript-turbomodule-api": "~1.0.0"
     },
    
  2. npm installコマンドを使用して、依存関係を再インストールします。

クリップボードにコピーしました。


import React, {
  createContext,
  ReactNode,
  useCallback,
  useContext,
  useState,
} from 'react';
import {
  Button,
  FlatList,
  ListRenderItem,
  StyleSheet,
  Text,
  TouchableOpacity,
  View,
} from 'react-native';
import { NavigationContainer } from '@amazon-devices/react-navigation__native';
import {
  createStackNavigator,
  StackScreenProps,
} from '@amazon-devices/react-navigation__stack';
import {
  FlashListPerformanceView,
  FlatListPerformanceView,
  ListsProfiler,
} from '@shopify/react-native-performance-lists-profiler';
import {
  FlashList,
  ListRenderItem as FlashListRenderItem,
} from '@amazon-devices/shopify__flash-list';

interface BlankArea {
  start: number;
  end: number;
}

interface ListsProfilerContextType {
  listName: string;
  tti: number | undefined;
  blankArea: BlankArea | undefined;
  resetContext: () => void;
  onInteractive: (tti: number, listName: string) => void;
  onBlankArea: (start: number, end: number, listName: string) => void;
}

const ListsProfilerContext = createContext<ListsProfilerContextType | null>(
  null,
);

interface ListsProfilerContextProviderProps {
  children: ReactNode;
}

const ListsProfilerContextProvider = ({
  children,
}: ListsProfilerContextProviderProps) => {
  const [listName, setListName] = useState('');
  const [tti, setTti] = useState<number>();
  const [blankArea, setBlankArea] = useState<BlankArea>();

  const resetContext = useCallback(() => {
    setListName('');
    setTti(undefined);
    setBlankArea(undefined);
  }, []);

  const onInteractive = useCallback((tti: number, listName: string) => {
    setTti(tti);
    setListName(listName);
  }, []);

  const onBlankArea = useCallback(
    (start: number, end: number, listName: string) => {
      setBlankArea({ start, end });
      setListName(listName);
    },
    [],
  );

  return (
    <ListsProfilerContext.Provider
      value={{
        listName,
        tti,
        blankArea,
        resetContext,
        onInteractive,
        onBlankArea,
      }}
    >
      {children}
    </ListsProfilerContext.Provider>
  );
};

type StackParamList = {
  FlashListScreen: undefined;
  FlatListScreen: undefined;
  HomeScreen: undefined;
};

const Stack = createStackNavigator<StackParamList>();

const NavigationTree = () => {
  const { onInteractive, onBlankArea } = useContext(
    ListsProfilerContext,
  ) as ListsProfilerContextType;

  return (
    <ListsProfiler onInteractive={onInteractive} onBlankArea={onBlankArea}>
      <NavigationContainer>
        <Stack.Navigator initialRouteName="HomeScreen">
          <Stack.Screen
            name="HomeScreen"
            component={HomeScreen}
            options={{ headerShown: false }}
          />
          <Stack.Screen name="FlatListScreen" component={FlatListScreen} />
          <Stack.Screen name="FlashListScreen" component={FlashListScreen} />
        </Stack.Navigator>
      </NavigationContainer>
    </ListsProfiler>
  );
};

const HomeScreen = ({
  navigation,
}: StackScreenProps<StackParamList, 'HomeScreen'>) => {
  const { resetContext } = useContext(
    ListsProfilerContext,
  ) as ListsProfilerContextType;

  const onNavigate =
    (screenName: 'FlatListScreen' | 'FlashListScreen') => () => {
      resetContext();
      navigation.navigate(screenName);
    };

  return (
    <View style={styles.container}>
      <Text style={styles.text}>FlatList Example</Text>
      <Button title="FlatListScreen" onPress={onNavigate('FlatListScreen')} />
      <Text style={styles.text}>FlashList Example</Text>
      <Button title="FlashListScreen" onPress={onNavigate('FlashListScreen')} />
    </View>
  );
};

export interface Item {
  bgColor: string;
  title: string;
  height: number;
}

const listData = Array.from({ length: 1000 }, (_, i) => ({
  title: `アイテム${i + 1}`,
  bgColor: `#${Math.floor(Math.random() * 16777215).toString(16)}`,
  height: Math.floor(Math.random() * (140 - 60) + 60),
}));

interface ListItemProps {
  item: Item;
}

const ListItem = ({ item }: ListItemProps) => {
  return (
    <TouchableOpacity
      style={{ backgroundColor: item.bgColor, height: item.height }}
    >
      <Text style={styles.itemText}>{item.title}</Text>
    </TouchableOpacity>
  );
};

const DataDisplay = () => {
  const { listName, tti, blankArea } = useContext(
    ListsProfilerContext,
  ) as ListsProfilerContextType;

  return (
    <View style={styles.display}>
      <Text style={styles.text}>List name: {listName}</Text>
      <View style={styles.spacer} />
      <Text style={styles.text}>TTI: {tti ?? 'n/a'}</Text>
      <View style={styles.spacer} />
      <Text style={styles.text}>
        Blank area:{' '}
        {blankArea ? JSON.stringify(blankArea, undefined, 0) : 'n/a'}
      </Text>
    </View>
  );
};

const FlatListScreen = () => {
  const renderItem: ListRenderItem<Item> = useCallback(
    ({ item }) => <ListItem item={item} />,
    [],
  );

  return (
    <View style={styles.listContainer}>
      <DataDisplay />
      <FlatListPerformanceView listName="flatlist">
        <FlatList data={listData} renderItem={renderItem} />
      </FlatListPerformanceView>
    </View>
  );
};

const FlashListScreen = () => {
  const renderItem: FlashListRenderItem<Item> = useCallback(
    ({ item }) => <ListItem item={item} />,
    [],
  );

  return (
    <View style={styles.listContainer}>
      <DataDisplay />
      <FlashListPerformanceView listName="flashlist">
        <FlashList data={listData} renderItem={renderItem} />
      </FlashListPerformanceView>
    </View>
  );
};

export const App = () => {
  return (
    <ListsProfilerContextProvider>
      <NavigationTree />
    </ListsProfilerContextProvider>
  );
};

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#fff',
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  display: {
    flexDirection: 'row',
    alignItems: 'center',
    justifyContent: 'center',
    paddingVertical: 20,
  },
  itemText: {
    fontSize: 24,
    color: '#fff',
    fontWeight: '500',
  },
  listContainer: {
    flex: 1,
  },
  spacer: {
    width: 32,
  },
  text: {
    fontSize: 30,
    fontWeight: '500',
  },
});

APIリファレンス

このライブラリの情報、APIリファレンス、その他の詳細については、 公式ドキュメントのreact-native-performance-lists-profiler(英語のみ)を参照してください。

コンポーネント

コンポーネント 説明
ListsProfiler パフォーマンス指標を収集するために使用されるコンポーネントです。アプリツリーの上位にマウントします。
FlatListPerformanceView パフォーマンス指標の収集を可能にするFlatListコンポーネントのラッパーです。
FlashListPerformanceView パフォーマンス指標の収集を可能にするFlashListコンポーネントのラッパーです。

ListsProfilerのプロパティ

プロパティ 説明
onInteractive プロファイリングされたリストがインタラクティブになったときにトリガーされるコールバックです。プロファイリング結果をカスタムの方法で処理するために使用します。このプロパティには2つのパラメーターがあります。 TTIはインタラクティブになるまでの時間を表します。listNameはパフォーマンスビューで定義されたリストの名前です。
onBlankArea 空白領域がない場合でも、スクロールするリストのフレームごとにトリガーされるコールバックです。プロファイリング結果をカスタムの方法で処理するために使用されます。このプロパティには3つのパラメーターがあります。
offsetStart - 画面上部に表示される空白領域(上にスクロール時)です。値が0より大きい場合に表示されます。
offsetEnd - 画面下部に表示される空白領域(下にスクロール時)です。値が0より大きい場合に表示されます。
listName - パフォーマンスビューで定義されたリストの名前です。

FlatListPerformanceView

プロパティ 説明
listName onInteractiveコールバックとonBlankAreaコールバックで使用されるリストの名前です。
onInteractive プロファイリングされたリストがインタラクティブになったときにトリガーされるコールバックです。ListsProfilerの使用を避ける場合には、FlatListPerformanceViewで直接使用します。このプロパティには2つのパラメーターがあります。 TTI - インタラクティブになるまでの時間を表します。
listName - FlatListPerformanceViewで定義されたリストの名前です。
onBlankArea 空白領域がない場合でも、スクロールするリストのフレームごとにトリガーされるコールバックです。ListsProfilerの使用を避ける場合には、FlatListPerformanceViewで直接使用します。このプロパティには3つのパラメーターがあります。offsetStart - 画面上部に表示される空白領域(上にスクロール時)です。値が0より大きい場合に表示されます。
offsetEnd - 画面下部に表示される空白領域(下にスクロール時)です。値が0より大きい場合に表示されます。
listName - FlatListPerformanceViewで定義されたリストの名前です。

FlashListPerformanceView

プロパティ 説明 対応プラットフォーム
listName onInteractiveコールバックとonBlankAreaコールバックで使用されるリストの名前です。 すべて

実装の詳細

  • ライブラリのアップストリームバージョンのドキュメントには、FlashListPerformanceView APIはFlatListPerformanceViewと同じであると誤って記載されています。onInteractiveonBlankAreaを直接使用できるのは、FlatListPerformanceViewを使用した場合のみです。

サポートされているバージョン

パッケージ名 Amazon NPMライブラリのバージョン Vega OSのビルド番号 Vega SDKバージョン リリースノート
@amazon-devices/shopify__react-native-performance-lists-profiler 2.0.1+4.1.2 OS 1.1 (201010438050) 0.20  

関連リソース

その他のライブラリについては、サポート対象のサードパーティのライブラリとサービスを参照してください。


Last updated: 2025年9月30日