shopify-react-native-performance-lists-profiler
@amazon-devices/shopify__react-native-performance-lists-profilerは、@shopify/react-native-performance-navigation上にある拡張ライブラリです。FlatListコンポーネントとFlashListコンポーネントをプロファイリングするためのユーティリティを提供します。
インストール
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" },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コールバックで使用されるリストの名前です。 |
すべて |
実装の詳細
- ライブラリのアップストリームバージョンのドキュメントには、
FlashListPerformanceViewAPIはFlatListPerformanceViewと同じであると誤って記載されています。onInteractiveとonBlankAreaを直接使用できるのは、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日

