πΎ withCache β
ΠΡΠ° ΡΡΠΈΠ»ΠΈΡΠ° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ (Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ) ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ Π²ΡΠ·ΠΎΠ²Ρ fetcher. ΠΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ Π½Π΅ ΡΡΡΠ°ΡΠ΅Π»ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠ΅ΠΉΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ° withCache β
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ withCache (ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°ΡΠΈΡ) β ΡΡΠΎ Π²Π°ΠΆΠ½Π΅ΠΉΡΠΈΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΡΡΠ΅Π½Π°ΡΠΈΡΡ
Ρ ΡΠ΅Π΄ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΠΌΠΈΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°Π·ΠΈΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΡΡΠ΅ΠΉΡΠ°.
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄Π΅Π±Π°ΡΠ½ΡΠ° ΠΈ ΡΡΠΎΡΡΠ»ΠΈΠ½Π³Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ°ΡΡΠΎΡΠΎΠΉ Π²ΡΠ·ΠΎΠ²ΠΎΠ² (Time-based), ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ
(Data-based). ΠΡΠ»ΠΈ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ (source) Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ Map ΡΠΆΠ΅ Π»Π΅ΠΆΠΈΡ ΡΠ²Π΅ΠΆΠΈΠΉ ΠΎΡΠ²Π΅Ρ, Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΅Π³ΠΎ Π·Π° 0 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΌΠ΅Π½ΡΡ ΡΠ΅ΡΠ΅Π²ΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ.
1. ΠΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΡΠ°Π±Π°ΠΌΠΈ (Tab Switching / Navigation) β
- ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π±Π΅Π· Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°: Π ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ° Π΅ΡΡΡ ΡΠ°Π±Ρ: Β«ΠΡΠΎΡΠΈΠ»ΡΒ», Β«ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈΒ» ΠΈ Β«ΠΡΡΠΎΡΠΈΡ Π·Π°ΠΊΠ°Π·ΠΎΠ²Β». ΠΡΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ Β«ΠΡΡΠΎΡΠΈΡ Π·Π°ΠΊΠ°Π·ΠΎΠ²Β» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅Π»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΊ API ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΡ ΡΠΏΠΈΡΠΎΠΊ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ»ΡΡ Π½Π° ΡΠ΅ΠΊΡΠ½Π΄Ρ Π² Β«ΠΡΠΎΡΠΈΠ»ΡΒ», Π° Π·Π°ΡΠ΅ΠΌ Π²Π΅ΡΠ½ΡΠ»ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² Β«ΠΡΡΠΎΡΠΈΡ Π·Π°ΠΊΠ°Π·ΠΎΠ²Β». ΠΠ΅Π· ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ½ΠΎΠ²Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠΏΠΈΠ½Π½Π΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π·Π°ΡΡΠ°Π²ΠΈΡ ΡΠ΅ΡΠ²Π΅Ρ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΈΠ· Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π·Π°ΠΊΠ°Π·ΠΎΠ². ΠΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈ Β«Π΄Π΅ΡΠ³Π°Π½ΠΎΠ³ΠΎΒ» ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
- Π Π΅ΡΠ΅Π½ΠΈΠ΅ Ρ Cache: ΠΡ Π²ΡΡΡΠ°Π²Π»ΡΠ΅ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΊΡΡΠ° (
ttl: 60000β 1 ΠΌΠΈΠ½ΡΡΠ°). ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠΎ ΡΠ°Π±Π°ΠΌ, Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°ΡΡΡΡ ΡΡΡΠΎΠ³ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·. ΠΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΊΠ»ΠΈΠΊΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ Π±ΡΡΠ΅Ρ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠΉ, Π±Π΅ΡΡΠΎΠ²Π½ΡΠΉ ΠΎΡΠΊΠ»ΠΈΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (UX ΡΡΠΎΠ²Π½Ρ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ).
2. ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ (Dictionaries / Static Data) β
- ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠΎΡΠΌ ΠΈΠ»ΠΈ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΌ ΡΡΠ΅Π±ΡΡΡΡΡ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠ°Π½ ΠΈ Π³ΠΎΡΠΎΠ΄ΠΎΠ², ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΡΠΎΠ²Π°ΡΠΎΠ², Π²Π°Π»ΡΡΡ, ΡΠ°ΡΠΎΠ²ΡΠ΅ ΠΏΠΎΡΡΠ° ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠ°Π²). ΠΡΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠ΅ ΠΏΠΎΠ»Ρ Π²Π²ΠΎΠ΄Π° ΡΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡ Π·Π° ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΡΡΠ°Π½ β ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ΡΡΠ°ΡΠΈΡΡ ΡΠ΅ΡΡΡΡΡ Π½Π° ΠΎΡΠ΄Π°ΡΡ ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ ΡΡΠ°ΡΠΈΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Π΄Π°Π½Π½ΡΡ .
- Π Π΅ΡΠ΅Π½ΠΈΠ΅ Ρ Cache: ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ TTL ΠΊΡΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΎΠ² ΠΈΠ»ΠΈ Π΄Π½Π΅ΠΉ, Π»ΠΈΠ±ΠΎ Π΄ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ). ΠΠ΅ΡΠ²ΡΠΉ ΠΎΡΠΊΡΡΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΈΠ· ΡΠ΅ΡΠΈ, Π° Π²ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΡΠΌΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π»Π΅Π½ΠΈΠ²ΠΎ Π±Π΅ΡΡΡ Π΅Π³ΠΎ ΠΈΠ· Π³ΠΎΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΡΡΠ° Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°.
3. ΠΠ°Π³ΠΈΠ½Π°ΡΠΈΡ ΠΈ ΡΠΏΠΈΡΠΊΠΈ Ρ ΡΠΈΠ»ΡΡΡΠ°ΠΌΠΈ (Pagination / Smart Filtering) β
- ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΡΠ΅Ρ ΡΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π½Π° 2-Ρ ΡΡΡΠ°Π½ΠΈΡΡ, Π·Π°ΡΠ΅ΠΌ Π½Π° 3-Ρ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ°Π΅Ρ Π²Π΅ΡΠ½ΡΡΡΡΡ Π½Π° 1-Ρ ΡΡΡΠ°Π½ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΎΠ²Π°Ρ. ΠΠ΅Π· ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π³ Π½Π°Π·Π°Π΄ ΠΏΠΎ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ fetch-Π·Π°ΠΏΡΠΎΡΡ, Π³ΠΎΠ½ΡΡΡ ΡΡΠ°ΡΠΈΠΊ ΠΈ Π·Π°ΡΡΠ°Π²Π»ΡΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΡΡΠΆΠ΅Π»ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ (
OFFSET / LIMIT). - Π Π΅ΡΠ΅Π½ΠΈΠ΅ Ρ Cache: ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅Ρ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠ»ΡΡΡΠΎΠ² Π² ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ. ΠΡΠΈ ΠΏΡΠΎΠ»ΠΈΡΡΡΠ²Π°Π½ΠΈΠΈ ΡΡΡΠ°Π½ΠΈΡ Π½Π°Π·Π°Π΄ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΈΠ· ΠΊΡΡΠ°, ΠΈΡΠΊΠ»ΡΡΠ°Ρ ΠΌΠΎΡΠ³Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ Π»ΠΈΡΠ½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ.
4. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΠΉΡ-ΡΠ΅ΡΠΈΠ½Π³ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ (Data Sharing via DI) β
- ΠΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π΄Π°ΡΠ±ΠΎΡΠ΄-ΠΏΠ°Π½Π΅Π»ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ 5 ΡΠ°Π·Π½ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠ² (Π³ΡΠ°ΡΠΈΠΊ, ΠΊΡΡΠ³ΠΎΠ²Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ°, ΠΌΠΈΠ½ΠΈ-ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ Ρ.Π΄.), ΠΈ Π²ΡΠ΅ΠΌ ΠΈΠΌ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΡΡΠ΅Π±ΡΡΡΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π·Π° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠ΅ΡΡΡ. ΠΡΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ ΠΏΡΠΈ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠ²ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°Π³ΡΡΠ·ΠΊΠΈ, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡ 5 ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ Π±ΡΠΊΠ΅Π½Π΄Ρ.
- Π Π΅ΡΠ΅Π½ΠΈΠ΅ Ρ Cache: ΠΡΠ΅ 5 Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠ² ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ, ΠΎΠ±ΡΡΠ½ΡΡΠΎΠΌΡ Π²
withCache. ΠΠ΅ΡΠ²ΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ²ΡΠΈΠΉΡΡ Π·Π°ΠΏΡΠΎΡ ΡΠΊΠ°ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ ΠΈΡ Π²Map, Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ 4 Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΠΎΡ ΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΡΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΎΠ²Π΅ΡΡ Π΅Π΄.
ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ engine.resource ΠΈ Π΄Π²ΡΠΌΡ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ β
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±Π΅ΡΠ½ΠΈΡΠ΅ Π²Π°Ρ fetcher Π² ΡΡΠ½ΠΊΡΠΈΡ withCache. ΠΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ ΠΎΡΡΠ°ΡΡΡΡ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΌ.
import { engine } from './yourEngineInstance';
import { withCache } from './withCache';
// 1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ
const userIdSignal = engine.signal(1, 'userId');
const tabSignal = engine.signal<'posts' | 'photos'>('posts', 'tab');
// 2. ΠΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΠΈΡ
Π² Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
const userTabDeps = engine.computed(() => {
return [userIdSignal.value, tabSignal.value] as const;
});
// 3. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ΅ΡΡΡΡ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΊΡΡΠ΅ΠΌ Π½Π° 30 ΡΠ΅ΠΊΡΠ½Π΄
export const cachedUserResource = engine.resource(
withCache(
async ([userId, tab], abortSignal) => {
console.log(`π‘ ΠΠ΅Π»Π°Π΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ Π΄Π»Ρ User: ${userId}, Tab: ${tab}`);
const res = await fetch(`https://typicode.com{userId}/${tab}`, {
signal: abortSignal,
});
if (!res.ok) throw new Error('ΠΡΠΈΠ±ΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
');
return res.json();
},
{ ttl: 30 * 1000 } // ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΊΡΡΠ°: 30 ΡΠ΅ΠΊΡΠ½Π΄ (Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
)
),
userTabDeps,
'cachedUserResource'
);ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ (ΠΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ) β
- ΠΠ΅ΡΠ²ΡΠΉ Π²ΡΠ±ΠΎΡ:
userIdSignal.value = 1,tabSignal.value = 'posts'.- Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: ΠΡΡ ΠΏΡΡΡ. Π ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π»ΠΎΠ³ Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ°Π½Π½ΡΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡ Π² ΠΊΡΡ ΠΏΠΎΠ΄ ΠΊΠ»ΡΡΠΎΠΌ
"[1,\"posts\"]".
- ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅:
- Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠ΅Π½ΡΠ΅Ρ Π²ΠΊΠ»Π°Π΄ΠΊΡ Π½Π° 'photos'.
- Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: ΠΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΠΏΡΡΡ. ΠΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠ°Π½Π½ΡΠ΅ ΠΊΡΡΠΈΡΡΡΡΡΡ ΠΏΠΎΠ΄ ΠΊΠ»ΡΡΠΎΠΌ
"[1,\"photos\"]".
- ΠΠΎΠ·Π²ΡΠ°Ρ Π½Π°Π·Π°Π΄ (Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ 30 ΡΠ΅ΠΊ):
- Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΠΊΠ»Π°Π΄ΠΊΡ Π½Π° 'posts'.
- Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
withCacheΠ²ΠΈΠ΄ΠΈΡ ΠΊΠ»ΡΡ"[1,\"posts\"]", ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΠΎ 30 ΡΠ΅ΠΊΡΠ½Π΄ Π΅ΡΠ΅ Π½Π΅ ΠΏΡΠΎΡΠ»ΠΎ, ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ Π±Π΅Π· Π²ΡΠ·ΠΎΠ²Π° ΡΠ΅ΡΠΈ.
- ΠΠΎΠ·Π²ΡΠ°Ρ Π½Π°Π·Π°Π΄ (ΡΠΏΡΡΡΡ 40 ΡΠ΅ΠΊ):
- Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠ½ΠΎΠ²Π° ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π²ΠΊΠ»Π°Π΄ΠΊΡ 'posts'.
- Π Π΅Π·ΡΠ»ΡΡΠ°Ρ: ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ (TTL) ΠΈΡΡΠ΅ΠΊΠ»ΠΎ. Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΡΠ°ΡΡΠΉ ΠΊΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ.
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π½Π°ΡΡΠ΅Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ° withCache β
ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ withCache ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ ΡΠ΅ΠΉΠΊΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠΌΠ΅ΡΡ Vitest (vi.useFakeTimers). ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΠΏΠ΅ΡΠ΅Π΄, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΊΠ° ΠΆΠΈΠ·Π½ΠΈ ΠΊΡΡΠ° (TTL), Π½Π΅ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΡΠ΅ΠΊΡΠ½Π΄ Π½Π° ΡΠ°ΡΠ°Ρ
.
π Π§ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΡΠΈ ΡΠ΅ΡΡΡ: β
- ΠΠ°Π·ΠΎΠ²ΠΎΠ΅ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ source ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π²Π°ΠΆΠ΄Ρ.
- ΠΠ·ΠΎΠ»ΡΡΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ: ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
JSON.stringify(source). ΠΠ±ΡΠ΅ΠΊΡΡ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ID Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΊΡΡΠ°. - Π€Π΅ΠΉΠΊΠΎΠ²ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ (vi.advanceTimersByTimeAsync): ΠΠΌΠΈΡΠΈΡΡΠ΅Ρ ΡΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊΡΡΠ°. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΡΠΎΠ²Π½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ
now - timestamp >= ttlΡΡΠΈΠ»ΠΈΡΠ° ΠΎΡΠΈΡΠ°Π΅Ρ ΡΡΠ°ΡΡΡ Π·Π°ΠΏΠΈΡΡ ΠΈ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ²Π΅ΠΆΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅.
Π‘Π²ΠΎΠ΄Π½Π°Ρ ΡΠΏΠ°ΡΠ³Π°Π»ΠΊΠ° ΠΏΠΎ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°ΠΌ ΡΠ΅ΡΡΡΡΠΎΠ²: β
withCacheβ ΠΡΠΆΠ΅Π½, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅Π΄ΠΊΠΎ ΠΌΠ΅Π½ΡΡΡΡΡ, ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ (ΠΏΡΠΈΠΌΠ΅Ρ: ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΠ², ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΡ Π½Π°Π·Π°Π΄, ΡΡΠ°ΡΠΈΡΠ½ΡΠ΅ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠΈ).withDebounceβ ΠΡΠΆΠ΅Π½, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΡΠΈΡ (ΠΏΡΠΈΠΌΠ΅Ρ: Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΎΡΠΌΡ ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ email).withThrottleβ ΠΡΠΆΠ΅Π½, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ ΠΏΡΠΎΡΠ΅ΡΡ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅, Π½ΠΎ ΠΏΠΎΡΡΠΈΡΠΌΠΈ (ΠΏΡΠΈΠΌΠ΅Ρ: ΠΏΠ»Π°Π²Π½ΠΎΠ΅ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Ρ ΠΎΠ»ΡΡΠ΅, Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΠΊΡΠ±Π° Three.js ΠΏΡΠΈ ΡΠ΅ΡΠ°ΠΉΠ·Π΅).withThrottleAndCacheβ ΠΡΠΆΠ΅Π½, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ ΠΏΡΠΎΡΠ΅ΡΡ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅, Π½ΠΎ Π΄Π°Π½Π½ΡΠ΅ Π²Π½ΡΡΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΡΡ Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΎΠΌ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (ΠΏΡΠΈΠΌΠ΅Ρ: ΡΠΊΡΠΎΠ»Π», ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΡ, ΠΆΠΈΠ²ΠΎΠΉ ΠΏΠΎΠΈΡΠΊ).