Коротка відповідь
middleTransferable‑об’єкти – це об’єкти, які можна передавати між воркерами або процесами без копіювання даних. При передачі їх внутрішній пам’ять переміщується, а сам об’єкт стає недоступним у вихідному контексті. Це забезпечує значне зменшення накладних витрат при обробці великих масивів чи буферів.
Повне пояснення
Що це і навіщо
- Transferable‑об’єкти (наприклад, ArrayBuffer, MessagePort) дозволяють передавати дані між воркерами або процесами без копіювання.
- Це критично важливо для продуктивності, коли обробляються великі масиви або медіа‑дані.
Ключові принципи
- Після передачі об’єкт стає «заблокованим» у вихідному контексті – його можна лише читати, але не змінювати.
- Переноситься власність пам’яті; інший контекст отримує новий посилання на ту саму область.
Як це працює
- Відправник викликає
postMessage(message, [transfer]), деtransfer– масив об’єктів. - Відправник і отримувач отримують посилання на одну й ту ж пам’ять; копіювання не відбувається.
Практика і реалізація
// main.js
const worker = new Worker('worker.js');
const buffer = new ArrayBuffer(1024);
worker.postMessage({buffer}, [buffer]); // передаємо без копіювання
// worker.js
onmessage = e => {
const {buffer} = e.data;
// buffer вже недоступний у main.js
};
Тестування
- У Jest можна перевірити, що об’єкт став недоступним після передачі, використовуючи
expect(() => buffer.byteLength).toThrow().
Безпека
- Перенесені об’єкти не можуть бути змінені у вихідному контексті, що зменшує ризик непередбачуваних побічних ефектів.
Переваги
- Зменшення використання пам’яті.
- Підвищена швидкість передачі великих даних.
Обмеження
- Підтримуються лише об’єкти, що реалізують інтерфейс
Transferable(ArrayBuffer, MessagePort тощо). - Після передачі об’єкт не можна використовувати у вихідному контексті.
Часті помилки
- Переведення не‑Transferable об’єктів (наприклад,
Uint8Array) викликає помилку. - Забудова передачі в масиві
transferпризводить до копіювання.
Висновок Transferable‑об’єкти – це механізм, що дозволяє ефективно обмінюватися великими даними між контекстами без копіювання, що критично важливо для продуктивності веб‑програми.