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 6Anwendung.
(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/6ist 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 WordPressoder 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/6Praktikabilitä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/6Anwendung auftreten? - Implementierungsstrategien: Welche spezifischen Techniken oder Strategien könnten zur Implementierung eines Plugin-Frameworks für eine
Angular 2/4/5/6Anwendung verwendet werden? - Best Practices: Was sind die Best Practices für die Implementierung eines Plugin-Systems für eine
Angular 2/4/5/6Anwendung? - 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/6sehr 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
AOTundtree 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
TypeScriptundObservables - 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/6für mein aktuelles Projekt verwenden. Wenn ich in der Lage bin zu verwenden Angular 2/4/5/6, werde ich auch verwenden Angular-CLIund 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/6Apps 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/6wird ein Paket (wie es ein Plugin sein könnte) normalerweise über installiertnpm, hinzugefügtpackage.jsonund dann manuell in die App importiert - wie inapp.module. Dies ist viel komplizierter als dasDrupalLö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/6um Plugins automatisch zu erkennen und zu installieren. Ich bin sehr daran interessiert, eine Methode zu finden, mit der Nicht-Entwickler dieAngular 2/4/5/6Anwendung 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/6jedoch relativ kompliziert und hat eine sehr lange Lernkurve. Um weiter komplizieren Dinge, die meisten ProduktionAngular 2/4/5/6nutzen Anwendungen auchAngular-CLI,Angular UniversalundWebPack. Jemand, der ein Plugin implementiert, müsste wahrscheinlich zumindest einige Grundkenntnisse darüber haben, wie all diese zusammenpassen - zusammen mit einem starken Arbeitswissen überTypeScriptund 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/5Insbesondere (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/6Sicherheitsmechanismen im übertragenen Sinne zu vernichten .Die meisten Produktionsanwendungen
Angular 2/4/5/6werden 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/6Anwendung, insbesondere einer vorkompilierten, kann ein einzelner fehlerhafter oder widersprüchlicher Code die gesamte Anwendung beschädigen.Angular 2/4/5/6Anwendungen 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.