"매 main thread off-load — UI freeze 의 X". Web Worker 매 separate OS thread 의 JS 실행 — postMessage 의 message-passing, structuredClone 의 transfer. 2026 modern stack 매 OffscreenCanvas + SharedArrayBuffer + Comlink 의 ergonomic wrapper.
매 핵심
매 Worker 종류
Dedicated Worker: 1:1 owner — single page 의 사용.
Shared Worker: N:1 — 같은 origin 의 multiple tabs share.
Service Worker: network proxy — offline / push.
Worklet: paint / audio / animation — 매 lightweight, low-latency.
constbuf=newArrayBuffer(64*1024*1024);// 64MB
worker.postMessage({buf},[buf]);// ownership transferred — main thread 의 buf 매 detached
Comlink 매 RPC ergonomics
// worker.js
import*asComlinkfrom'comlink';classEngine{asyncheavy(x){/* ... */returnx*2;}}Comlink.expose(newEngine());// main.js
import*asComlinkfrom'comlink';constEngine=Comlink.wrap(newWorker('./worker.js',{type:'module'}));constengine=awaitnewEngine();constresult=awaitengine.heavy(42);// 매 promise-based RPC
OffscreenCanvas 매 worker rendering
// main.js
constcanvas=document.querySelector('canvas');constoffscreen=canvas.transferControlToOffscreen();worker.postMessage({canvas:offscreen},[offscreen]);// worker.js
self.onmessage=(e)=>{constctx=e.data.canvas.getContext('webgl2');// 매 worker thread 의 render loop — 매 main thread 의 jank 의 X
functionframe(){/* draw */requestAnimationFrame(frame);}frame();};
SharedArrayBuffer + Atomics
constsab=newSharedArrayBuffer(1024);constview=newInt32Array(sab);worker.postMessage({sab});// worker — 매 atomic increment
Atomics.add(view,0,1);Atomics.notify(view,0);// wake waiters
// main — 매 wait
Atomics.wait(view,0,0);// block until value != 0
constw=newWorker(newURL('./w.js',import.meta.url),{type:'module'});// w.js — 매 ESM import 의 가능
import{decode}from'./codec.js';self.onmessage=async(e)=>self.postMessage(decode(e.data));
언제: main-thread blocking >16ms 의 task / GPU rendering off-main / parallel CPU work.
언제 X: trivial computation (<1ms) — 매 postMessage overhead 의 net loss / DOM access 필요 (worker 의 DOM X).
❌ 안티패턴
Sync XHR in main: 매 worker 의 reason — main thread 의 block 의 X.
Large object clone: structuredClone 매 deep copy — Transferable 의 사용.
Worker per task: spawn cost ~5-50ms — pool 의 reuse.
No COOP/COEP: SharedArrayBuffer 매 cross-origin isolation 필수.
🧪 검증 / 중복
Verified (HTML Living Standard / MDN Web Workers API).
신뢰도 A.
🕓 Changelog
날짜
변경
2026-05-08
Phase 1
2026-05-10
Manual cleanup — Worker types, Transferable, OffscreenCanvas, Comlink, SAB patterns