Бпособы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°

БущСствуСт Ρ†Π΅Π»Ρ‹ΠΉ ряд Π·Π°Π΄Π°Ρ‡, для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ состояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ контСкстами Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π°ΠΌΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ, ΠΎΠΊΠ½Π° ΠΈ встроСнныС Π½Π° страницу Ρ„Ρ€Π΅ΠΉΠΌΡ‹. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ способы Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ рСсурса (same-origin).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡:

  • ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° (auth token) Π²ΠΎ всСх контСкстах ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ…;
  • Ρ€Π°Π·Π»ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²ΠΎ всСх контСкстах, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ сСссия Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ…;
  • синхронизация клиСнтского состояния ΠΌΠ΅ΠΆΠ΄Ρƒ контСкстами ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ клиСнтского состояния Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… контСкстах ΠΊΠ°ΠΊ рСакция Π½Π° событиС Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ…;
  • оптимистичноС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ UI Π²ΠΎ всСх ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… контСкстах Π±Π΅Π· нСобходимости синхронизации с сСрвСром (Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ»Π»ΠΈΠ½Π³Π° ΠΈΠ»ΠΈ вСбсокСты);
  • остановка дСйствия Π²ΠΎ всСх контСкстах, ΠΊΡ€ΠΎΠΌΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, остановка проигрывания Π°ΡƒΠ΄ΠΈΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π²Π΅Π±-ΠΏΠ»Π΅Π΅Ρ€Π° Π² ΠΎΠ΄Π½ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅, Ссли ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ).

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим самыС популярныС способы Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ:

Web Storage API

Web Storage API прСдоставляСт интСрфСйсы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ localStorage ΠΈ sessionStorage. Π­Ρ‚ΠΈ интСрфСйсы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Storage, послС Ρ‡Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрировано событиС storage Π²ΠΎ всСх Π²ΠΊΠ»Π°Π΄ΠΊΠ°Ρ…, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠΉ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ вносилось ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события storage ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ, Π½ΠΎ ΠΈ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½.

πŸ‘€ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

Π˜Π½ΠΈΡ†ΠΈΠ°Ρ†ΠΈΡ события storage:

localStorage.setItem("key", "value");

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° события storage:

window.addEventListener("storage", (e) => {
  console.log(e.newValue); // "value"
});

ΠŸΠ»ΡŽΡΡ‹:

  • простой API
  • самая ΡˆΠΈΡ€ΠΎΠΊΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для синхронизации Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° auth tokens
  • ΠΈΠΌΠ΅Π΅Ρ‚ ограничСния ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ
  • Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со слоТной Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ
  • Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ синхронно, поэтому ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ основной UI-ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ‡Π°Π½ΠΊΠΎΠ² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

Shared Worker

Shared Worker β€” это скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ контСксты Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ рСсурса. Π‘ΠΊΡ€ΠΈΠΏΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈ Π½Π΅ влияСт Π½Π° основной ΠΏΠΎΡ‚ΠΎΠΊ выполнСния ΠΊΠΎΠ΄Π° прилоТСния. Shared Worker ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСния ΠΎΡ‚ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эти сообщСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π°ΠΊΠΈΡ… сообщСний.

πŸ‘€ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

Π‘ΠΊΡ€ΠΈΠΏΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ сообщСния ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

// shared-worker.js

self.addEventListener("connect", (e) => {
  e.source.addEventListener("message", (event) => {
    port.postMessage(event.data);
  });

  e.source.start();
});

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ прилоТСния ΠΊ Shared Worker ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅/ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний:

const worker = new SharedWorker("shared-worker.js");

worker.port.addEventListener("message", (e) => {
  console.log(e.data);
});

worker.port.start();

worker.port.postMessage("message");

ΠŸΠ»ΡŽΡΡ‹:

  • Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для нСзависимого выполнСния тяТёлых вычислСний
  • ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ…
  • прСдоставляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ источниками ΠΈ потрСбитСлями сообщСний

ΠœΠΈΠ½ΡƒΡΡ‹:

  • Π½Π΅ самая ΡˆΠΈΡ€ΠΎΠΊΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ
  • высокий ΠΏΠΎΡ€ΠΎΠ³ вхоТдСния для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ простых кСйсов

Broadcast Channel API

Broadcast Channel API β€” это Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹ΠΉ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ прилоТСния. Бинтаксис Broadcast Channel API ΠΎΡ‡Π΅Π½ΡŒ простой ΠΈ позволяСт Π³ΠΈΠ±ΠΊΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ контСкстами, Π° Ρ‚Π°ΠΊΠΆΠ΅ бСзопасСн для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

πŸ‘€ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

Π˜Π½ΠΈΡ†ΠΈΠ°Ρ†ΠΈΡ события ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния:

const bc = new BroadcastChannel("channel");

bc.postMessage("message");

bc.close();

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΊΠ»Π°Π΄ΠΊΠ°Ρ…:

const bc = new BroadcastChannel("channel");

bc.addEventListener("message", (e) => {
  console.log(e.data);
});

bc.close();

ΠŸΠ»ΡŽΡΡ‹:

  • простой API
  • Ρ…ΠΎΡ€ΠΎΡˆΠΎ поддСрТиваСтся Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ Π½Π° сСгодняшний дСнь
  • ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ cross-site-scripting (XSS) Π°Ρ‚Π°ΠΊ

ΠœΠΈΠ½ΡƒΡΡ‹:

  • мСньшС контроля Π½Π°Π΄ источниками ΠΈ получатСлями сообщСний, сообщСния Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ сразу всСм Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌ

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Учитывая простоту, удобство использования ΠΈ ΡˆΠΈΡ€ΠΎΠΊΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ соврСмСнными Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ, Broadcast Channel API Π±ΡƒΠ΄Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ количСствС кСйсов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ рСсурса.

Shared Worker стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΡ‡Π΅Π½ΡŒ слоТных Π·Π°Π΄Π°Ρ‡, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… каТдая Π²ΠΊΠ»Π°Π΄ΠΊΠ° обрабатываСтся ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ источник/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… со своСй ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ. Π’ этом случаС Π²ΠΎΡ€ΠΊΠ΅Ρ€ выступаСт Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ ΠΎΠ±Ρ‰Π΅Π³ΠΎ состояния всСго прилоТСния, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ становятся нСзависимыми потрСбитСлями этого состояния. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… слоТных Π·Π°Π΄Π°Ρ‡ пригодится Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт β€” Service Worker, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ своСго состояния, Π½ΠΎ позволяСт Ρ‚ΠΎΠ½ΠΊΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с внСшними рСсурсами ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ этой Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· встроСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ postMessage.

localStorage (sessionStorage) ΠΈ событиС storage ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для совсСм простых кСйсов ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ‡Π°Π½ΠΊΠΎΠ² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ‡Π°Π½ΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с UI. Web Storage API поддСрТиваСтся Π΄Π°ΠΆΠ΅ IE, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² цСлях поддСрТания кроссбраузСрности вашСго Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π½Π΅ рассматривал Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ window.postMessage, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ‚Π΅ΠΌΠΈ Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ созданы ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ window.open() ΠΈΠ»ΠΈ document.open(), трСбуя указания ссылки Π½Π° созданныС Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ контСксты. Π›ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот способ для общСния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Ρ€Π΅ΠΉΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС ΠΈ ΠΆΠΈΠ²ΡƒΡ‚ Π² Ρ€Π°Π·Π½Ρ‹Ρ… рСсурсах (cross-origin).


Для Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ погруТСния Π² ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡƒΡ€ΠΎΠΊΠΈ ΠΎΡ‚ Tom Gobich с Ρ€Π°Π·Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ способа:


ΠŸΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ вас ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΌΠΎΠΉ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»: https://t.me/alexgriss , Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я ΠΏΠΈΡˆΡƒ ΠΎ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹, дСлюсь своим ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΌΠ½Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ Ρ‚Π΅ΠΌΡ‹, Π²Π°ΠΆΠ½Ρ‹Π΅ для ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.