Open PortfolioOpen Portfolio.
โ† Back to Blog

Minimizing Main Thread Work

March 30, 2026at 2:01 PM UTCBy Pocket Portfolio TeamPerformance Optimization
Minimizing Main Thread Work
#performance#main thread#optimization

Problem

In web development, the main thread is responsible for handling user interactions, painting, and running JavaScript. When the main thread is overloaded, it can lead to a sluggish user experience, with delayed responses to user inputs and janky animations. To ensure a smooth, responsive application, it is crucial to minimize main thread work.

Solution with Code

To reduce the workload on the main thread, we can employ techniques such as offloading tasks to web workers, using requestAnimationFrame for animations, and optimizing JavaScript execution. Below is a step-by-step guide with sample code.

Use Web Workers

Web Workers allow you to run scripts in background threads, separate from the main thread, preventing heavy computations from blocking user interactions.

Main Thread Code:

if (window.Worker) {
  const worker = new Worker('worker.js');
  worker.postMessage('Start computation');

  worker.onmessage = function(event) {
    console.log('Result from worker:', event.data);
  };
}

worker.js:

self.onmessage = function(event) {
  if (event.data === 'Start computation') {
    const result = heavyComputation();
    self.postMessage(result);
  }
};

function heavyComputation() {
  // Perform intensive task
  let sum = 0;
  for (let i = 0; i < 1e6; i++) {
    sum += i;
  }
  return sum;
}

Use requestAnimationFrame

For animations, requestAnimationFrame should be used instead of setTimeout or setInterval, as it synchronizes with the screen refresh rate and optimizes rendering performance.

function animate() {
  // Animation logic here
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate);

Optimize JavaScript Execution

Avoid long-running JavaScript tasks by splitting them into smaller, asynchronous tasks using setTimeout or requestIdleCallback.

function processChunk(items) {
  if (items.length === 0) return;

  const chunk = items.splice(0, 100); // Process in chunks of 100
  chunk.forEach(item => {
    // Process each item
  });

  setTimeout(() => processChunk(items), 0); // Defer the next chunk
}

processChunk(largeDataArray);

Key Concepts

  • Main Thread: The main execution environment for user interactions and rendering.
  • Web Workers: Allows running scripts in background threads.
  • requestAnimationFrame: Synchronizes animations with the display refresh rate.
  • Chunking: Breaking tasks into smaller parts to avoid blocking the main thread.

By adopting these techniques, developers can significantly improve application responsiveness by ensuring the main thread remains unblocked and efficient. This ultimately leads to a smoother, more engaging user experience.

Minimizing Main Thread Work | Open Portfolio Blog | Open Portfolio