Mise à jour du 24/5/2018 : Nous en sommes maintenant à +3 versions d'Angular depuis mon message initial et nous n'avons toujours pas de solution finale viable. Lars Meijdam (@LarsMeijdam) a proposé une approche intéressante qui vaut certainement le coup d'œil. (Pour des raisons de propriété, il a dû retirer temporairement le dépôt GitHub où il avait initialement publié son échantillon. Toutefois, vous pouvez lui envoyer un message directement si vous souhaitez en obtenir une copie. Veuillez consulter les commentaires ci-dessous pour plus d'informations).
Les récentes modifications de l'architecture d'Angular 6 nous rapprochent d'une solution. De plus, les éléments Angular ( https://angular.io/guide/elements ) fournit certaines fonctionnalités des composants - mais pas tout à fait ce que j'ai décrit à l'origine dans cet article.
Si quelqu'un de la formidable équipe Angular tombe sur ce sujet, veuillez noter que de nombreuses autres personnes semblent également très intéressées par cette fonctionnalité. Elle pourrait bien être prise en compte dans le backlog.
J'aimerais mettre en œuvre un cadre de travail enfichable (plug-in) dans un système de gestion de l'information. Angular 2
, Angular 4
, Angular 5
ou Angular 6
application.
(Mon cas d'utilisation spécifique pour le développement de ce cadre enfichable est que je dois développer un système de gestion de contenu miniature. Pour un certain nombre de raisons qui ne sont pas nécessairement développées ici, Angular 2/4/5/6
répond presque parfaitement à la plupart des besoins de ce système).
Par cadre enfichable (ou architecture enfichable), j'entends spécifiquement un système qui permet à des développeurs tiers de créer ou d'étendre la fonctionnalité d'une application principale grâce à l'utilisation de composants enfichables. sans avoir un accès direct au code source ou au fonctionnement interne de l'application primaire, ni en avoir connaissance .
(Cette phrase sur " sans avoir un accès direct ou une connaissance du code source ou du fonctionnement interne de l'application " est un objectif essentiel).
Parmi les exemples de cadres enfichables, citons les systèmes de gestion de contenu courants tels que WordPress
o Drupal
.
L'idéal (comme avec Drupal) serait de pouvoir simplement placer ces composants enfichables (ou plug-ins) dans un dossier, que l'application les détecte ou les découvre automatiquement et qu'ils fonctionnent comme par magie. L'idéal serait que cela puisse se faire à chaud, c'est-à-dire pendant l'exécution de l'application.
J'essaie actuellement de déterminer les réponses ( avec votre aide ) aux cinq questions suivantes.
-
L'aspect pratique : est un cadre de plugin pour un
Angular 2/4/5/6
même pratique ? (Jusqu'à présent, je n'ai pas trouvé de moyen pratique de créer un cadre réellement enfichable avecAngular2/4/5/6
.) -
Défis attendus : Quels défis pourrait-on rencontrer dans la mise en œuvre d'un cadre de plugin pour un
Angular 2/4/5/6
application ? -
Stratégies de mise en œuvre : Quelles techniques ou stratégies spécifiques pourraient être employées pour mettre en œuvre un cadre de plugin pour une
Angular 2/4/5/6
application ? -
Meilleures pratiques : Quelles sont les meilleures pratiques pour la mise en œuvre d'un système de plugin pour un
Angular 2/4/5/6
application ? -
Technologies alternatives : Si un cadre pour les plugins est pas pratique dans un
Angular 2/4/5/6
application, ce qui relativement équivalent les technologies (par exempleReact
) pourrait convenir à un application Web moderne et hautement réactive ?
En général, l'utilisation de Angular 2/4/5/6
est très souhaitable car :
- il est naturellement extrêmement rapide, à un rythme effréné.
- il consomme très peu de bande passante (après le chargement initial)
- il a un encombrement relativement faible (après
AOT
ytree shaking
)--et cette empreinte continue de se réduire - il est hautement fonctionnel, et l'équipe et la communauté Angular poursuivent la croissance rapide de son écosystème
- il s'adapte parfaitement à un grand nombre des meilleures et des plus récentes technologies Web, telles que
TypeScript
yObservables
- Angular 5 prend désormais en charge les travailleurs de service ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- étant soutenu par
Google
il est probable qu'il sera soutenu et amélioré à l'avenir.
J'aimerais beaucoup utiliser Angular 2/4/5/6
pour mon projet actuel. Si je suis en mesure d'utiliser Angular 2/4/5/6
J'utiliserai également Angular-CLI
et probablement Angular Universal
(pour le rendu côté serveur).
Voici mes réflexions, jusqu'à présent, concernant les questions ci-dessus. Nous vous invitons à consulter ce site et à nous faire part de vos commentaires et de vos idées.
-
Angular 2/4/5/6
Les applications consomment des paquets - mais ce n'est pas nécessairement la même chose que d'autoriser les plugins dans une application. Un plugin dans d'autres systèmes (par ex.Drupal
) peuvent être ajoutés essentiellement en déposant le dossier du plugin dans un répertoire commun de modules où il est automatiquement "récupéré" par le système. DansAngular 2/4/5/6
un paquet (comme peut l'être un plugin) est généralement installé par l'intermédiaire denpm
ajouté à lapackage.json
et ensuite importé manuellement dans l'application - comme dansapp.module
. C'est beaucoup plus compliqué que leDrupal
méthode permettant de déposer un dossier et de faire en sorte que le système détecte automatiquement le paquet. Plus l'installation d'un plugin est compliquée, moins les gens seront enclins à l'utiliser. Ce serait bien mieux s'il y avait un moyen deAngular 2/4/5/6
pour détecter et installer automatiquement les plugins. Je suis très intéressé de trouver une méthode qui permette aux non-développeurs d'installer lesAngular 2/4/5/6
et installer les plugins choisis sans avoir à comprendre toute l'architecture de l'application. -
En général, l'un des avantages d'une architecture enfichable est qu'il est très facile pour les développeurs tiers d'étendre la fonctionnalité du système. Évidemment, ces développeurs ne connaissent pas toutes les subtilités du code de l'application à laquelle ils se connectent. Une fois les plugins développés, d'autres utilisateurs encore moins techniques peuvent simplement installer l'application et les plugins sélectionnés. Cependant,
Angular 2/4/5/6
est relativement compliqué et sa courbe d'apprentissage est très longue. Pour compliquer encore les choses, la plupart des productionsAngular 2/4/5/6
Les applications utilisent égalementAngular-CLI
,Angular Universal
yWebPack
. Une personne qui implémente un plugin devra probablement avoir au moins une connaissance de base de la façon dont tous ces éléments s'assemblent, ainsi qu'une solide connaissance pratique de la technologie de l'information.TypeScript
et une familiarité raisonnable avecNodeJS
. Les exigences en matière de connaissances sont-elles si extrêmes qu'aucune tierce partie ne voudrait jamais développer un plugin ? -
La plupart des plugins auront probablement un composant côté serveur (par exemple, pour stocker/récupérer les données relatives au plugin) ainsi qu'une sortie côté client.
Angular 2/4/5
déconseille expressément (et fortement) aux développeurs d'injecter leurs propres modèles au moment de l'exécution, car cela présente un risque sérieux pour la sécurité. Afin de gérer de nombreux types de sortie qu'un plugin peut accueillir (par exemple, l'affichage d'un graphique), il semble que permettre aux utilisateurs de créer du contenu qui est injecté dans le flux de réponse, sous une autre forme, est probablement nécessaire. Je me demande comment il serait possible de répondre à ce besoin sans déchirer figurativementAngular 2/4/5/6
Les mécanismes de sécurité de l'UE. -
La plupart des productions
Angular 2/4/5/6
sont précompilées en utilisantAhead of Time
(AOT
) compilation. (Je ne suis pas certain de la manière dont les plugins peuvent être ajoutés (ou intégrés) aux applications précompilées. Le meilleur scénario serait de compiler les plugins séparément de l'application principale. Cependant, je ne sais pas comment faire pour que cela fonctionne. Une solution de rechange pourrait être de recompiler l'application entière avec tous les plugins inclus, mais cela complique un peu les choses pour un utilisateur administratif qui veut simplement installer l'application (sur son propre serveur) avec les plugins sélectionnés. -
Dans un
Angular 2/4/5/6
Dans une application, surtout si elle est précompilée, un seul morceau de code errant ou conflictuel peut briser l'ensemble de l'application.Angular 2/4/5/6
ne sont pas toujours les plus faciles à déboguer. L'utilisation de plugins mal conçus peut entraîner des expériences très désagréables. Je n'ai actuellement pas connaissance d'un mécanisme permettant de gérer de manière élégante les plugins qui se comportent mal.
1 votes
A mon avis, un module angulaire 2 est un plugin. @angular/router, @angular/forms, @angular/http, @angular/material, ce sont des 'plugins' d'angular, nous pouvons vérifier comment ils font des 'plugins'.
9 votes
@Timathon, malheureusement, ce ne sont pas les mêmes. Les systèmes de plugins permettent d'étendre une application sans modifier le code de l'application de base. L'utilisation de @angular/router, @angular/forms, etc. nécessite que l'utilisateur modifie l'application. Il s'agit en fait de bibliothèques, et non de plugins. Je suis vraiment plus intéressé par le fait de permettre aux utilisateurs administratifs non développeurs de sélectionner et d'utiliser les plugins qui sont les plus intéressants pour eux sans avoir à connaître les détails internes de l'application.
1 votes
Vous avez réussi à faire quelque chose avec ça ? Je suis intéressé à essayer quelque chose de similaire. La façon dont Angular 2 est construit (autour des modules), j'ai pensé qu'une architecture de type plugin serait très bien adaptée, mais il ne semble pas y avoir d'exemples, etc.
2 votes
@Joe, je n'ai toujours pas de bonne solution pour ce problème. J'ai pensé la même chose que vous.
1 votes
Je cherche exactement le même mécanisme, mais aucune réponse valable jusqu'à présent :( stackoverflow.com/questions/43063091/angular2-plugin-mechanism
1 votes
On dirait que c'est un travail pour : angular.io/guide/
1 votes
Je suis également à la recherche de la même chose. Ce que j'ai trouvé, c'est que nous pouvons utiliser Angular Element qui est juste un plugin et sera intégré dans les applications web Angular ou non Angular. Une sorte de plug and play. Ce n'est pas encore officiel.
0 votes
@Hearty, si nous pensons au même angular.element, il est compatible uniquement avec l'AngularJS original plutôt qu'avec Angular2+. Il ne fournirait pas tout à fait ce que je décris ci-dessus docs.angularjs.org/api/ng/function/angular.element
0 votes
Non @AnthonyGatlin, je ne parle pas de angular.element. Je décris Angular Element qui n'est pas encore disponible dans Angular v5 officiellement mais qui le sera probablement bientôt.
0 votes
Avez-vous trouvé quelque chose de prometteur concernant l'A v5 ?
0 votes
Pour le moment, j'utilise une approche plutôt primitive. Je recherche les plugins dans le dossier des plugins. Je génère des objets de métadonnées sur les plugins. En utilisant ces métadonnées et une commande de construction, je génère des fichiers de modules angulaires dans le noyau à partir de modèles de modules génériques (guidons ou chaînes interpolées). Ces fichiers sont ignorés par git. Chaque installation génère son propre ensemble de modules, en câblant toutes les dépendances avec une commande de construction. Ainsi, j'ai la complétion de code (analyse statique) intacte. Ce n'est pas l'idéal, mais bon, c'est quelque chose. Avez-vous trouvé quelque chose de mieux ? J'aimerais vous contacter si possible.
0 votes
Je suis également intéressé par cette solution pour une application de tableau de bord, où de nouveaux widgets pourraient être ajoutés avec des plugins supplémentaires. Vous pouvez soit utiliser JIT et enregistrer dyanmiquement les modules/compiler les composants du côté client, soit utiliser AOT et reconstruire chaque fois qu'un plugin est ajouté. Mais nous pourrions obtenir quelque chose d'agréable dans la v6 : next.angular.io/guide/éléments personnalisés
0 votes
@AnthonyGatlin Avez-vous trouvé quelque chose de pratique concernant cette question ? J'ai déjà développé un tel système en PHP à l'aide de CakePHP et maintenant j'ai hâte de faire la même chose en Angular 5 et Firebase. J'ai les mêmes préoccupations que votre question ci-dessus mais, jusqu'à présent, je n'ai rien trouvé d'utile. J'aimerais discuter avec vous si possible pour en apprendre davantage sur votre expérience jusqu'à présent.
1 votes
@Subhan, Étant donné la façon dont Angular domine et contrôle l'ensemble de l'environnement frontal, j'ai trouvé que la migration vers un autre framework, spécifiquement React, offrait un chemin beaucoup plus facile vers mon objectif. Même si j'aime beaucoup Angular, j'ai découvert que mon nouvel amour est beaucoup plus accommodant.
0 votes
@AnthonyGatlin J'ai les mêmes exigences que vous, avez-vous choisi react ou avez-vous trouvé quelque chose avec angular 5 ? Je suis nouveau dans les deux et les exigences sont difficiles à satisfaire comme vous l'avez expliqué.
0 votes
@django Pour mon projet actuel, je travaille en React, mais je prévois de rester à jour en Angular et de passer de l'un à l'autre selon les besoins. Les deux sont formidables et ont leurs avantages et leurs limites. Même si Angular ne répondait pas tout à fait à mes besoins pour le projet actuel, je ne l'abandonne en aucun cas.
1 votes
@AnthonyGatlin Vous n'avez donc pas été en mesure de construire une architecture de plugins dans Angular 5 ? Cette approche est-elle plus facile dans, par exemple, React ?
0 votes
@NiklasTeich, oui, la construction de composants de plugins peut certainement être faite dans React - et plusieurs ont déjà accompli cela. React est principalement une bibliothèque pour le rendu frontal, alors qu'Angular prend en charge la totalité du frontal. React permet beaucoup plus de flexibilité. Parfois, c'est une bonne chose. D'autres fois, Angular est meilleur et peut être légèrement plus performant. Cependant, j'ai trouvé que React+Apollo me donnent à peu près autant de performance que ce dont j'ai besoin pour la plupart des applications. Au-delà du front-end pur, vous pouvez brancher toutes sortes de bibliothèques derrière React - y compris celles qui peuvent accepter des plugins de toutes sortes.
0 votes
@Andrew vous utilisez déjà Angular Elements vous-même ou vous avez une approche différente ? Et comment résolvez-vous le routage paresseux si ce n'était pas seulement un composant, mais un module complet ? Je suis curieux de savoir quel est l'état actuel de la mise en œuvre de ce type d'architecture, avez-vous fait des progrès ?
0 votes
@LarsMeijdam Je n'ai pas encore utilisé les éléments Angular, j'ai seulement lu à leur sujet. En fait, je n'ai pas encore commencé à travailler sur le tableau de bord... probablement pendant l'hiver. L'idée est que soit vous incluez les fichiers dinamiquement dans votre projet et recompilez l'application entière sur le serveur (quand un plugin est ajouté par exemple), soit vous utilisez JIT pour compiler sur le client, soit vous essayez les nouveaux éléments angulaires. Pour le chargement paresseux, je suppose que vous devez créer une sorte de service que chaque module paresseux appelle sur init pour charger les dépendances script appropriées. Ou une sorte de plugin common chunks...
0 votes
Angular Elements est très élégant et très utile pour des cas d'utilisation spécifiques. Mais ce n'est peut-être pas le cas dans le nôtre. Veuillez consulter ma question concernant mon problème ; stackoverflow.com/questions/50149016/
2 votes
J'ai créé un dépôt sur github avec une solution qui pourrait aider. Elle utilise les bibliothèques Angular 6 et les applications de base 1 qui chargent les bibliothèques groupées UMD paresseusement ; github.com/lmeijdam/angular-umd-dynamic-example Si vous avez des suggestions, n'hésitez pas à les ajouter !
1 votes
@LarsMeijdam, Votre approche est très intéressante. Vous avez peut-être enfin trouvé un cas d'utilisation raisonnable pour Eval(). Dès que je peux avoir un peu de temps, je veux cloner votre dépôt GitHub et l'expérimenter. Cela semble prometteur. Merci pour le partage.
0 votes
@AnthonyGatlin Pour le moment, j'ai dû le mettre en privé car certaines politiques d'entreprise de mes clients n'étaient pas sûres pour moi de le mettre en public, je reviendrai dès que possible car la discussion est en cours. Pour l'instant, vous pouvez me contacter si vous souhaitez conserver le repo, car il ne contient aucune information relative à l'entreprise.
0 votes
@LarsMeijdam Oui, j'aimerais beaucoup revoir le référentiel. Vraiment beaucoup.
0 votes
Une autre forme de contact à laquelle je peux transmettre le dépôt :)
0 votes
@AnthonyGatlin continuez à mettre à jour votre poste, la communauté apprécie l'effort et le travail. Je vais avoir besoin d'une solution à ce problème dans les mois à venir et je garde un œil sur cette question de l'OS depuis quelques mois déjà.
0 votes
@LarsMeijdam anthony.gatlin AT happycatfish.com
0 votes
@LarsMeijdam pourrais-je également obtenir une copie du repo ? <email removed, thanks Lars>
0 votes
Je viens d'arriver à cette question après avoir beaucoup cherché. Il semble qu'il y ait beaucoup à attendre d'Angular 6. @LarsMeijdam est-il toujours possible de partager une copie du repo à mon github ?
0 votes
@Shailesh vous avez des coordonnées ou un endroit où je pourrais en trouver un ? alors nous pourrons parler de ce que j'ai créé. Heureux de partager !
0 votes
@LarsMeijdam désolé pour ça, vous pouvez me trouver sur twitter.com/60secondrun