Comment créer un thread Web Worker en JavaScript?
sobes.tech IA
Réponse de l'IA
Pour créer un Web Worker en JavaScript, on utilise le constructeur Worker, qui prend le chemin vers le script s'exécutant dans un thread séparé.
const worker = new Worker('path/to/worker.js');
Le script du worker (worker.js) s'exécute dans un autre contexte global, qui n'a pas accès au DOM ni à l'objet global window. Pour échanger des données entre le script principal et le worker, on utilise les méthodes postMessage() et le gestionnaire d'événements onmessage.
Dans le script principal :
const worker = new Worker('worker.js');
// Envoyer des données au worker
worker.postMessage({ data: 'Bonjour du thread principal!' });
// Traiter les messages du worker
worker.onmessage = function(event) {
console.log('Reçu du worker:', event.data);
};
// Traiter les erreurs du worker (optionnel)
worker.onerror = function(error) {
console.error('Erreur dans le worker:', error);
};
// Terminer le worker
// worker.terminate();
Dans le script du worker (worker.js) :
// Traiter les messages du thread principal
self.onmessage = function(event) {
console.log('Reçu dans le worker:', event.data);
// Effectuer une opération longue (exemple !)
let result = 0;
for (let i = 0; i < 1000000000; i++) {
result += i;
}
// Envoyer le résultat en retour au thread principal
self.postMessage({ result: result, originalData: event.data });
};
// Traiter les erreurs dans le worker (optionnel)
self.onerror = function(error) {
console.error('Erreur dans le worker:', error);
};
// Le worker peut importer d'autres scripts
// importScripts('utils.js', 'helper.js');
Les Web Workers permettent de décharger des calculs intensifs dans un thread séparé, évitant de bloquer le thread principal de l'interface utilisateur et améliorant la réactivité de l'application. Il faut prendre en compte les limitations : les workers n'ont pas accès direct au DOM, window, document, localStorage ni sessionStorage. La communication des données se fait par copie de valeurs ou en utilisant des objets Transferable pour améliorer la performance lors du transfert de gros volumes de données.