π§ββοΈβοΈπ ΠΠ°ΠΊ ΡΡΠΊΠΎΡΠΈΡΡ React Π½Π° 300%: ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΊΠ΅ΠΉΡ
ΠΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ DOM React β ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π½ΠΎ Π½Π΅ Π²ΠΎΠ»ΡΠ΅Π±Π½Π°Ρ ΠΏΠ°Π»ΠΎΡΠΊΠ°. ΠΡΠ»ΠΈ Π½Π΅ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π±ΡΡΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π½Π΅ΠΏΠΎΠ²ΠΎΡΠΎΡΠ»ΠΈΠ²ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΡΡΡΠ°. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΡΡΠΈΠΌ, Π½ΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ. ΠΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΠ²ΠΈΡΡ ΠΈ ΡΡΡΡΠ°Π½ΠΈΡΡ ΡΠ·ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ React-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΠΊΠ΅ΠΉΡΡ, ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.

Π ΠΏΡΠΎΡΠ»ΠΎΠΌ Π³ΠΎΠ΄Ρ Ρ ΡΠ΄Π΅Π»Π°Π» e-commerce ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π»ΠΎΡΡ Π·Π° 1,5 ΡΠ΅ΠΊΡΠ½Π΄Ρ. Π‘ΠΏΡΡΡΡ ΠΏΠΎΠ»Π³ΠΎΠ΄Π°, ΠΏΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ β Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΈΠ»ΡΡΡΠΎΠ² ΡΠΎΠ²Π°ΡΠΎΠ² ΠΈ ΡΠ°ΡΠ° β Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π²ΡΡΠΎΡΠ»ΠΎ Π΄ΠΎ 8 ΡΠ΅ΠΊΡΠ½Π΄. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»ΠΈ ΠΎΠΏΠ»Π°ΡΠΈΠ²Π°ΡΡ Π·Π°ΠΊΠ°Π·Ρ, Π·Π°ΠΊΠ°Π·ΡΠΈΠΊ ΠΏΡΠΈΡΠ΅Π» Π² ΡΡΠΎΡΡΡ. Π§ΡΠΎ ΠΆΠ΅ ΡΡΠ°Π»ΠΎ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΡΠ°ΠΊΠΎΠ³ΠΎ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΡ? ΠΠ΅ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΡΠ΅Π½Π΄Π΅ΡΡ ΠΈ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ΄.
React Ρ Π΅Π³ΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ DOM β Π½Π΅ Π²ΠΎΠ»ΡΠ΅Π±Π½Π°Ρ ΠΏΠ°Π»ΠΎΡΠΊΠ°. ΠΠ°ΠΊ Π»ΡΠ±ΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΎΠ½ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ:
- Π‘ΠΊΡΡΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° Π² React (ΠΈ ΠΊΠ°ΠΊ ΠΈΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ).
- ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ Π°ΡΠ΄ΠΈΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠΊΠΎΡΠΈΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 300% (Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ Β«Π΄ΠΎΒ» ΠΈ Β«ΠΏΠΎΡΠ»Π΅Β»).
ΠΠ°ΠΊ React ΡΠ΅Π½Π΄Π΅ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ DOM React ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ, ΠΎΠ½ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ DOM ΡΠΎ ΡΡΠ°ΡΡΠΌ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ ΡΠ°ΡΡΠΈ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΡΡΠΎ React Π·Π°ΠΎΠ΄Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠΎ, ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
ΠΠ΅Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΡΠ΅Π½Π΄Π΅ΡΡ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ:
function App() { const [count, setCount] = useState(0); return ( <div> <button onClick={() => setCount(count + 1)}>Increment</button> <StaticComponent /> {/* Renders every time count changes! */} </div> ); } function StaticComponent() { console.log("I'm rendering unnecessarily "); return <div>I never change!</div>; }
Π§ΡΠΎ Π·Π΄Π΅ΡΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ? ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΆΠΈΠΌΠ°Π΅ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ° Increment
, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ, Ρ
ΠΎΡΡ ΠΎΠ½ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ count
. Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ» ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΎΠ² ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π» Π΄Π°ΡΠ±ΠΎΡΠ΄, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΡΠ΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ»ΡΡ 100 ΡΠ°Π· Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ!
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ΠΎΠΌ
React DevTools
ΠΠ°ΠΊ Π²ΡΡΠ²ΠΈΡΡ Π»ΠΈΡΠ½ΠΈΠ΅ ΡΠ΅Π½Π΄Π΅ΡΡ? ΠΠΎΠΌΠΎΠΆΠ΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½ React DevTools Π΄Π»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Chrome:
- ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ DevTools β Π²ΠΊΠ»Π°Π΄ΠΊΠ° Profiler β Start Recording.
- ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΡ).
- ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΎΡΡΠ΅Ρ.
ΠΡΡΠ΅Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
β² Flamegraph Snapshot (After 3 clicks) ββ App (Root) [Duration: 2.5ms] β ββ button [Duration: 0.2ms] β ββ StaticComponent [Duration: 1.8ms] β ββ console.log call ββ App (Root) [Duration: 2.3ms] β ββ button [Duration: 0.1ms] β ββ StaticComponent [Duration: 1.7ms] ββ App (Root) [Duration: 2.6ms] β ββ button [Duration: 0.2ms] β ββ StaticComponent [Duration: 1.9ms]
ΠΡΠΎΡ ΠΎΡΡΠ΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ StaticComponent
ΡΠ΅Π½Π΄Π΅ΡΠΈΠ»ΡΡ 3 ΡΠ°Π·Π° Π±Π΅Π· Π²ΡΡΠΊΠΎΠΉ Π½Π° ΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ!
πΠΠ°ΠΊ Π½Π°ΠΉΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠ°? ΠΡΠΈΡΠ΅ ΠΎΡΠ°Π½ΠΆΠ΅Π²ΡΠ΅/ΠΆΠ΅Π»ΡΡΠ΅ ΠΏΠΎΠ»ΠΎΡΡ Π² ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΠ΅ βΠΎΠ½ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠ΅ ΡΠ΅Π½Π΄Π΅ΡΡ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ StaticComponent
Π·Π°ΡΠ²Π΅ΡΠΈΠ»ΡΡ, ΠΊΠ°ΠΊ Π½ΠΎΠ²ΠΎΠ³ΠΎΠ΄Π½ΡΡ Π΅Π»ΠΊΠ°.
ΠΠ°ΠΊ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ ΡΠ΅Π½Π΄Π΅ΡΡ
ΠΠ»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅Π½ΡΠΆΠ½ΡΡ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠΎΠ² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ why-did-you-render:
npm install @welldone-software/why-did-you-render
ΠΠ°ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π² index.js ΠΈΠ»ΠΈ App.js, ΡΡΠΎΠ±Ρ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ , ΡΠ΅Π½Π΄Π΅ΡΡΡΠΈΡ ΡΡ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ:
import React from 'react'; if (process.env.NODE_ENV !== 'production') { const whyDidYouRender = require('@welldone-software/why-did-you-render'); whyDidYouRender(React, { trackAllPureComponents: true, // Shames all components into behaving }); }
ΠΠ°ΠΊ-ΡΠΎ ΡΠ°Π· ΡΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠΎΠΌΠΎΠ³Π»Π° ΠΌΠ½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Header
ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠΈΠ»ΡΡ ΠΈΠ·-Π·Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° userPreferences
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»ΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅. ΠΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΡ (Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ·ΠΆΠ΅).
ΠΡΠ½oΠ²Π½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
React.memo β Π±Π°ΡΠ½ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
React.memo ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ ΡΠ΅Π½Π΄Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΠΏΡΠΎΠΏΡΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ.
β ΠΠΎ (ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°):
ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ user
ΠΎΡΡΠ°Π»ΡΡ ΡΠ΅ΠΌ ΠΆΠ΅:
<UserProfile user={user} /> {/* ΠΠΈΡΠ½ΠΈΠΉ ΡΠ΅ΡΠ΅Π½Π΄Π΅Ρ! */}
β ΠΠΎΡΠ»Π΅ (ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅):
React.memo Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΏΡΠΎΠ² ΠΈ Π½Π΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π·Π°Π½ΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ:
const UserProfile = React.memo(({ user }) => { return <div>{user.name}</div>; });
β οΈΠΠ°ΠΆΠ½ΡΠΉ Π½ΡΠ°Π½Ρ!
React.memo ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π»ΠΈΡΠ½ΠΈΠΉ ΡΠ΅Π½Π΄Π΅Ρ:
// ΠΠ΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ `user` - ΡΡΠΎ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠΌΠΈ <UserProfile user={{ name: 'Alice' }} /> // Π Π°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π°ΠΌΠΈ <UserProfile userId={42} />
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ Π»ΠΈ ΠΏΡΠΎΠΏΡ:
const UserProfile = React.memo( ({ user }) => <div>{user.name}</div>, (prevProps, nextProps) => prevProps.user.id === nextProps.user.id );
ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ React.memo:
- ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Ρ ΡΡΠΆΠ΅Π»ΡΠΌ UI (ΡΠ°Π±Π»ΠΈΡΡ, Π³ΡΠ°ΡΠΈΠΊΠΈ).
- Π§Π°ΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌΡΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (Π½ΠΎΠ²ΠΎΡΡΠ½Π°Ρ Π»Π΅Π½ΡΠ°, ΡΠΈΠ΄ ΡΠΎΡΡΠ΅ΡΠΈ ΠΈ Ρ. ΠΏ.)
useCallback ΠΈ useMemo
ΠΡΠΈ Π΄Π²Π° Ρ ΡΠΊΠ° ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΡ ΠΈ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠΈΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ.
useCallback Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π»ΠΈΡΠ½ΠΈΡ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠΎΠ² ΠΈΠ·-Π·Π° ΡΡΠ½ΠΊΡΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΠΈ Π² JavaScript ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
β ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ β ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ onClick
ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
function App() { const [count, setCount] = useState(0); // ΠΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅ const handleClick = () => setCount(count + 1); return <Button onClick={handleClick} />; } const Button = React.memo(({ onClick }) => { return <button onClick={onClick}>Click me</button>; });
β
Π Π΅ΡΠ΅Π½ΠΈΠ΅ β useCallback
Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅Ρ Π΅Π΅ Π·Π°Π½ΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ:
const handleClick = useCallback(() => { setCount(prev => prev + 1); // ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ prev, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ }, []); // ΠΡΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ² => ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·
useMemo Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ (10 000+ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²), ΠΈ Π²Ρ ΡΠΈΠ»ΡΡΡΡΠ΅ΡΠ΅ Π΅Π³ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈ, Π±Π΅Π· useMemo Π½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ.
β ΠΠ΅Π· useMemo ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅:
const filteredList = hugeList.filter(item => item.includes(searchTerm));
β ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ useMemo Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°:
const filteredList = useMemo(() => { return hugeList.filter(item => item.includes(searchTerm)); }, [hugeList, searchTerm]); // ΠΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
ΠΡΠ»ΠΎΠΆΠ΅Π½Π½Π°Ρ ΠΈ ΡΠΎΠ½ΠΎΠ²Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ°
ΠΠ° Π³Π»Π°Π²Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠ»Π°ΡΡ ΡΠ²Π΅ΡΠΈΡΡΠ°Ρ ΠΊΠ°ΡΡΡΠ΅Π»Ρ, ΠΈ ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π·Π°Π³ΡΡΠΆΠ°Π»ΡΡ Π΄Π°ΠΆΠ΅ Π΄Π»Ρ ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π»ΠΈ ΡΠ°ΠΉΡ ΠΏΠΎΡΡΠΈ ΡΡΠ°Π·Ρ. Π’Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π½ΡΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½Ρ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ React.lazy Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠΈ:
const ProductCarousel = React.lazy(() => import('./ProductCarousel')); function HomePage() { return ( <div> <HeroBanner /> <Suspense fallback={<Spinner />}> <ProductCarousel /> {/* ΠΠ°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΠ΅Π½Π΄Π΅ΡΠ΅ */} </Suspense> </div> ); }
ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½ΠΈΠ·ΠΊΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ:
const ProductCarousel = React.lazy(() => import( /* webpackPrefetch: true */ './ProductCarousel' ));
ΠΠ΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΌΠΈΠ½ΡΡ β ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π½Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠΏΠΈΠ½Π½Π΅Ρ ΠΏΡΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 3G).
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ: Context API ΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠΏΠΈΡΠΊΠ°ΠΌΠΈ
Context API β Π½Π΅Π·Π°ΠΌΠ΅ΡΠ½ΡΠΉ ΡΠ±ΠΈΠΉΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
Π€Π°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° β Ρ ΡΠ°Π½ΠΈΡΡ Π² AppContext ΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΈ ΡΠ΅ΠΌΡ ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΡ, ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ. ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°ΡΡΡΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ β ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ:
<UserContext.Provider value={user}> <ThemeContext.Provider value={theme}> <App /> </ThemeContext.Provider> </UserContext.Provider>
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ theme
Π·Π°ΡΡΠ°Π²ΠΈΡ ΡΠ΅ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ThemeContext
.
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ²
ΠΡΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π΅ ΡΠΏΠΈΡΠΊΠ° ΠΈΠ· 10 000 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π±ΡΠ°ΡΠ·Π΅Ρ ΡΠΎΠ·Π΄Π°eΡ 10 000 DOM-ΡΠ·Π»ΠΎΠ². ΠΡΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ, Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅Ρ ΠΏΡΠΎΠΊΡΡΡΠΊΡ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π·Π°Π²ΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠ»Π°Π±ΡΡ Π³Π°Π΄ΠΆΠ΅ΡΠ°Ρ . Π Π΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° react-window, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΈΠ΄ΠΈΠΌΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, Π° Π½Π΅ Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ:
import { FixedSizeList as List } from 'react-window'; const Row = ({ index, style }) => ( <div style={style}>Item {data[index]}</div> ); function BigList() { return ( <List height={400} // ΠΡΡΠΎΡΠ° ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠΏΠΈΡΠΊΠ° itemCount={10000} // ΠΡΠ΅Π³ΠΎ 10 000 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² itemSize={50} // ΠΡΡΠΎΡΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° width={300} // Π¨ΠΈΡΠΈΠ½Π° ΡΠΏΠΈΡΠΊΠ° > {Row} </List> ); }
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ DOM-ΡΠ·Π»ΠΎΠ² ΡΠΎΠΊΡΠ°ΡΠ°Π΅ΡΡΡ Ρ 10 000 Π΄ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 20 (Π² Π·ΠΎΠ½Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ), CPU Π½Π΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°Π΅ΡΡΡ, Π»Π°Π³ΠΈ ΠΈΡΡΠ΅Π·Π°ΡΡ, ΠΏΡΠΎΠΊΡΡΡΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠ»Π°Π²Π½ΠΎΠΉ.
Π Π΅Π°Π»ΡΠ½ΡΠΉ ΠΊΠ΅ΠΉΡ: ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄Π»Ρ Π±ΡΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΡΠ΅ΡΠ΅ΡΡΠ²ΠΈΠΉ
ΠΠ»Π°ΡΡΠΎΡΠΌΠ° Π΄Π»Ρ Π±ΡΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΡΠ΅ΡΠ΅ΡΡΠ²ΠΈΠΉ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π»Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠΈΡΠΊΠ°. ΠΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π±ΡΠ»ΠΈ:
- 4-ΡΠ΅ΠΊΡΠ½Π΄Π½Π°Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ².
- ΠΠ°Π³ΠΈ ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ ΡΠ΅ΠΊΡΡΠ° Π² ΠΏΠΎΠΈΡΠΊΠ΅ ΠΈΠ·-Π·Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΎΠΊ.
ΠΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π²ΡΡΡΠ½ΠΈΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ:
- ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ SearchResults Π½Π΅ Π±ΡΠ» ΠΌΠ΅ΠΌΠΎΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°Π»ΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ.
- API-Π·Π°ΠΏΡΠΎΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ»ΠΈΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ», ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°Ρ ΡΠ΅ΡΠ²Π΅Ρ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅:
1. ΠΠ΅Π±Π°ΡΠ½Ρ (ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π»ΠΈΡΠ½ΠΈΡ API-Π·Π°ΠΏΡΠΎΡΠΎΠ²). ΠΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΡ 500 ΠΌΡ, ΡΡΠΎΠ±Ρ API-Π·Π°ΠΏΡΠΎΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ:
const SearchInput = () => { const [query, setQuery] = useState(''); const debouncedQuery = useDebounce(query, 500); // ΠΠ΄Π΅ΠΌ 500 ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΠΎΡΠΎΠΌ useEffect(() => { fetchResults(debouncedQuery); // ΠΠ°ΠΏΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΠ°ΡΠ·Ρ Π² Π²Π²ΠΎΠ΄Π΅ }, [debouncedQuery]); };
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
- ΠΡΡΠ΅Π·Π»ΠΈ Π»ΠΈΡΠ½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΏΡΠΈ Π½Π°Π±ΠΎΡΠ΅ ΡΠ΅ΠΊΡΡΠ°, ΡΠ½ΠΈΠ·ΠΈΠ»Π°ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° API.
- Π£ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ ΠΎΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° Π±Π΅Π· Π»Π°Π³ΠΎΠ².
2. ΠΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² (useMemo). ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π»ΠΈΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ useMemo Π΄Π»Ρ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ :
const results = useMemo(() => processRawData(rawData), [rawData]);
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
- ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
rawData
Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ. - Π‘Π½ΠΈΠ·ΠΈΠ»Π°ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° CPU.
- Π‘ΡΡΠ°Π½ΠΈΡΠ° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»Π° ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ.
ΠΠ±ΡΠΈΠΉ ΠΈΡΠΎΠ³ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ β Π²ΡΠ΅ΠΌΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ½ΠΈΠ·ΠΈΠ»ΠΎΡΡ Ρ 4 Ρ Π΄ΠΎ 1,2 Ρ, Π»Π°Π³ΠΈ ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ ΡΠ΅ΠΊΡΡΠ° ΠΈΡΡΠ΅Π·Π»ΠΈ, ΠΏΡΠΎΠΊΡΡΡΠΊΠ° ΡΡΠ°Π»Π° ΠΏΠ»Π°Π²Π½ΠΎΠΉ.
Π§Π°ΡΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ React-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
ΠΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ Π΄Π°ΠΆΠ΅ Ρ ΡΡΠ΅ΡΠΎΠΌ React.memo?
React.memo Π½Π΅ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅Ρ ΠΎΡ Π²ΡΠ΅Ρ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ°ΠΌΠ½Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΡΠ·Π²Π°ΡΡ Π»ΠΈΡΠ½ΠΈΠ΅ ΡΠ΅Π½Π΄Π΅ΡΡ. ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΡ:
1. ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° Π½ΠΎΠ²ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²/ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π² ΠΏΡΠΎΠΏΡΡ (ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅):
<MyComponent style={{ color: 'red' }} /> // ΠΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΅Π½Π΄Π΅ΡΠ΅!
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ useMemo ΠΈΠ»ΠΈ Π²ΡΠ½ΠΎΡΠΈΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°.
2. ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (useContext) ΠΌΠΎΠ³ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ (UserContext, ThemeContext ΠΈ Ρ. Π΄.), ΡΡΠΎΠ±Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½Π°Ρ ΡΠ°ΡΡΡ UI.
Π‘ΡΠΎΠΈΡ Π»ΠΈ ΡΡΠ»ΠΎΠΆΠ½ΡΡΡ ΠΊΠΎΠ΄ ΡΠ°Π΄ΠΈ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ?
- ΠΠ°, Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ Π²ΠΈΠ΄Π΅Π½ ΡΡΠ°Π·Ρ (ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π½ΠΈΠΆΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΊΡΠ°Π½Π°). ΠΡΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π±Π°Π½Π΄Π»Π°.
- ΠΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²Π°ΠΆΠ΅Π½ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠ° (ΡΠ°ΠΏΠΊΠ°, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΌΠ΅Π½Ρ). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ.
ΠΠ°ΠΊ ΡΠ±Π΅Π΄ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΡΠΎ ΠΏΠΎΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΊΠΎΡΠΎΡΡΡ?
ΠΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠΉΡΠ΅ ΠΈΠΌ Lighthouse-ΠΎΡΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Deloitte ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΡΠ° Π²ΡΠ΅Π³ΠΎ Π½Π° 0,1 Ρ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΠΈ Π½Π° 8,4-10,1%.
ΠΠΎΠ΄Π²Π΅Π΄Π΅ΠΌ ΠΈΡΠΎΠ³ΠΈ
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ React-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β ΡΡΠΎ Π½Π΅ ΡΠ°Π·ΠΎΠ²ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π° ΠΏΡΠΎΡΠ΅ΡΡ. ΠΠ»Π°Π²Π½ΠΎΠ΅ β Π½Π΅ ΠΏΡΡΠ°ΡΡΡΡ ΡΠ»ΡΡΡΠΈΡΡ ΠΊΠΎΠ΄ Π²ΡΠ»Π΅ΠΏΡΡ:
- Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ. ΠΠ΅ Π³Π°Π΄Π°ΠΉΡΠ΅, Π³Π΄Π΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ ΡΠ·ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠ° Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ React DevTools. ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ·ΠΊΠΈΡ ΠΌΠ΅ΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°ΡΡ Π²Π°ΠΌ ΡΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
- ΠΠ΅ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΠΉΡΠ΅ Π²ΡΠ΅ Π² useMemo Π½Π° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠ΅ΠΌ ΡΠ΅ΡΠΈΡ.
- ΠΡΠΈΠΌΠΈΡΠ΅ Π½Π΅ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎ. Π’ΠΎΡΠ΅ΡΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° 90% Π±ΡΡΡΡΠ΅Π΅ Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡΠ°ΠΌΠΈ, Π»ΡΡΡΠ΅ Π³ΠΈΠΏΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΡΡΠ΅Π½ΠΎ.