Actualización 24/05/2018: ahora somos versiones +3 de Angular de mi publicación original y todavía no tenemos una solución viable final. Lars Meijdam (@LarsMeijdam) ha presentado un enfoque interesante que vale la pena ver. (Debido a problemas de propiedad, tuvo que eliminar temporalmente el repositorio de GitHub donde había publicado originalmente su muestra. Sin embargo, puede enviarle un mensaje directamente si desea una copia. Consulte los comentarios a continuación para obtener más información).
Los cambios arquitectónicos recientes en Angular 6 nos acercan a una solución. Además, Angular Elements ( https://angular.io/guide/elements ) proporciona algunas funciones de componentes, aunque no exactamente lo que describí originalmente en esta publicación.
Si alguien del increíble equipo Angular se encuentra con esto, tenga en cuenta que parece haber muchas otras personas que también están muy interesadas en esta funcionalidad. Bien podría valer la pena considerar para el retraso.
Quisiera poner en práctica un (plug-in) marco enchufable en una Angular 2
, Angular 4
, Angular 5
, o Angular 6
aplicación.
(Mi caso de uso específico para desarrollar este marco conectable es que necesito desarrollar un sistema de administración de contenido en miniatura. Por una serie de razones no necesariamente elaboradas aquí, Angular 2/4/5/6
es un ajuste casi perfecto para la mayoría de las necesidades de ese sistema).
Por marco conectable (o arquitectura de complemento), me refiero específicamente a un sistema que permite a los desarrolladores de terceros crear o ampliar la funcionalidad de una aplicación primaria mediante el uso de componentes conectables sin tener acceso directo o conocimiento del código fuente de la aplicación primaria o funcionamiento interno .
(Esa frase sobre " sin tener acceso directo o conocimiento del código fuente de la aplicación o el funcionamiento interno " es un objetivo central).
Los ejemplos de marcos conectables incluyen sistemas comunes de administración de contenido como WordPress
o Drupal
.
La situación ideal (como con Drupal) sería simplemente poder colocar estos componentes enchufables (o complementos) en una carpeta, hacer que la aplicación los detecte automáticamente o los descubra, y hacer que simplemente "funcionen" mágicamente. Hacer que esto ocurra de alguna manera conectable en caliente, lo que significa que mientras la aplicación se estaba ejecutando, sería óptimo.
Actualmente estoy tratando de determinar las respuestas ( con su ayuda ) a las siguientes cinco preguntas.
- Practicidad: ¿Es práctico un plugin framework para una
Angular 2/4/5/6
aplicación? (Hasta ahora, no he encontrado ninguna forma práctica de crear un marco verdaderamente conectableAngular2/4/5/6
). - Desafíos esperados: ¿Qué desafíos podría enfrentar uno al implementar un marco de plugin para una
Angular 2/4/5/6
aplicación? - Estrategias de implementación: ¿Qué técnicas o estrategias específicas podrían emplearse para implementar un marco de plugin para una
Angular 2/4/5/6
aplicación? - Mejores prácticas: ¿Cuáles son las mejores prácticas para implementar un sistema de complemento para una
Angular 2/4/5/6
aplicación? - Tecnologías alternativas: si un marco de plugin no es práctico en una
Angular 2/4/5/6
aplicación, ¿qué tecnologías relativamente equivalentes (por ejemploReact
) podrían ser adecuadas para una aplicación web moderna altamente reactiva ?
En general, el uso de Angular 2/4/5/6
es muy deseable porque:
- es naturalmente extremadamente rápido, increíblemente rápido.
- consume muy poco ancho de banda (después de la carga inicial)
- tiene una huella relativamente pequeña (después
AOT
ytree shaking
), y esa huella continúa disminuyendo - es altamente funcional, y el equipo y la comunidad de Angular continúan el rápido crecimiento de su ecosistema
- funciona bien con muchas de las mejores y más recientes tecnologías web como
TypeScript
yObservables
- Angular 5 ahora admite trabajadores de servicio ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- respaldado por
Google
, es probable que sea compatible y mejorado en el futuro
Me gustaría mucho usarlo Angular 2/4/5/6
para mi proyecto actual. Si puedo usar Angular 2/4/5/6
, también lo estaré usando Angular-CLI
y probablemente Angular Universal
(para la representación del lado del servidor).
Aquí están mis pensamientos, hasta ahora, con respecto a las preguntas anteriores. Por favor revise y proporcione sus comentarios e iluminación.
Angular 2/4/5/6
las aplicaciones consumen paquetes, pero esto no es necesariamente lo mismo que permitir complementos dentro de una aplicación. Un complemento en otros sistemas (pDrupal
. Ej. ) Se puede agregar esencialmente soltando la carpeta del complemento en un directorio de módulos común donde el sistema lo "recoge" automáticamente. EnAngular 2/4/5/6
, un paquete (como podría ser un complemento) generalmente se instala a través denpm
, se agrega apackage.json
, y luego se importa manualmente a la aplicación, como enapp.module
. Esto es mucho más complicado que elDrupal
método de soltar una carpeta y hacer que el sistema detecte automáticamente el paquete. Cuanto más complicado sea instalar un complemento, menos probable será que las personas los usen. Sería mucho mejor si hubiera una manera deAngular 2/4/5/6
para detectar e instalar complementos automáticamente. Estoy muy interesado en encontrar un método que permita a los no desarrolladores instalar laAngular 2/4/5/6
aplicación e instalar los complementos elegidos sin tener que comprender toda la arquitectura de la aplicación.En general, uno de los beneficios de proporcionar una arquitectura conectable es que es muy fácil para los desarrolladores externos ampliar la funcionalidad del sistema. Obviamente, estos desarrolladores no estarán familiarizados con todas las complejidades del código para la aplicación a la que se están conectando. Una vez que se desarrollan los complementos, otros usuarios aún menos técnicos pueden simplemente instalar la aplicación y cualquier complemento seleccionado. Sin embargo,
Angular 2/4/5/6
es relativamente complicado y tiene una curva de aprendizaje muy larga. Para complicar aún más las cosas, la mayoría de producción deAngular 2/4/5/6
aplicaciones también utilizanAngular-CLI
,Angular Universal
yWebPack
. Alguien que está implementando un complemento probablemente tendría que tener al menos un conocimiento básico de cómo encajan todos estos, junto con un sólido conocimiento práctico deTypeScript
y una familiaridad razonable conNodeJS
. ¿Los requisitos de conocimiento son tan extremos que ningún tercero querría desarrollar un complemento?Es probable que la mayoría de los complementos tengan algún componente del lado del servidor (por ejemplo, para almacenar / recuperar datos relacionados con el complemento), así como algunos resultados del lado del cliente.
Angular 2/4/5
específicamente (y fuertemente) desalienta a los desarrolladores de inyectar sus propias plantillas en tiempo de ejecución, ya que esto plantea un grave riesgo de seguridad. Con el fin de manejar muchos tipos de salida que puede acomodar un complemento (por ejemplo, la visualización de un gráfico), parece que probablemente sea necesario permitir a los usuarios crear contenido que se inyecta en la secuencia de respuesta, de una forma u otra. Me pregunto cómo podría ser posible satisfacer esta necesidad sin destruir en sentido figuradoAngular 2/4/5/6
los mecanismos de seguridad.La mayoría de las
Angular 2/4/5/6
aplicaciones de producción se compilan previamente mediante la compilaciónAhead of Time
(AOT
). (Probablemente todos deberían estarlo). No estoy seguro de cómo se pueden agregar complementos a (o integrar con) aplicaciones precompiladas. El mejor escenario implicaría compilar los complementos por separado de la aplicación principal. Sin embargo, no estoy seguro de cómo hacer que esto funcione. Un inconveniente podría ser volver a compilar toda la aplicación con los complementos incluidos, pero eso complica un poco las cosas para un usuario administrativo que simplemente quiere instalar la aplicación (en su propio servidor) junto con los complementos seleccionados.En una
Angular 2/4/5/6
aplicación, especialmente una precompilada, una sola pieza de código errante o en conflicto puede romper toda la aplicación.Angular 2/4/5/6
Las aplicaciones no siempre son las más fáciles de depurar. La aplicación de complementos de mal comportamiento podría dar lugar a experiencias muy desagradables. Actualmente no conozco un mecanismo para manejar con gracia los complementos de mal comportamiento.