Aktualizacja 5/24/2018: Mamy teraz +3 wersje Angular z mojego oryginalnego postu i nadal nie mamy ostatecznego działającego rozwiązania. Lars Meijdam (@LarsMeijdam) zaproponował ciekawe podejście, które z pewnością warte jest zobaczenia. (Ze względu na problemy własnościowe musiał tymczasowo usunąć repozytorium GitHub, w którym pierwotnie opublikował swoją próbkę. Możesz jednak wysłać mu wiadomość bezpośrednio, jeśli chcesz otrzymać kopię. Aby uzyskać więcej informacji, zapoznaj się z komentarzami poniżej).
Niedawne zmiany architektoniczne w Angular 6 przybliżają nas do rozwiązania. Ponadto Angular Elements ( https://angular.io/guide/elements ) zapewnia pewną funkcjonalność komponentów - choć nie do końca to, co pierwotnie opisałem w tym poście.
Jeśli ktoś z niesamowitego zespołu Angular spotkał się z tym, pamiętaj, że wydaje się, że jest wiele innych osób, które również są bardzo zainteresowane tą funkcją. Warto wziąć pod uwagę zaległości.
Ja do zaimplementowania wtykowym (wtyczki) ramy w sposób Angular 2
, Angular 4
, Angular 5
lub Angular 6
aplikacji.
(Moim szczególnym przypadkiem użycia przy tworzeniu tego podłączanego frameworka jest to, że muszę opracować miniaturowy system zarządzania treścią. Z wielu powodów niekoniecznie tu omówionych, Angular 2/4/5/6
jest on prawie idealny dla większości potrzeb tego systemu.)
Pod pojęciem struktury wtykanej (lub architektury wtyczek) rozumiem w szczególności system, który umożliwia deweloperom będącym osobami trzecimi tworzenie lub rozszerzanie funkcjonalności aplikacji podstawowej poprzez użycie podłączanych komponentów bez bezpośredniego dostępu lub znajomości kodu źródłowego aplikacji głównej. lub wewnętrzne funkcjonowanie .
(To sformułowanie o „ bez bezpośredniego dostępu lub wiedzy o kodzie źródłowym aplikacji lub jej wewnętrznym działaniu ” jest głównym celem).
Przykłady podłączanych struktur obejmują popularne systemy zarządzania treścią, takie jak WordPress
lub Drupal
.
Idealną sytuacją (tak jak w przypadku Drupala) byłoby proste umieszczenie tych podłączanych komponentów (lub wtyczek) w folderze, automatyczne ich wykrycie lub wykrycie przez aplikację i umożliwienie im magicznego „działania”. Gdyby to nastąpiło w sposób umożliwiający podłączanie na gorąco, co oznacza, że aplikacja była uruchomiona, byłaby optymalna.
Obecnie próbuję ustalić odpowiedzi ( z Państwa pomocą ) na następujące pięć pytań.
- Praktyczność: czy struktura wtyczek dla
Angular 2/4/5/6
aplikacji jest w ogóle praktyczna? (Do tej pory nie znalazłem żadnego praktycznego sposobu na stworzenie prawdziwie podłączalnego frameworka za pomocąAngular2/4/5/6
.) - Oczekiwane wyzwania: Jakie wyzwania można napotkać podczas implementacji struktury wtyczek dla
Angular 2/4/5/6
aplikacji? - Strategie wdrażania: Jakie konkretne techniki lub strategie można zastosować do implementacji struktury wtyczek dla
Angular 2/4/5/6
aplikacji? - Sprawdzone metody : jakie są sprawdzone metody wdrażania systemu wtyczek do
Angular 2/4/5/6
aplikacji? - Technologie alternatywne: jeśli struktura wtyczek nie jest praktyczna w
Angular 2/4/5/6
aplikacji, jakie stosunkowo równoważne technologie (np.React
) Mogą być odpowiednie dla nowoczesnej, wysoce reaktywnej aplikacji internetowej ?
Ogólnie korzystanie z programu Angular 2/4/5/6
jest bardzo pożądane, ponieważ:
- jest naturalnie niesamowicie szybki - tak niesamowicie.
- zużywa bardzo mało przepustowości (po początkowym załadowaniu)
- ma stosunkowo niewielki ślad (po
AOT
itree shaking
) - i ten ślad nadal się kurczy - jest wysoce funkcjonalny, a zespół i społeczność Angular kontynuują szybki rozwój swojego ekosystemu
- dobrze współpracuje z wieloma najlepszymi i najnowszymi technologiami internetowymi, takimi jak
TypeScript
iObservables
- Angular 5 obsługuje teraz pracowników usług ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- dzięki wsparciu
Google
będzie prawdopodobnie wspierany i ulepszany w przyszłości
Bardzo chciałbym użyć Angular 2/4/5/6
w moim obecnym projekcie. Jeśli będę mógł używać Angular 2/4/5/6
, będę również używać Angular-CLI
i prawdopodobnie Angular Universal
(do renderowania po stronie serwera).
Oto moje dotychczasowe przemyślenia dotyczące powyższych pytań. Przejrzyj i przekaż swoją opinię i oświecenie.
Angular 2/4/5/6
aplikacje zużywają pakiety - ale niekoniecznie oznacza to to samo, co zezwalanie na wtyczki w aplikacji. Wtyczkę w innych systemach (np.Drupal
) Można zasadniczo dodać, upuszczając folder wtyczek do wspólnego katalogu modułów, skąd jest automatycznie „pobierany” przez system. W programieAngular 2/4/5/6
pakiet (tak jak może to być wtyczka) jest zwykle instalowany przeznpm
, dodawany dopackage.json
, a następnie ręcznie importowany do aplikacji - jak wapp.module
. Jest to znacznie bardziej skomplikowane niżDrupal
metoda upuszczenia folderu i automatycznego wykrycia pakietu przez system. Im bardziej skomplikowana jest instalacja wtyczki, tym rzadziej ludzie będą z niej korzystać. Byłoby znacznie lepiej, gdyby istniał sposóbAngular 2/4/5/6
aby automatycznie wykrywać i instalować wtyczki. Jestem bardzo zainteresowany znalezieniem metody, która pozwala osobom niebędącym programistami zainstalowaćAngular 2/4/5/6
aplikację i zainstalować dowolne wybrane wtyczki bez konieczności rozumienia całej architektury aplikacji.Ogólnie rzecz biorąc, jedną z korzyści płynących z zapewniania architektury z możliwością podłączania jest to, że deweloperzy zewnętrzni mogą bardzo łatwo rozszerzyć funkcjonalność systemu. Oczywiście ci programiści nie będą zaznajomieni ze wszystkimi zawiłościami kodu aplikacji, do której się podłączają. Po opracowaniu wtyczek inni, nawet mniej techniczni użytkownicy mogą po prostu zainstalować aplikację i wybrane wtyczki. Jest jednak
Angular 2/4/5/6
stosunkowo skomplikowany i wymaga bardzo długiej nauki. Aby jeszcze bardziej skomplikować rzeczy, większość produkcjiAngular 2/4/5/6
aplikacje również wykorzystaćAngular-CLI
,Angular Universal
iWebPack
. Ktoś, kto wdraża wtyczkę, prawdopodobnie musiałby mieć przynajmniej podstawową wiedzę o tym, jak wszystkie te elementy pasują do siebie - wraz z solidną praktyczną znajomościąTypeScript
i rozsądną znajomośćNodeJS
. Czy wymagania dotyczące wiedzy są tak ekstremalne, że żadna osoba trzecia nie chciałaby nigdy opracować wtyczki?Większość wtyczek będzie prawdopodobnie miała jakiś komponent po stronie serwera (np. Do przechowywania / pobierania danych związanych z wtyczkami), jak również pewne dane wyjściowe po stronie klienta.
Angular 2/4/5
w szczególności (i zdecydowanie) zniechęca programistów do wstrzykiwania własnych szablonów w czasie wykonywania - ponieważ stwarza to poważne zagrożenie bezpieczeństwa. Aby obsłużyć wiele typów danych wyjściowych, które może obsłużyć wtyczka (np. Wyświetlanie wykresu), wydaje się, że prawdopodobnie konieczne jest umożliwienie użytkownikom tworzenia treści, które są wprowadzane do strumienia odpowiedzi, w jednej postaci. Zastanawiam się, jak można by zaspokoić tę potrzebę bez obrazowego niszczeniaAngular 2/4/5/6
mechanizmów bezpieczeństwa.Większość
Angular 2/4/5/6
aplikacji produkcyjnych jest wstępnie kompilowana przy użyciu kompilacjiAhead of Time
(AOT
). (Prawdopodobnie wszystko powinno być.) Nie jestem pewien, w jaki sposób można dodać (lub zintegrować) wtyczki do wstępnie skompilowanych aplikacji. Najlepszy scenariusz obejmowałby kompilację wtyczek oddzielnie od głównej aplikacji. Jednak nie jestem pewien, jak to działa. Rozwiązaniem alternatywnym może być ponowna kompilacja całej aplikacji z dołączonymi wtyczkami, ale to trochę komplikuje sprawę dla administratora, który po prostu chce zainstalować aplikację (na swoim serwerze) wraz z dowolnymi wybranymi wtyczkami.W
Angular 2/4/5/6
aplikacji, zwłaszcza wstępnie skompilowanej, pojedynczy fragment błędnego lub powodującego konflikt kodu może spowodować uszkodzenie całej aplikacji.Angular 2/4/5/6
aplikacje nie zawsze są najłatwiejsze do debugowania. Zastosowanie źle zachowanych wtyczek może spowodować bardzo nieprzyjemne doznania. Obecnie nie jestem świadomy istnienia mechanizmu do wdzięcznej obsługi źle zachowujących się wtyczek.