Что такое Web Workers

Как известно JavaScript работает в одном потоке (single thread), что может привести к задержкам в работе всего приложения, если в нем есть тяжелые, требующие большого количества процессорного времени, вычислительные операции.

Web Workers API – это инструмент, который позволяет создавать дополнительный поток для скриптов и выполнять их в фоновом режиме, что позволяет приложению стабильно работать при тяжелых вычислениях.

Web Workers в Angular

Web Workers API не является частью Angular, тем не менее worker-ы можно создавать, добавить и использовать в любом месте приложения. В Angular CLI даже есть специальная команда для генерации воркера.

ng generate web-worker app

Эта команда сделает несколько вещей. Она сгенерирует web worker в корне приложения src/app/app.worker.ts следующего содержания:

addEventListener('message', ({ data }) => {
  const response = `Воркер отвечает на ${data}`;
  postMessage(response);
});

Если команда была выполнена в первый раз, то также добавиться конфигурационный файл tsconfig.worker.json примерно такого содержания:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/worker",
    "lib": [
      "es2018",
      "webworker"
    ],
    "types": []
  },
  "include": [
    "src/**/*.worker.ts"
  ]
}

И обновится файл angular.json.

Последнее, что сделает эта команда, добавит следующий код в файл src/app/app.component.ts

if (typeof Worker !== 'undefined') {
  // Создается новый веб воркер
  const worker = new Worker(new URL('./app.worker', import.meta.url));
  worker.onmessage = ({ data }) => {
    console.log(`Получено сообщение: ${data}`);
  };
  worker.postMessage('hello');
} else {
  // Web worker-ы не поддерживаются в данном окружении.
}

Таким образом команда ng generate web-worker app выполняет всю подготовительную работу, остается добавить только код, отвечающий за вычисления, которые хочется проводить в фоновом режиме.