Table des matières
Créons un système de plugins
Le plus petit système de plugins au monde
Meilleure architecture de plug-in
Que pouvons-nous faire d'autre ?
Votre système de plug-ins
Résumé
Maison interface Web js tutoriel La conception d'un système de plug-in JavaScript est extrêmement importante

La conception d'un système de plug-in JavaScript est extrêmement importante

Sep 02, 2020 pm 05:26 PM
javascript 插件系统

La conception d'un système de plug-in JavaScript est extrêmement importante

[Recommandations d'apprentissage associées : Tutoriel vidéo javascript]

WordPress a des plug-ins, jQuery a des plug-ins, il en va de même pour Gatsby , Eleventy et Vue.

Les plugins sont une fonctionnalité commune des bibliothèques et des frameworks, et pour cause : ils permettent aux développeurs d'ajouter des fonctionnalités de manière sûre et extensible. Cela rend le projet principal plus précieux et crée une communauté, le tout sans ajouter de charge de maintenance supplémentaire. Très bien!

Alors, comment construire un système de plug-ins ? Créons notre propre plugin en JavaScript pour répondre à cette question.

Créons un système de plugins

Commençons par un exemple de projet appelé BetaCalc. BetaCalc se veut une calculatrice JavaScript minimaliste à laquelle d'autres développeurs peuvent ajouter des « boutons ». Voici un code de démarrage de base :

// 计算器const betaCalc = {  currentValue: 0,
  
  setValue(newValue) {    this.currentValue = newValue;    console.log(this.currentValue);
  },
  
  plus(addend) {    this.setValue(this.currentValue + addend);
  },
  
  minus(subtrahend) {    this.setValue(this.currentValue - subtrahend);
  }
};// 使用计算器betaCalc.setValue(3); // => 3betaCalc.plus(3);     // => 6betaCalc.minus(2);    // => 4复制代码
Copier après la connexion

Nous définissons une calculatrice comme une chose objective pour simplifier les choses, une calculatrice fonctionne en console.log imprimant le résultat.

Actuellement, la fonctionnalité est vraiment limitée. Nous avons une méthode setValue qui accepte un numéro et l'affiche sur "l'écran". Nous avons également des méthodes d'addition (plus) et de soustraction (minus), qui effectueront une opération sur la valeur actuellement affichée.

Il est maintenant temps d’ajouter plus de fonctionnalités. Créez d’abord un système de plugins.

Le plus petit système de plugins au monde

Nous commencerons par créer une méthode d'enregistrement (register) que d'autres développeurs peuvent utiliser pour enregistrer des plugins avec BetaCalc. Ce que fait cette méthode est simple : récupérez le plugin externe, récupérez sa fonction exec et attachez-la à notre calculatrice en tant que nouvelle méthode :

// 计算器const betaCalc = {  // ...其他计算器代码在这里

  register(plugin) {    const { name, exec } = plugin;    this[name] = exec;
  }
};复制代码
Copier après la connexion

Voici un exemple de plugin pour notre calculatrice A "square(squared)" est fourni :

// 定义插件const squaredPlugin = {  name: 'squared',  exec: function() {    this.setValue(this.currentValue * this.currentValue)
  }
};// 注册插件betaCalc.register(squaredPlugin);复制代码
Copier après la connexion

Dans de nombreux systèmes de plug-ins, les plug-ins sont généralement divisés en deux parties :

  1. Code à exécuter
  2. Métadonnées (par exemple nom, description, numéro de version, dépendances, etc.)

Dans notre plugin, la fonction exec contient notre code et name est nos métadonnées. Une fois le plugin enregistré, la fonction exec sera attachée directement à notre objet betaCalc en tant que méthode, donnant accès au this de BetaCalc.

Désormais, BetaCalc dispose d'un nouveau bouton "carré" appelable directement :

betaCalc.setValue(3); // => 3betaCalc.plus(2);     // => 5betaCalc.squared();   // => 25betaCalc.squared();   // => 625复制代码
Copier après la connexion

Ce système présente de nombreux avantages. Le plugin est un simple objet littéral qui peut être transmis à nos fonctions. Cela signifie que les plugins peuvent être téléchargés via npm et importés en tant que modules ES6. La facilité de distribution est extrêmement importante !

Mais notre système présente quelques défauts.

En donnant aux plugins this accès à BetaCalc, ils peuvent avoir un accès en lecture/écriture à tout le code de BetaCalc. Bien que cela soit utile pour obtenir et configurer currentValue, cela peut également être dangereux. Si un plugin devait redéfinir des fonctions internes (comme setValue), cela pourrait produire des résultats inattendus pour BetaCalc et d'autres plugins. Cela viole le principe ouvert-fermé, qui stipule qu'une entité logicielle doit être ouverte à l'extension, mais fermée à la modification.

De plus, la fonction « au carré » fonctionne en produisant des effets secondaires. Ce n'est pas rare en JavaScript, mais cela n'est pas agréable, surtout lorsque d'autres plugins peuvent être dans le même état interne. Une approche plus pratique contribuerait grandement à rendre nos systèmes plus sûrs et plus prévisibles.

Meilleure architecture de plug-in

Jetons un coup d'œil à une meilleure architecture de plug-in. L'exemple suivant modifie à la fois la calculatrice et l'API de son plugin :

// 计算器const betaCalc = {  currentValue: 0,
  
  setValue(value) {    this.currentValue = value;    console.log(this.currentValue);
  }, 
  core: {    'plus': (currentVal, addend) => currentVal + addend,    'minus': (currentVal, subtrahend) => currentVal - subtrahend
  },  plugins: {},    

  press(buttonName, newVal) {    const func = this.core[buttonName] || this.plugins[buttonName];    this.setValue(func(this.currentValue, newVal));
  },

  register(plugin) {    const { name, exec } = plugin;    this.plugins[name] = exec;
  }
};  
// 我们得插件,平方插件const squaredPlugin = { 
  name: 'squared',  exec: function(currentValue) {    return currentValue * currentValue;
  }
};

betaCalc.register(squaredPlugin);// 使用计算器betaCalc.setValue(3);      // => 3betaCalc.press('plus', 2); // => 5betaCalc.press('squared'); // => 25betaCalc.press('squared'); // => 625复制代码
Copier après la connexion

Nous avons apporté quelques modifications notables ici.

Tout d'abord, nous séparons le plugin des méthodes de calcul "de base" (telles que plus et moins) en les plaçant dans leur propre objet plugin. Stocker nos plugins dans des objets plugins rend notre système plus sécurisé. Désormais, les plugins accédant à ce plugin ne verront pas l'attribut BetaCalc, mais uniquement l'attribut betaCalc.plugins.

Deuxièmement, nous implémentons une méthode press qui recherche la fonction du bouton par son nom, puis l'appelle. Désormais, lorsque nous appelons la fonction exec du plugin, nous transmettons la valeur actuelle de la calculatrice (currentValue ) à la fonction et nous nous attendons à ce qu'elle renvoie la nouvelle valeur de la calculatrice.

Essentiellement, cette nouvelle press méthode convertit tous les boutons de notre calculatrice en fonctions pures. Ils prennent une valeur, effectuent une opération et renvoient le résultat. Cela présente de nombreux avantages :

  • Cela simplifie l'API.
  • Cela facilite les tests (à la fois pour BetaCalc et pour le plugin lui-même).
  • Cela réduit les dépendances de notre système et le rend plus lâchement couplé.

Cette nouvelle architecture est plus limitée que le premier exemple, mais fonctionne bien. Nous avons essentiellement mis en place des garde-fous pour les auteurs de plugins, les limitant à apporter uniquement les modifications que nous souhaitons qu'ils apportent.

En fait, c'est peut-être trop strict ! Pour le moment, notre plugin de calculatrice ne fonctionne que sur currentValue. Si un auteur de plugin souhaite ajouter des fonctionnalités avancées (telles qu'un bouton « Mémoriser » ou un moyen de suivre l'historique), il ne peut pas faire grand-chose.

Peut-être que c'est bien. Le pouvoir que vous accordez aux auteurs de plugins est un équilibre délicat. Leur donner trop de puissance peut affecter la stabilité de votre projet. Mais si vous leur donnez trop peu de puissance, il leur sera difficile de résoudre leurs propres problèmes, auquel cas autant ne pas se brancher.

Que pouvons-nous faire d'autre ?

Nous avons encore beaucoup de travail à faire pour améliorer notre système.

Nous pouvons ajouter une gestion des erreurs pour avertir l'auteur du plugin s'il oublie de définir un nom ou une valeur de retour. Il est bon de penser comme un développeur QA et d'imaginer comment nos systèmes pourraient tomber en panne afin de pouvoir gérer ces situations de manière proactive.

Nous pouvons étendre les fonctionnalités du plugin. Actuellement, un plugin BetaCalc peut ajouter un bouton. Mais que se passerait-il s’il pouvait également enregistrer des rappels pour certains événements du cycle de vie (comme lorsque la calculatrice est sur le point d’afficher une valeur) ? Ou s'il existait un endroit dédié pour stocker un élément d'état à travers plusieurs interactions ? Cela ouvrira-t-il de nouveaux cas d’utilisation ?

Nous pouvons également étendre la fonction d'enregistrement du plug-in. Et si un plugin pouvait être enregistré avec une configuration initiale ? Est-ce que cela rend le plugin plus flexible ? Que se passerait-il si un auteur de plugin souhaitait enregistrer un ensemble complet de boutons au lieu d'un seul bouton - comme « BetaCalc Stats Package » ? Quels changements doivent être apportés pour soutenir cela ?

Votre système de plug-ins

BetaCalc et son système de plug-ins sont très simples. Si votre projet est plus vaste, vous souhaiterez explorer d'autres architectures de plugins.

Un bon point de départ est d'examiner les projets existants pour trouver des exemples de systèmes de plugins réussis. Pour JavaScript, cela peut signifier jQuery, Gatsby, D3, CKEditor ou autres. Vous souhaiterez peut-être également vous familiariser avec les différents modèles de conception JavaScript, chacun fournissant des interfaces et des degrés de couplage différents, vous offrant ainsi de nombreux bons choix architecturaux de plugins. Comprendre ces options peut vous aider à mieux équilibrer les besoins de toutes les personnes qui utilisent votre projet.

En plus des modèles eux-mêmes, il existe de nombreux bons principes de développement logiciel sur lesquels vous pouvez vous appuyer pour prendre de telles décisions. J'ai déjà mentionné quelques approches (telles que le principe ouvert-fermé et le couplage lâche), mais d'autres approches connexes incluent la loi de Déméter et l'injection de dépendances.

Je sais que cela semble beaucoup, mais vous devez faire vos recherches. Il n'y a rien de plus pénible que de demander à chacun de réécrire son plugin car vous devez changer l'architecture du plugin. C’est un moyen rapide de perdre confiance et de faire perdre confiance aux gens dans leurs contributions futures.

Résumé

Écrire une bonne architecture de plugin à partir de zéro est difficile ! Vous devez équilibrer de nombreuses considérations pour construire un système qui répond aux besoins de chacun. Est-ce assez simple ? La fonction peut-elle être puissante ? Est-ce que ça fonctionnera à long terme ?

Mais ça vaut le coup, avoir un bon système de plug-ins aide tout le monde et les développeurs peuvent résoudre leurs problèmes librement. Il existe un grand nombre de fonctionnalités optionnelles parmi lesquelles les utilisateurs finaux peuvent choisir. Vous pouvez construire un écosystème et une communauté autour de votre projet. C'est une situation gagnant-gagnant.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Comment utiliser insertBefore en javascript Comment utiliser insertBefore en javascript Nov 24, 2023 am 11:56 AM

Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace Dec 17, 2023 am 08:41 AM

JavaScript est un langage de programmation largement utilisé dans le développement Web, tandis que WebSocket est un protocole réseau utilisé pour la communication en temps réel. En combinant les puissantes fonctions des deux, nous pouvons créer un système efficace de traitement d’images en temps réel. Cet article présentera comment implémenter ce système à l'aide de JavaScript et WebSocket, et fournira des exemples de code spécifiques. Tout d’abord, nous devons clarifier les exigences et les objectifs du système de traitement d’images en temps réel. Supposons que nous disposions d'un appareil photo capable de collecter des données d'image en temps réel.

See all articles