Update 24.05.2008: Wir sind jetzt +3 Versionen von Angular aus meinem ursprünglichen Beitrag und haben noch keine endgültige praktikable Lösung. Lars Meijdam (@LarsMeijdam) hat einen interessanten Ansatz entwickelt, der auf jeden Fall einen Blick wert ist. (Aufgrund von proprietären Problemen musste er das GitHub-Repository, in dem er sein Beispiel ursprünglich veröffentlicht hatte, vorübergehend entfernen. Sie können ihm jedoch direkt eine Nachricht senden, wenn Sie eine Kopie wünschen. Weitere Informationen finden Sie in den Kommentaren unten.)
Die jüngsten architektonischen Änderungen in Angular 6 bringen uns einer Lösung näher. Darüber hinaus bietet Angular Elements ( https://angular.io/guide/elements ) einige Komponentenfunktionen - allerdings nicht ganz das, was ich ursprünglich in diesem Beitrag beschrieben habe.
Wenn jemand aus dem erstaunlichen Angular-Team darauf stößt, beachten Sie bitte, dass es anscheinend viele andere Personen gibt, die ebenfalls sehr an dieser Funktionalität interessiert sind. Es könnte durchaus sinnvoll sein, über den Rückstand nachzudenken.
Ich möchte eine steckbare (Plug-in) Rahmen in einer implementieren Angular 2
, Angular 4
, Angular 5
, oder Angular 6
Anwendung.
(Mein spezieller Anwendungsfall für die Entwicklung dieses steckbaren Frameworks ist, dass ich ein Miniatur-Content-Management-System entwickeln muss. Aus einer Reihe von Gründen, die hier nicht unbedingt erläutert werden, Angular 2/4/5/6
ist es nahezu perfekt für die meisten Anforderungen dieses Systems geeignet.)
Mit steckbarem Framework (oder Plug-in-Architektur) meine ich speziell ein System, mit dem Entwickler von Drittanbietern die Funktionalität einer primären Anwendung mithilfe steckbarer Komponenten erstellen oder erweitern können, ohne direkten Zugriff auf oder Kenntnis des Quellcodes der primären Anwendung zu haben oder Innenleben .
(Diese Formulierung über " ohne direkten Zugriff auf oder Kenntnis des Quellcodes oder des Innenlebens der Anwendung " ist ein zentrales Ziel.)
Beispiele für steckbare Frameworks sind gängige Content-Management-Systeme wie WordPress
oder Drupal
.
Die ideale Situation (wie bei Drupal) wäre, diese steckbaren Komponenten (oder Plug-Ins) einfach in einen Ordner zu legen, sie von der Anwendung automatisch erkennen oder erkennen zu lassen und sie einfach magisch "funktionieren" zu lassen. Dies auf eine Art Hot-Plug-fähige Weise geschehen zu lassen, dh während die App ausgeführt wurde, wäre optimal.
Ich versuche derzeit, Antworten ( mit Ihrer Hilfe ) auf die folgenden fünf Fragen zu ermitteln.
Angular 2/4/5/6
Praktikabilität : Ist ein Plugin-Framework für eine Anwendung überhaupt praktikabel? (Bis jetzt habe ich keinen praktischen Weg gefunden, um ein wirklich steckbares Framework mit zu erstellenAngular2/4/5/6
.)- Erwartete Herausforderungen: Welche Herausforderungen können bei der Implementierung eines Plugin-Frameworks für eine
Angular 2/4/5/6
Anwendung auftreten? - Implementierungsstrategien: Welche spezifischen Techniken oder Strategien könnten zur Implementierung eines Plugin-Frameworks für eine
Angular 2/4/5/6
Anwendung verwendet werden? - Best Practices: Was sind die Best Practices für die Implementierung eines Plugin-Systems für eine
Angular 2/4/5/6
Anwendung? - Alternative Technologien: Wenn ein Plugin-Framework in einer Anwendung nicht praktikabel ist
Angular 2/4/5/6
, welche relativ äquivalenten Technologien (z. B.React
) könnten für eine moderne hochreaktive Webanwendung geeignet sein ?
Im Allgemeinen ist die Verwendung von Angular 2/4/5/6
sehr wünschenswert, weil:
- es ist natürlich extrem schnell - unglaublich.
- es verbraucht sehr wenig Bandbreite (nach dem ersten Laden)
- es hat einen relativ kleinen Platzbedarf (nach
AOT
undtree shaking
) - und dieser Platzbedarf schrumpft weiter - Es ist hochfunktional und das Angular-Team und die Community wachsen weiterhin rasant in ihrem Ökosystem
- Es spielt sich gut mit vielen der besten und neuesten Webtechnologien wie
TypeScript
undObservables
- Angular 5 unterstützt jetzt Servicemitarbeiter ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- Wenn es von unterstützt wird
Google
, wird es wahrscheinlich auch in Zukunft unterstützt und verbessert
Ich würde es sehr gerne Angular 2/4/5/6
für mein aktuelles Projekt verwenden. Wenn ich in der Lage bin zu verwenden Angular 2/4/5/6
, werde ich auch verwenden Angular-CLI
und wahrscheinlich Angular Universal
(für serverseitiges Rendern.)
Hier sind meine bisherigen Gedanken zu den obigen Fragen. Bitte überprüfen Sie und geben Sie Ihr Feedback und Ihre Erleuchtung.
Angular 2/4/5/6
Apps verbrauchen Pakete - dies ist jedoch nicht unbedingt dasselbe wie das Zulassen von Plugins innerhalb einer Anwendung. Ein Plugin in anderen Systemen (z. B.Drupal
) kann im Wesentlichen hinzugefügt werden, indem der Plugin-Ordner in einem allgemeinen Modulverzeichnis abgelegt wird, in dem er vom System automatisch "aufgenommen" wird. InAngular 2/4/5/6
wird ein Paket (wie es ein Plugin sein könnte) normalerweise über installiertnpm
, hinzugefügtpackage.json
und dann manuell in die App importiert - wie inapp.module
. Dies ist viel komplizierter als dasDrupal
Löschen eines Ordners und das automatische Erkennen des Pakets durch das System. Je komplizierter die Installation eines Plugins ist, desto unwahrscheinlicher ist es, dass Benutzer es verwenden. Es wäre viel besser, wenn es einen Weg dafür gäbeAngular 2/4/5/6
um Plugins automatisch zu erkennen und zu installieren. Ich bin sehr daran interessiert, eine Methode zu finden, mit der Nicht-Entwickler dieAngular 2/4/5/6
Anwendung installieren und ausgewählte Plugins installieren können, ohne die gesamte Architektur der Anwendung verstehen zu müssen.Im Allgemeinen besteht einer der Vorteile der Bereitstellung einer steckbaren Architektur darin, dass es für Entwickler von Drittanbietern sehr einfach ist, die Funktionalität des Systems zu erweitern. Offensichtlich sind diese Entwickler nicht mit allen Feinheiten des Codes für die Anwendung vertraut, in die sie einstecken. Sobald die Plugins entwickelt sind, können andere, noch weniger technische Benutzer einfach die Anwendung und alle ausgewählten Plugins installieren. Ist
Angular 2/4/5/6
jedoch relativ kompliziert und hat eine sehr lange Lernkurve. Um weiter komplizieren Dinge, die meisten ProduktionAngular 2/4/5/6
nutzen Anwendungen auchAngular-CLI
,Angular Universal
undWebPack
. Jemand, der ein Plugin implementiert, müsste wahrscheinlich zumindest einige Grundkenntnisse darüber haben, wie all diese zusammenpassen - zusammen mit einem starken Arbeitswissen überTypeScript
und eine vernünftige Vertrautheit mitNodeJS
. Sind die Wissensanforderungen so extrem, dass kein Dritter jemals ein Plugin entwickeln möchte?Die meisten Plugins verfügen wahrscheinlich über eine serverseitige Komponente (z. B. zum Speichern / Abrufen von Plugin-bezogenen Daten) sowie über eine clientseitige Ausgabe.
Angular 2/4/5
Insbesondere (und nachdrücklich) wird Entwickler davon abgehalten, zur Laufzeit eigene Vorlagen einzufügen, da dies ein ernstes Sicherheitsrisiko darstellt. Um viele Arten von Ausgaben zu verarbeiten, die ein Plugin aufnehmen kann (z. B. Anzeige eines Diagramms), scheint es wahrscheinlich erforderlich zu sein, Benutzern das Erstellen von Inhalten zu ermöglichen, die in einer anderen Form in den Antwortstrom eingefügt werden. Ich frage mich, wie es möglich sein könnte, diesem Bedarf gerecht zu werden, ohne dieAngular 2/4/5/6
Sicherheitsmechanismen im übertragenen Sinne zu vernichten .Die meisten Produktionsanwendungen
Angular 2/4/5/6
werden mitAhead of Time
(AOT
) compilation vorkompiliert . (Wahrscheinlich sollte alles so sein.) Ich bin mir nicht sicher, wie Plugins zu vorkompilierten Anwendungen hinzugefügt (oder in diese integriert) werden könnten. Das beste Szenario wäre das Kompilieren der Plugins getrennt von der Hauptanwendung. Ich bin mir jedoch nicht sicher, wie ich das schaffen soll. Ein Fallback könnte darin bestehen, die gesamte Anwendung mit den enthaltenen Plugins neu zu kompilieren. Dies erschwert jedoch die Verwaltung für einen Administrator, der die Anwendung einfach (auf seinem eigenen Server) zusammen mit ausgewählten Plugins installieren möchte.In einer
Angular 2/4/5/6
Anwendung, insbesondere einer vorkompilierten, kann ein einzelner fehlerhafter oder widersprüchlicher Code die gesamte Anwendung beschädigen.Angular 2/4/5/6
Anwendungen sind nicht immer am einfachsten zu debuggen. Die Anwendung von Plugins mit schlechtem Benehmen kann zu sehr unangenehmen Erfahrungen führen. Mir ist derzeit kein Mechanismus bekannt, mit dem schlecht benommene Plugins ordnungsgemäß behandelt werden können.