リアクションアプリのパフォーマンスをブーストすることは、ユーザーエクスペリエンスのポジティブに不可欠です。 この記事では、多数の生産Reactアプリケーションの最適化から収集された7つの実績のあるパフォーマンスパターンの概要を説明します。
usememo
and usecallback
: 問題:変更されていない小道具または状態による不必要な再レンダー。
solution:キャッシュ計算上高価な操作と関数参照。
const ExpensiveComponent = ({ items }) => {
const sortedList = useMemo(() => items.sort((a, b) => a.price - b.price), [items]);
const handleClick = useCallback(() => {
console.log('Item clicked:', sortedList[0]);
}, [sortedList]);
return ;
};
ベストプラクティス:は、不必要なサブツリーの更新を防ぐために、子コンポーネントの race.memo
を使用します。 複雑な計算(ソート、フィルタリング)、最適化された子供に渡されたコールバック、および安定したコンテキストプロバイダーの値に最適です。
問題:ファーストコンテンツペイント(fcp)に影響を与える大きな初期バンドルサイズ。
solution:ダイナミックインポートと suspense on-demand loading。
const HeavyChartLibrary = React.lazy(() => import('./ChartComponent'));
const Dashboard = () => (
}>
{showCharts && }
);
Advanced:ルートベースのコード分割のためにReactルーターと統合。
問題:何千ものアイテムをレンダリングします。
solution: race-window レンダリングされたアイテムのみをレンダリングします。
import { FixedSizeList } from 'react-window';
const BigList = ({ items }) => (
{({ index, style }) => (
...
)}
);
ボーナス:を使用します。
効率的な状態管理:
race 18:
setCount(1); settext( 'updated'); //単一の再render
プレオクト前18または複雑なシナリオの場合:
Atomic State UpdatesにsetCount(1);
setText('Updated'); // Single re-render
debouncing api呼び出し:
usedebounce hook。
Import {effect、useState} from 'race';
const sudeBouncedValue =(value、delay)=> {
const [debouncedValue、setDebouncedValue] = uesestate(value);
effect(()=> {
const handler = setimeout(()=> setDebouncedValue(value)、delay);
return()=> cleartimeout(handler);
}、[value、delay]);
debouncedValueを返します。
};
Pro Tip:
import { useEffect, useState } from 'react';
const useDebouncedValue = (value, delay) => {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => setDebouncedValue(value), delay);
return () => clearTimeout(handler);
}, [value, delay]);
return debouncedValue;
};
最適化コンテキストAPI:
楽観的なui更新:
パフォーマンスチェックリスト:
React DevTools Profilerを使用したプロファイル再レンダー。
バンドルサイズをSource-Map-Explorerで分析します。 Chromeのパフォーマンスタブ(CPUスロットリング)でテストします。
インクリメンタルロードを実装します。
怠zyなロードで画像/メディアを最適化します。
重要なコンテンツのサーバー側のレンダリングを検討してください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3