Web workers let your app do heavy work without freezing the screen. They run tasks in the background so users can keep clicking and typing smoothly.
Web workers for heavy computation in Angular
Start learning this pattern below
Jump into concepts and practice - no test required
ng generate web-worker worker-name // In your component or service: const worker = new Worker(new URL('./worker-name.worker.ts', import.meta.url)); worker.postMessage(data); worker.onmessage = ({ data }) => { console.log('Result from worker:', data); };
Use Angular CLI to generate a web worker file with ng generate web-worker.
Web workers communicate with the main app using postMessage and onmessage.
heavyCalc.worker.ts.ng generate web-worker heavyCalc
const worker = new Worker(new URL('./heavyCalc.worker.ts', import.meta.url)); worker.postMessage(1000000); worker.onmessage = ({ data }) => { console.log('Sum is', data); };
// heavyCalc.worker.ts addEventListener('message', ({ data }) => { let sum = 0; for(let i = 0; i <= data; i++) { sum += i; } postMessage(sum); });
This Angular component uses a web worker to calculate the sum of numbers from 0 to 1,000,000. When you click the button, the calculation runs in the background. The UI stays responsive, and the result shows when ready.
import { Component } from '@angular/core'; @Component({ selector: 'app-root', template: ` <h1>Sum Calculator with Web Worker</h1> <button (click)="startCalculation()">Calculate Sum</button> <p *ngIf="result !== null">Result: {{ result }}</p> ` }) export class AppComponent { result: number | null = null; worker: Worker | undefined; constructor() { if (typeof Worker !== 'undefined') { this.worker = new Worker(new URL('./sum.worker.ts', import.meta.url)); this.worker.onmessage = ({ data }) => { this.result = data; }; } } startCalculation() { this.result = null; this.worker?.postMessage(1000000); } } // sum.worker.ts addEventListener('message', ({ data }) => { let sum = 0; for (let i = 0; i <= data; i++) { sum += i; } postMessage(sum); });
Web workers cannot access the DOM directly. They only communicate via messages.
Always check if Worker is supported in the browser before creating one.
Keep the worker code simple and focused on heavy tasks to get the best performance.
Web workers run heavy tasks in the background to keep the app smooth.
Use Angular CLI to create workers easily and communicate with them using messages.
They help improve user experience by preventing UI freezes during big computations.
Practice
Web Workers in an Angular application?Solution
Step 1: Understand what Web Workers do
Web Workers allow running scripts in background threads separate from the main UI thread.Step 2: Identify the benefit in Angular apps
This prevents the UI from freezing during heavy computations, improving user experience.Final Answer:
To run heavy computations in the background without freezing the UI -> Option BQuick Check:
Web Workers = background heavy tasks [OK]
- Thinking Web Workers handle UI styling
- Confusing Web Workers with HTTP request handlers
- Assuming Web Workers manage routing
compute?Solution
Step 1: Recall Angular CLI syntax for generating workers
The correct command to generate a worker isng generate worker <name>.Step 2: Match the command with the options
Only ng generate worker compute uses the correct syntax:ng generate worker compute.Final Answer:
ng generate worker compute -> Option DQuick Check:
Generate worker = ng generate worker [OK]
- Using 'ng create' instead of 'ng generate'
- Confusing 'ng add' with worker creation
- Trying 'ng new' which creates projects, not workers
const worker = new Worker(new URL('./compute.worker', import.meta.url));
worker.onmessage = ({ data }) => console.log('Result:', data);
worker.postMessage(10);Assuming the worker script doubles the input number and sends it back.
Solution
Step 1: Understand the message flow
The main thread sends 10 to the worker usingpostMessage(10).Step 2: Worker doubles the input and sends back
The worker processes 10, doubles it to 20, and sends it back viapostMessage.Step 3: Main thread logs the received data
Theonmessagehandler logs 'Result: 20'.Final Answer:
Result: 20 -> Option CQuick Check:
Input 10 doubled = 20 [OK]
- Assuming worker returns input unchanged
- Expecting undefined because of async timing
- Thinking worker script is missing causing error
const worker = new Worker('./compute.worker');
worker.onmessage = (event) => console.log(event.data);
worker.postMessage(5);Solution
Step 1: Check how the Worker is created
In Angular, the worker URL must usenew URL('./compute.worker', import.meta.url)for correct bundling.Step 2: Identify the missing part
The code uses a plain string './compute.worker' which causes a runtime error because the path is unresolved.Final Answer:
Missing import.meta.url in Worker URL -> Option AQuick Check:
Worker URL needs import.meta.url [OK]
- Calling postMessage before setting onmessage
- Using absolute URL instead of relative with import.meta.url
- Making onmessage async unnecessarily
1. Create a worker with Angular CLI.
2. Send the large array to the worker usingpostMessage.
3. In the worker, process the array and send back the result.
4. Update the UI with the result when received.
What is the best practice to handle the large data transfer efficiently?
Solution
Step 1: Understand data transfer in Web Workers
Sending large data copies it by default, which can be slow and freeze UI.Step 2: Use Transferable Objects to optimize
Transferable Objects like ArrayBuffer transfer ownership without copying, making communication efficient.Step 3: Compare options
Sending JSON strings adds parsing overhead, splitting chunks adds complexity, and processing on main thread blocks UI.Final Answer:
Use Transferable Objects like ArrayBuffer to avoid copying data -> Option AQuick Check:
Transferable Objects = efficient large data transfer [OK]
- Sending large data as JSON causing slow parsing
- Splitting data unnecessarily increasing complexity
- Processing heavy tasks on main thread causing freezes
