Récemment, j'ai bricolé des Web Workers et ceci est un guide complet sur tout ce que vous devez savoir pour commencer à utiliser les Web Workers.
Si vous souhaitez ignorer la lecture du blog et extraire le code à la place, voici le référentiel github qui contient tous les extraits.
Référentiel Github Web Worker
Table des matières
- Idées fausses courantes
-
Configuration de base des Web Workers
- Configuration de Web Worker avec JavaScript natif
- Configuration des Web Workers avec Comlink
- Comment vérifier si mon travailleur a été correctement enregistré ?
- Lectures complémentaires
Idées fausses courantes
Donc, ce qui m'a poussé à explorer les Web Workers, c'est que sur une plate-forme sur laquelle je construisais, une tâche lourde en termes de calcul bloquait l'interface utilisateur.
Alors je me suis dit : « Hein, d'accord, comment faire pour que cela ne bloque pas l'interface utilisateur » ? Dois-je utiliser setTimeout pour m'assurer que tout le code du thread principal est terminé, après quoi la tâche lourde en termes de calcul peut s'exécuter ?
Voici donc l'idée fausse : utiliser setTimeout ne signifie pas que l'interface utilisateur ne sera pas bloquée. Oui, tout ce qui se trouve sur le thread principal sera exécuté avant l'exécution du rappel setTimeout. Cependant, ce rappel s'exécute dans le thread principal lui-même lorsqu'il est retiré de la file d'attente des tâches de macro, rendant ainsi l'interface utilisateur insensible.
Pour en savoir plus sur le fonctionnement de setTimeout, voici quelques références —
- JavaScript asynchrone et boucle d'événements à partir de zéro - Akshay Saini
- Boucle d'événements, API Web, file d'attente de tâches - Lydia Hallie
Configuration de base des Web Workers
JavaScript est intrinsèquement un « langage à thread unique », mais les Web Workers nous permettent d'exécuter du code lourd en termes de calcul dans un thread séparé.
Avant de commencer, voici quelques points à noter -
- Les travailleurs Web ne peuvent pas interagir avec le DOM
- La portée du Web Worker est auto, plutôt que fenêtre.
- Les ouvriers sont relativement lourds et ne sont pas destinés à être utilisés en grand nombre. Par exemple, il serait inapproprié de lancer un travailleur pour chaque pixel d'une image de quatre mégapixels. [Réf - Spécification HTML]
- De plus, un travailleur Web ne consiste pas à faire en sorte que quelque chose prenne 2 secondes au lieu de 4 secondes, il s'agit de faire cette chose avec le DOM gelé pendant 0 seconde. [Réf - Les Web Workers sont lents et ce n'est pas grave - Calvin Metcalf]
- Les travailleurs peuvent à leur tour engendrer de nouveaux travailleurs, à condition que ces travailleurs soient hébergés dans la même origine que la page parent. [Réf – MDN]
Web Worker utilisant JavaScript natif
- Créez un nouveau fichier JavaScript contenant le code que vous souhaitez exécuter dans le thread de travail. (disons travailleur.js)
- Dans le script principal, instanciez le travailleur -
const worker = new Worker("./worker.js")
Remarque : worker.js n'est pas un module et ne peut pas utiliser d'instructions d'importation. encore. :')
Pour utiliser worker.js comme module, spécifiez type: module dans l'option du constructeur.
const worker = new Worker("./worker.js")
- Les données sont envoyées entre les travailleurs via un système de messages : les deux parties envoient leurs messages à l'aide de la méthode postMessage() et répondent aux messages via le gestionnaire d'événements onmessage
- Pour transmettre des objets complexes avec des références cycliques dans postMessage(), utilisez la méthode structuréClone.
- Pour mettre fin à un Web Worker, utilisez la méthode de terminaison de l'API Worker. Cela n'offre pas au travailleur la possibilité de terminer ses opérations en cours ; on l'arrête aussitôt.
const worker = new Worker('./worker.js', { type: 'module' })
Rassembler tout cela
Voyons maintenant à quoi ressemble notre code après l'intégration des web Workers.
Code du fil principal :
worker.terminate()
Code du fil de travail :
// ... function workerFunction() { // Don't spin up a new worker instance if the process has already been started. if (statusElement.textContent !== PROCESS_STATUS.PROCESSING && window.Worker) { const worker = new Worker('./worker.js', { type: 'module' }) // Sending 10000000000000 to the web worker worker.postMessage(10000000000000) statusElement.textContent = PROCESS_STATUS.PROCESSING // This piece of code is executed after worker finishes its task and returns data. worker.onmessage = function (event) { statusElement.textContent = event.data } } } // ...
Et le résultat :
Lorsque nous exécutons l'application, vous remarquerez que la tâche lourde en termes de calcul est exécutée sans bloquer l'interface utilisateur.
Configuration de Web Worker avec Comlink
Comlink est une petite bibliothèque (1,1 ko), elle supprime la barrière mentale liée à la réflexion sur la logique post-message.
À un niveau plus abstrait, il s'agit d'une implémentation RPC pour postMessage et ES6 Proxies.
Une raison spécifique pour laquelle j'ai utilisé Comlink était que je n'étais pas en mesure de transmettre des fonctions du thread principal au travailleur en utilisant du JavaScript simple. En utilisant le proxy de Comlink, j'ai pu facilement transmettre une fonction de rappel du thread principal au travailleur. [Référez-vous à cette rubrique]
Pour commencer à utiliser comlink dans votre projet, installez la bibliothèque
const worker = new Worker("./worker.js")
Pour commencer avec cette bibliothèque, nous devons connaître ces méthodes suivantes -
Comlink.wrap(point de terminaison)
- Il enveloppe l'objet exposé du travailleur, renvoyant un proxy avec lequel vous pouvez interagir comme s'il s'agissait d'un objet local.
- Le proxy aura toutes les propriétés et fonctions de la valeur exposée, mais l'accès et les invocations sont intrinsèquement asynchrones. c'est-à-dire que si une fonction renvoie un nombre, elle renverra désormais une promesse pour le nombre.
const worker = new Worker('./worker.js', { type: 'module' })
Comlink.expose(valeur, point final ?, autoriséOrigins ?)
- La fonction exposer expose la valeur d'un thread à l'autre (c'est-à-dire exposer un objet du travailleur au thread principal)
worker.terminate()
Comment vérifier si mon travailleur a été correctement enregistré ?
- Pour vérifier si le fichier du travailleur a été enregistré dans le navigateur Web (j'utilise Chrome)
- Faites un clic droit → Inspecter et accédez au panneau Sources où vous trouverez le fichier du travailleur.
- Une fois terminé, le fichier du travailleur ne doit pas être visible dans le panneau Sources
- Dans le cas où vous pouvez toujours voir le dossier du travailleur après avoir licencié le travailleur, il est probable que vous ayez enregistré plusieurs travailleurs et qu'ils n'aient pas tous été licenciés.
Lectures complémentaires
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Les principales utilisations de JavaScript dans le développement Web incluent l'interaction client, la vérification du formulaire et la communication asynchrone. 1) Mise à jour du contenu dynamique et interaction utilisateur via les opérations DOM; 2) La vérification du client est effectuée avant que l'utilisateur ne soumette les données pour améliorer l'expérience utilisateur; 3) La communication de rafraîchissement avec le serveur est réalisée via la technologie AJAX.

Comprendre le fonctionnement du moteur JavaScript en interne est important pour les développeurs car il aide à écrire du code plus efficace et à comprendre les goulots d'étranglement des performances et les stratégies d'optimisation. 1) Le flux de travail du moteur comprend trois étapes: analyse, compilation et exécution; 2) Pendant le processus d'exécution, le moteur effectuera une optimisation dynamique, comme le cache en ligne et les classes cachées; 3) Les meilleures pratiques comprennent l'évitement des variables globales, l'optimisation des boucles, l'utilisation de const et de locations et d'éviter une utilisation excessive des fermetures.

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

Les applications de JavaScript dans le monde réel incluent la programmation côté serveur, le développement des applications mobiles et le contrôle de l'Internet des objets: 1. La programmation côté serveur est réalisée via Node.js, adaptée au traitement de demande élevé simultané. 2. Le développement d'applications mobiles est effectué par le reactnatif et prend en charge le déploiement multiplateforme. 3. Utilisé pour le contrôle des périphériques IoT via la bibliothèque Johnny-Five, adapté à l'interaction matérielle.

J'ai construit une application SAAS multi-locataire fonctionnelle (une application EdTech) avec votre outil technologique quotidien et vous pouvez faire de même. Premièrement, qu'est-ce qu'une application SaaS multi-locataire? Les applications saas multi-locataires vous permettent de servir plusieurs clients à partir d'un chant


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Version Mac de WebStorm
Outils de développement JavaScript utiles

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

DVWA
Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)