Skip to content

πŸ’Ύ 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. Всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ взаимодСйствиС с сигналами остаётся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ.

ts
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'
);

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ (Π›ΠΎΠ³ΠΈΠΊΠ° повСдСния) ​

  1. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€:
  • userIdSignal.value = 1, tabSignal.value = 'posts'.
  • Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Кэш пуст. Π’ консоли появится Π»ΠΎΠ³ запроса. Π”Π°Π½Π½Ρ‹Π΅ сохранятся Π² кэш ΠΏΠΎΠ΄ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "[1,\"posts\"]".
  1. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:
  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ мСняСт Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Π½Π° 'photos'.
  • Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Кэш для Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ пуст. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ запрос. Π”Π°Π½Π½Ρ‹Π΅ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "[1,\"photos\"]".
  1. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π½Π°Π·Π°Π΄ (Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 30 сСк):
  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Π½Π° 'posts'.
  • Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: withCache Π²ΠΈΠ΄ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡ "[1,\"posts\"]", провСряСт, Ρ‡Ρ‚ΠΎ 30 сСкунд Π΅Ρ‰Π΅ Π½Π΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎ, ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· памяти Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° сСти.
  1. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π½Π°Π·Π°Π΄ (спустя 40 сСк):
  • Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ снова ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ 'posts'.
  • Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: ВрСмя ΠΆΠΈΠ·Π½ΠΈ (TTL) истСкло. Ѐункция удаляСт старый кэш, выполняСт Π½ΠΎΠ²Ρ‹ΠΉ сСтСвой запрос ΠΈ обновляСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€.

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ насчСт тСстирования Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° withCache ​

Для тСстирования Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ withCache ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ Ρ„Π΅ΠΉΠΊΠΎΠ²Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ Vitest (vi.useFakeTimers). Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²ΠΏΠ΅Ρ€Π΅Π΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ истСчСниС срока ΠΆΠΈΠ·Π½ΠΈ кэша (TTL), Π½Π΅ доТидаясь Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… сСкунд Π½Π° часах.

πŸ” Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ эти тСсты: ​

  1. Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ source ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ асинхронный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ вызываСтся Π΄Π²Π°ΠΆΠ΄Ρ‹.
  2. Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ΡΡ сСриализация JSON.stringify(source). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ID Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ Π² памяти кэша.
  3. Π€Π΅ΠΉΠΊΠΎΠ²ΠΎΠ΅ врСмя (vi.advanceTimersByTimeAsync): Π˜ΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ старСниС кэша. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ²Π½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ now - timestamp >= ttl ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ запись ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ свСТиС Π΄Π°Π½Π½Ρ‹Π΅.

Бводная ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΏΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°ΠΌ рСсурсов: ​

  • withCache β€” НуТСн, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π΄ΠΊΠΎ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ сСтСвыС запросы ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±ΠΎΠ², пагинация Π½Π°Π·Π°Π΄, статичныС справочники).
  • withDebounce β€” НуТСн, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°Ρ‚ΠΈΡ… (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: валидация Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ email).
  • withThrottle β€” НуТСн, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ процСсс Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅, Π½ΠΎ порциями (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ»Π°Π²Π½ΠΎΠ΅ рисованиС Π½Π° холстС, анимация ΠΊΡƒΠ±Π° Three.js ΠΏΡ€ΠΈ рСсайзС).
  • withThrottleAndCache β€” НуТСн, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ΅Π½ процСсс Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅, Π½ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого процСсса ΠΈΠΌΠ΅ΡŽΡ‚ свойство ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΌ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: скролл, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚, ΠΆΠΈΠ²ΠΎΠΉ поиск).