React에서 WebWorker사용하기

Web Worker 를 사용할 때 webworker 파일을 불러오면 된다.
하지만, react가 빌드되면서 webworker의 파일을 불러올 수 없게 된다.
여러가지 방법 중 하나인 방법을 사용해보자.

code to blob

webworker의 코드를 blob으로 변환하여 worker를 생성하여 반환해주는 방법을 사용한다.

export default class WebWorker {
  constructor(worker) {
    const code = worker.toString();
    const blob = new Blob(["(" + code + ")()"]);
    return new Worker(URL.createObjectURL(blob));
  }
}

사용의 편의성을 위해 WebWorker 를 클래스로 만들어 주고 이를 import해서 사용했다.

export default () => {
  onmessage = function (e) {
    this.setInterval(() => {
      getSeatList(e.data).then((res) => {
        res.json().then((data) => {
          this.postMessage(data.data.list);
        });
      });
    }, 1000);
  };
}
import WebWorker from "./WebWorker";
import worker from "./worker";

w = new WebWorker(worker);
w.postMessage(token.current);

w.onmessage = async (e) => {
  console.log(e.data);
}

위와 같이 webworker로 동작하고 싶은 코드를 따로 파일로 만들어 준 뒤 이를 WebWorker 클래스에서 가져와 blob으로 변환해줘서 사용한다.

web-worker

https://www.npmjs.com/package/web-worker
다른 방법으로는 npm 모듈 중 web-worker을 사용할 수 있을 것 같다.
사용해보지는 않았지만, 좋은 대안인 것 같다

references