DEV Community

Rahul Vijayvergiya
Rahul Vijayvergiya

Posted on • Originally published at rahulvijayvergiya.hashnode.dev on

How Web Workers Supercharge Web Application

This post was initially published on my blog. Check out the original source using the link below:

How Web Workers Supercharge Web Application

Workers is a powerful feature in JavaScript which allow background processing and giving us option to run scripts concurrently with the main thread.

favicon rahulvijayvergiya.hashnode.dev

In today's web development, performance is a critical when a application run on various devices like mobile phones, laptops, tablets, and iPads, each with different memory capabilities. As applications grows, handling multiple tasks concurrently without blocking the main thread becomes important. Web Workers is a powerful feature in JavaScript which allow background processing and giving us option to run scripts concurrently with the main thread.

What are Web Workers?

Web Workers are a standard feature of JavaScript that allow us to run scripts in the background which are independent of the main thread. Which means that tasks that takes a long time to execute can be offloaded to a worker, giving space for the main thread to handle user interactions, rendering, and other critical tasks of web application.

Why Web Workers?

JavaScript is single-threaded, which means it can only do one thing at a time. If we have a long-running task, like processing a large dataset or rendering a complex graphic then it can block the main thread, as a result UI can lag or freeze.

Types of Web Workers

  • Dedicated Workers: Operate in a single context and communicate with the main thread via messages.

  • Shared Workers: Can be accessed by multiple scripts, even across different windows, tabs, or iframes.

  • Service Workers: Act as a proxy between your web application and the network, managing push notifications, background sync, and caching resources.

How Web Workers Work?

Web Workers create a separate JavaScript file that the worker will execute. The main script and the worker script communicate using the postMessage() and onmessage methods. The worker runs in isolation, without access to the DOM or global variables from the main thread, ensuring safe, concurrent execution.

Here’s a simple example of creating a Web Worker:

// main.js
const worker = new Worker('worker.js');

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

worker.postMessage('Hello Worker!');
Enter fullscreen mode Exit fullscreen mode
// worker.js
onmessage = function(event) {
  console.log('Message from main thread:', event.data);
  postMessage('Hello from Worker!');
};
Enter fullscreen mode Exit fullscreen mode

Some Real-World Use Cases of Web Workers

1. Process large CSV files

Imagine we’re building a web application that allows users to upload and process large CSV files. This app parses the CSV, performs data analysis, and then displays the results. Without Web Workers, this processing would block the main thread.

Here’s how we can use Web Workers to handle this:

  1. Setting Up the Web Worker

First, we’ll create a separate JavaScript file, say worker.js, which will handle the data processing.

// worker.js
self.onmessage = function(e) {
    const csvData = e.data;
    const result = processData(csvData); // Assume processData is a function that handles your data
    self.postMessage(result);
};

function processData(data) {
    // complex data processing logic here
    return processedData;
}
Enter fullscreen mode Exit fullscreen mode
  1. Using the Web Worker in Main Thread

Next, in your main JavaScript file, we’ll create a new worker instance and post the CSV data to it.

// main.js
const worker = new Worker('worker.js');

worker.onmessage = function(e) {
    const processedData = e.data;
    displayResults(processedData); // Function to update the UI with the processed data
};

function handleFileUpload(file) {
    const reader = new FileReader();
    reader.onload = function() {
        const csvData = reader.result;
        worker.postMessage(csvData); // Send data to the worker
    };
    reader.readAsText(file);
}
Enter fullscreen mode Exit fullscreen mode

In this example, main thread reads the uploaded file and sends data to the Web Worker. Web Worker processes this data in the background and sends the results back once it’s done. Meanwhile, the main thread remains free to do other task in the UI, show progress indicators, or respond to other user input.

2. Image Processing

Image processing is CPU-intensive tasks that can significantly impact performance of application, if its done on the main thread. Web Workers can handle tasks like resizing, filtering, or converting images in the background.

// imageWorker.js
onmessage = function(event) {
  const imageData = event.data;
  // Perform heavy image processing
  const processedImage = applyFilter(imageData);
  postMessage(processedImage);
};

// main.js
const imageWorker = new Worker('imageWorker.js');
imageWorker.postMessage(imageData);

imageWorker.onmessage = function(event) {
  displayImage(event.data);
};
Enter fullscreen mode Exit fullscreen mode

3. Data Processing and Parsing

if we need to deal with large dataset, such as parsing JSON files or processing large arrays then we can offload this to web workers. This is particularly useful in data-intensive applications like analytics dashboards or real-time monitoring systems.

// dataWorker.js
onmessage = function(event) {
  const largeDataset = event.data;
  const processedData = processData(largeDataset);
  postMessage(processedData);
};
Enter fullscreen mode Exit fullscreen mode
// main.js
const dataWorker = new Worker('dataWorker.js');
dataWorker.postMessage(largeDataset);

dataWorker.onmessage = function(event) {
  sendUpdatedDataToUI(event.data);
};
Enter fullscreen mode Exit fullscreen mode

4. Complex Mathematical Calculations

if our application need complex mathematical operations, such as simulations, cryptography, or machine learning tasks then this can also be offloaded to web workers

// mathWorker.js
onmessage = function(event) {
  const result = performComplexCalculation(event.data);
  postMessage(result);
};
Enter fullscreen mode Exit fullscreen mode
javascriptCopy code// main.js
const mathWorker = new Worker('mathWorker.js');
mathWorker.postMessage(inputData);

mathWorker.onmessage = function(event) {
  displayCalculationResult(event.data);
};
Enter fullscreen mode Exit fullscreen mode

Limitations of Web Workers

Web Workers come with certain limitations:

  • No DOM Access: Web Workers cannot manipulate the DOM directly, so any UI updates need to be communicated back to the main thread.

  • Limited API Access: Not all JavaScript APIs are available in Web Workers. For eg., you cannot use localStorage or directly make XMLHttpRequests in older browsers.

Conclusion

Web Workers are a powerful tool in the a web developer’s toolkit, enabling him to build responsive, user-friendly applications. By offloading resource heavy (resource Hungary actually :) ) task to background threads, developer can keep his main thread free to handle user interactions and UI updates.

References

Top comments (0)