Dans cet épisode, nous examinerons l'approche des plugins pour NGV, notre framework Modern 3D Viewer. Cela fait partie de la série NGV.
Une approche consiste à cibler les utilisateurs finaux non-développeurs avec une solution « il suffit de cliquer pour activer ». L'inconvénient est que vous devez écrire et maintenir beaucoup de code et de documentation supplémentaires, ce qui rend le processus à la fois long et rigide.
En conséquence, nous ciblons les développeurs et nous efforçons de leur faciliter la tâche. Il existe en fait beaucoup de technologies autour des plugins et du code réutilisable que nous pouvons exploiter : git, modules ES, docker...
Une autre grande simplification est de ne pas avoir de plugins externes : pour étendre le logiciel, les utilisateurs doivent créer le projet et le construire.
Les plugins sont bons pour les solutions maintenables. Avec les plugins, vous êtes obligé de réfléchir à ce qui est essentiel et à ce qui ne l'est pas ; ce qui devrait être extensible ou remplaçable. Vous devez introduire des abstractions, des interfaces, ce qui rend le code plus isolé et plus facile à comprendre. De plus, vous rédigez de la documentation et des instructions pour aider les personnes extérieures aux développeurs principaux à comprendre vos API : cela rend la tâche vraiment plus facile pour tout le monde.
Un exemple, nous avons créé le plugin ngv-plugin-cesium-widget pour isoler le code Cesium de bas niveau du code des applications. Nous prévoyons d'avoir des dizaines d'applications : avoir du code commun dans un plugin permet de partager du code mais aussi des concepts entre applications. Le plugin est générique et nous exposons des interfaces pour le configurer : le plugin peut gérer n'importe quelle configuration, il est évolutif.
@customElement('ngv-plugin-cesium-widget') export class NgvPluginCesiumWidget extends LitElement { public viewer: CesiumWidget; @property({type: Object}) cesiumContext: IngvCesiumContext; @property({type: Object}) modelCallback: (name: string, model: Model) => void;
Avec un système de plugins, l'utilisateur a le pouvoir d'aller au-delà de la configuration. La solution peut être personnalisée et même étendue.
Par exemple, toutes les applications géospatiales ont une barre de recherche, mais aucune n'a la même : différents backends, différents formats, différentes fonctionnalités.
Un plugin de recherche peut venir avec des fournisseurs prédéfinis (ex : OpenstreetMap Nominatim) et vous permettre de fournir le vôtre (ex : Pelias, Photon, ...).
Ces fournisseurs sont indépendants de cette application et peuvent facilement être partagés ou contribués en amont.
De plus, le plugin de recherche peut être complètement remplacé par une autre implémentation, à condition qu'il obéisse à l'interface sous-jacente.
for (const pc of descr.config.providers) { const initialize = providerInitializers[pc.name]; if (!initialize) { console.error("could not find provider", pc.name, "skipping it"); continue; } const provider = initialize(pc.config); this.providers.push(provider); } this.autocomplete = new Autocomplete(this.autocompleteRef.value, { search: this.search.bind(this), onSubmit: this.onSubmit.bind(this), renderResult: this.renderResult.bind(this), getResultValue: this.getResultValue.bind(this), });
Très proche de l'idée de "plugins" est la notion de "modules". En effet, les modules Ecmascript sont la manière technique dont nous « emballons » et mettons à disposition nos plugins, en interne, dans le framework NGV.
De la même manière, les composants Web sont le standard technique qui nous permet d'exposer les plugins d'interface utilisateur au DOM.
Nous pouvons également considérer git comme l'outil fondamental qui permet notre stratégie de plugin, en permettant aux utilisateurs de créer, de s'adapter, de contribuer.
Notre solution au problème des plugins est une architecture s'appuyant sur des standards, tirant parti du savoir-faire et de l'écosystème des développeurs, elle permet un code plus facile à comprendre, isolé et plus maintenable.
Avez-vous conçu un système de plugins ? Ou avez-vous commencé à y réfléchir ? Faites-moi part de vos commentaires dans les commentaires.
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!