기록을 불러오는 중입니다...
// 바닐라 환경
const myWorker = new Worker("worker.js");
// 번들러 환경
const myWorker = new Worker(new URL('worker.js', import.meta.url));// 메인 스레드
myWorker.postMessage("Hello, World!");e.data 를 이용해 메세지를 받을 수 있습니다.// 워커
onmessage = e => console.debug(`Message from main thread: ${e.data}`);// 메인 스레드
myWorker.terminate();// calculate.js
function add(a, b) {
return a + b;
}
console.debug(`3 + 4 is ${add(3, 4)}`);// 메인 스레드
const myWorker = new Worker('calculate.js');calculate.js 스크립트를 실행합니다.// worker.js
importScripts("calculate.js");// 메인 스레드
const myWorker = new Worker('worker.js');port 를 통해 통신을 하는 것이 특징입니다.// 메인 스레드
const myWorker = new SharedWorker('worker.js');
myWorker.port.onmessage = e => console.log(`Message received from worker: ${e.data}`);
myWorker.port.start();
<input type="text" onChange={e => myWorker.port.postMessage(e.target.value)} />// worker.js
onconnect = e => {
const port = e.ports[0];
port.addEventListener('message', e => {
const workerResult = `Result: ${e.data}`;
port.postMessage(workerResult);
});
// addEventListener 를 사용하기 위해서는 다음 코드가 필수입니다.
// 아니라면, onmessage 메소드에서 암시적으로 호출합니다.
port.start();
};onconnnect 이벤트를 이용하며, e.ports 를 통해 (공유 워커의 포트에) 큐잉된 메세지들을 메인 스레드의 포트에 전송합니다.eval 을 활용할 수도 있는게 재밌더라구요.// 메인 스레드에서 즉시실행 함수 표현식을 문자열로 보냅니다.
myWorker.postMessage(`(() => 'im stringfied function!')()`);
// 웹 워커에서 해당 문자열을 받아 eval 로 실행합니다.
onmessage = e => {
const workerResult = `Result: ${eval(e.data)}`;
};eval 은 엄청 위험한 녀석이니 조심해서 사용해야 합니다. 심지어 웹 워커는 자신만의 실행 컨텍스트를 가지므로, 워커 호출자(메인 스레드)의 Content Security Policy 도 적용받지 않으니 더욱 조심해야 합니다.