Previous chapter: Chapter 24: Introduction to Node.js and the Backend
This final chapter explores specialized browser APIs designed for high-performance and complex data management, offering solutions to challenges that cannot be solved with standard DOM or Local Storage APIs.
1. Web Workers (Threading for Performance)
JavaScript is single-threaded, meaning all operations run on the main thread, including UI updates and DOM manipulation. If a long-running calculation occurs, the main thread freezes, leading to a blocked, non-responsive UI.
Web Workers solve this by allowing you to run a script in a background thread, separate from the main thread.
Key Features
Worker Implementation (main.js)
const worker = new Worker('worker.js');
// Send data to the worker
worker.postMessage(1000000); // Start a large calculation
// Listen for the result from the worker
worker.onmessage = (e) => {
const result = e.data;
document.getElementById('output').textContent = `Factorial result: ${result}`;
console.log('Long task finished on background thread.');
};
// The UI remains responsive while the task runs!
Worker Implementation (worker.js)
// This file runs in the background thread
function calculateFactorial(n) {
// ... long, blocking calculation ...
return result;
}
// Listen for messages from the main script
onmessage = (e) => {
const number = e.data;
const result = calculateFactorial(number);
// Send the result back to the main script
postMessage(result);
};
2. IndexedDB (Client-Side Database)
Local Storage (Chapter 17) is limited to simple string key-value pairs and has a small size limit (5-10MB). For complex, structured, and large amounts of client-side data, IndexedDB is the solution. It's a low-level, transactional API for creating and managing a non-relational (NoSQL) database in the user's browser.
Key IndexedDB Concepts
Asynchronous: All operations are asynchronous and event-driven, often involving Promises.
Object Stores: IndexedDB stores data in "object stores" (similar to tables in SQL or collections in NoSQL).
Transactions: Operations must be performed inside a transaction to ensure data integrity.
Basic Workflow
Open the Database: Request an asynchronous connection to the database, specifying the version.
Handle Upgrades: If the version changes, the onupgradeneeded event fires, allowing you to create new object stores or indexes.
Start a Transaction: Begin a read or read/write transaction on the required object store.
Perform Request: Use the transaction to make a request (e.g., add, get, put).
Handle Result: Use the request's onsuccess or onerror events (or Promises) to handle the outcome.
IndexedDB is significantly more complex than Local Storage but provides the necessary power for building robust offline-first applications and handling large client-side data caches.