Aggiornamento del 24/05/2018: ora abbiamo +3 versioni di Angular dal mio post originale e non abbiamo ancora una soluzione definitiva realizzabile. Lars Meijdam (@LarsMeijdam) ha escogitato un approccio interessante che merita sicuramente una visita. (A causa di problemi proprietari, ha dovuto rimuovere temporaneamente il repository GitHub dove aveva originariamente pubblicato il suo campione. Tuttavia, è possibile inviargli un messaggio direttamente se si desidera una copia. Per ulteriori informazioni, consultare i commenti di seguito.)
I recenti cambiamenti architettonici in Angular 6 ci avvicinano a una soluzione. Inoltre, Angular Elements ( https://angular.io/guide/elements ) fornisce alcune funzionalità dei componenti, sebbene non sia esattamente quello che ho descritto in origine in questo post.
Se qualcuno del fantastico team angolare dovesse imbattersi in questo, si noti che sembrano esserci molte altre persone che sono anche molto interessate a questa funzionalità. Potrebbe valere la pena considerare per l'arretrato.
Vorrei realizzare un (plug-in) in un quadro pluggable Angular 2
, Angular 4
, Angular 5
, o Angular 6
applicazione.
(Il mio caso d'uso specifico per lo sviluppo di questo framework collegabile è che ho bisogno di sviluppare un sistema di gestione dei contenuti in miniatura. Per una serie di ragioni non necessariamente elaborate qui, Angular 2/4/5/6
è quasi perfetto per la maggior parte delle esigenze di quel sistema.)
Per framework collegabile (o architettura plug-in), intendo specificamente un sistema che consente agli sviluppatori di terze parti di creare o estendere la funzionalità di un'applicazione primaria mediante l'uso di componenti collegabili senza avere accesso diretto o conoscenza del codice sorgente dell'applicazione primaria o meccanismi interni .
(Tale frase su " senza avere accesso diretto o conoscenza del codice sorgente dell'applicazione o del funzionamento interno " è un obiettivo fondamentale.)
Esempi di framework collegabili includono sistemi di gestione dei contenuti comuni come WordPress
o Drupal
.
La situazione ideale (come con Drupal) sarebbe quella di poter semplicemente posizionare questi componenti (o plug-in) collegabili in una cartella, fare in modo che l'applicazione li rilevi automaticamente o li scopra, e li faccia semplicemente "funzionare" magicamente. Far sì che ciò avvenga in una sorta di hot plug, il che significa che mentre l'app era in esecuzione, sarebbe ottimale.
Attualmente sto cercando di determinare le risposte ( con il tuo aiuto ) alle seguenti cinque domande.
- Praticità: un framework di plugin per
Angular 2/4/5/6
un'applicazione è persino pratico? (Fino ad ora, non ho trovato alcun modo pratico per creare un framework veramente collegabileAngular2/4/5/6
.) - Sfide attese: quali sfide si potrebbero incontrare nell'implementazione di un framework di plugin per
Angular 2/4/5/6
un'applicazione? - Strategie di implementazione: quali tecniche o strategie specifiche potrebbero essere impiegate per implementare un framework di plugin per
Angular 2/4/5/6
un'applicazione? - Best practice: quali sono le best practice per l'implementazione di un sistema di plugin per
Angular 2/4/5/6
un'applicazione? - Tecnologie alternative: se un framework di plug-in non è pratico in
Angular 2/4/5/6
un'applicazione, quali tecnologie relativamente equivalenti (ad esempioReact
) potrebbero essere adatte per un'applicazione Web moderna altamente reattiva ?
In generale, l'uso di Angular 2/4/5/6
è molto desiderabile perché:
- è naturalmente estremamente veloce - incredibilmente così.
- consuma pochissima larghezza di banda (dopo il caricamento iniziale)
- ha un'impronta relativamente piccola (dopo
AOT
etree shaking
) e quell'impronta continua a ridursi - è altamente funzionale e il team e la comunità angolari stanno continuando una rapida crescita del suo ecosistema
- gioca bene con molte delle migliori e più recenti tecnologie Web come
TypeScript
eObservables
- Angular 5 ora supporta gli operatori dell'assistenza ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- essendo sostenuto da
Google
, è probabile che sia supportato e migliorato bene in futuro
Mi piacerebbe molto usare Angular 2/4/5/6
per il mio progetto attuale. Se sono in grado di utilizzare Angular 2/4/5/6
, userò anche Angular-CLI
e probabilmente Angular Universal
(per il rendering sul lato server).
Ecco i miei pensieri, finora, riguardo alle domande sopra. Si prega di rivedere e fornire il proprio feedback e illuminazione.
Angular 2/4/5/6
le app consumano pacchetti, ma non è necessariamente la stessa cosa che consentire i plug-in all'interno di un'applicazione. Un plug-in in altri sistemi (ad es.Drupal
) Può essere essenzialmente aggiunto rilasciando la cartella del plug-in in una directory di moduli comune dove viene automaticamente "prelevata" dal sistema. InAngular 2/4/5/6
, un pacchetto (come potrebbe essere un plug-in) di solito viene installato tramitenpm
, aggiunto apackage.json
e quindi importato manualmente nell'app - come inapp.module
. Questo è molto più complicato rispetto alDrupal
metodo di rilascio di una cartella e il rilevamento automatico del pacchetto da parte del sistema. Più è complicato installare un plugin, meno è probabile che le persone li usino. Sarebbe molto meglio se ci fosse un modo perAngular 2/4/5/6
per rilevare e installare automaticamente i plugin. Sono molto interessato a trovare un metodo che consenta ai non sviluppatori di installare l'Angular 2/4/5/6
applicazione e installare i plug-in scelti senza dover comprendere tutta l'architettura dell'applicazione.In generale, uno dei vantaggi di fornire un'architettura collegabile è che è molto facile per gli sviluppatori di terze parti estendere la funzionalità del sistema. Ovviamente, questi sviluppatori non avranno familiarità con tutte le complessità del codice per l'applicazione a cui si stanno collegando. Una volta sviluppati i plug-in, altri utenti ancora meno tecnici possono semplicemente installare l'applicazione e tutti i plug-in selezionati. Tuttavia,
Angular 2/4/5/6
è relativamente complicato e ha una curva di apprendimento molto lunga. Per ulteriori cose complicare, la maggior parte di produzioneAngular 2/4/5/6
delle applicazioni utilizzano ancheAngular-CLI
,Angular Universal
eWebPack
. Qualcuno che sta implementando un plug-in dovrebbe probabilmente avere almeno una conoscenza di base di come tutti questi si adattano insieme - insieme a una solida conoscenza pratica diTypeScript
e una ragionevole familiarità conNodeJS
. I requisiti di conoscenza sono così estremi che nessuna terza parte vorrebbe mai sviluppare un plugin?La maggior parte dei plug-in avrà probabilmente alcuni componenti lato server (ad es. Per l'archiviazione / recupero di dati relativi ai plug-in) nonché alcuni output lato client.
Angular 2/4/5
in particolare (e fortemente) scoraggia gli sviluppatori dall'iniezione dei propri modelli in fase di esecuzione, poiché ciò comporta un grave rischio per la sicurezza. Al fine di gestire molti tipi di output che un plug-in può ospitare (ad esempio la visualizzazione di un grafico), sembra che sia probabilmente necessario consentire agli utenti di creare contenuto che viene iniettato nel flusso di risposta, in una forma un'altra. Mi chiedo come sia possibile soddisfare questa esigenza senza distruggere in modo figuratoAngular 2/4/5/6
i meccanismi di sicurezza.La maggior parte delle
Angular 2/4/5/6
applicazioni di produzione sono pre-compilate utilizzando la compilazioneAhead of Time
(AOT
). (Probabilmente tutto dovrebbe essere.) Non sono sicuro di come i plugin possano essere aggiunti (o integrati con) alle applicazioni precompilate. Lo scenario migliore prevede la compilazione dei plug-in separatamente dall'applicazione principale. Tuttavia, non sono sicuro di come farlo funzionare. Un fallback potrebbe essere la ricompilazione dell'intera applicazione con tutti i plug-in inclusi, ma ciò complica un po 'le cose per un utente amministrativo che desidera semplicemente installare l'applicazione (sul proprio server) insieme a tutti i plug-in selezionati.In
Angular 2/4/5/6
un'applicazione, specialmente pre-compilata, un singolo pezzo di codice errato o in conflitto può interrompere l'intera applicazione.Angular 2/4/5/6
le applicazioni non sono sempre le più facili da eseguire il debug. L'applicazione di plugin mal comportati potrebbe provocare esperienze molto spiacevoli. Al momento non sono a conoscenza di un meccanismo per gestire con garbo plug-in mal funzionanti.