Integrando atlasmap-2.3.5 (React) en Angular12
Es un poco desafiante encontrar una solución para integrar una aplicación de React en una aplicación de Angular. En general, hay 2 componentes clave en todo el trabajo: Atlasmap (de código abierto) y Angular. Estoy trabajando en la integración de Atlasmap en Angular 12.
Atlasmap es una aplicación de mapeo de código abierto desarrollada en React.
Atlasmap se ejecuta como una aplicación independiente de React. Atlasmap es un componente principal y se puede encontrar en el repositorio de git.
En el repositorio de Atlasmap, se puede encontrar Standalone, que envuelve y ejecuta la aplicación de Atlasmap.
Atlasmap core consiste en todas las funciones de utilidad necesarias para Atlasmap.
He intentado integrar Atlasmap en Angular como un componente, pero me encontré con un problema.
Pude utilizar el atlasmapProvider, que es un componente principal de atlasmap y proporciona propiedades (entrada para atlasmap) en forma de API que puede ser utilizada por Atlasmap. Pero Atlasmap no puede crear su propio nodo DOM independiente y no se activa sin el componente AtlasmapProvider.
He intentado Direflow, pero hay una incompatibilidad de versiones entre la versión interna de React de Direflow (que admite la versión 16.3) y Atlasmap (17 y superior).
He intentado Stencil.js para generar un componente web y agregar componentes principales y secundarios, pero hay un problema con la configuración no configurable o la ruta incorrecta de los archivos JS compilados, lo que hace que no se incluya en el archivo HTML principal de Stencil.
Rayo de esperanza
Probé otro enfoque en el que inserté un componente basado en React y lo envolví en una aplicación base de Angular. Con éxito, pude colocar el componente de React como un elemento en el DOM y también se activaron algunas API de prueba, pero hay desafíos para ensamblar el componente secundario.
Para consultar mi repositorio de trabajo, haz clic aquí. He agregado node_modules porque he incorporado explícitamente la carpeta de distribución (Dist) de Atlasmap.
¿Alguien puede proporcionar un StackBlitz / Codesandbox funcional configurado en Angular 12 y Atlasmap?
Los enfoques de Iframe o Microfrontend no son aceptables. Se agradecería el uso de un componente web.
Gracias por la ayuda. 🙂
davy.ai
Solución para Integrar Atlasmap (React) en una Aplicación Angular
Como experto en tecnologías de la información especializado en JavaScript, Angular, web components, stenciljs y Atlasmap, comprendo el desafío de integrar una aplicación React como Atlasmap en una aplicación Angular. Basado en mi experiencia, existen diferentes enfoques para resolver este problema, pero el más factible es envolver el componente React de Atlasmap en un componente Angular.
A continuación, se presentan los pasos para lograr esto:
react
,react-dom
,@atlasmap/atlasmap
y@babel/core
.Crea un nuevo componente Angular que alojará el componente React de Atlasmap. En este ejemplo, lo llamaré
atlasmap-wrapper.component.ts
.Agrega las importaciones necesarias al archivo
atlasmap-wrapper.component.ts
. Deberás importarComponent
,OnInit
,AfterViewInit
,ViewChild
,ElementRef
yRenderer2
del paquete@angular/core
. También deberás importarReactDOM
yAtlasMap
de sus respectivos paquetes.atlasmap-wrapper
.El componente
atlasmap-wrapper
renderizará un elementodiv
que servirá como contenedor del componente React de Atlasmap. El decorador@ViewChild
seleccionará este elementodiv
. En el métodongAfterViewInit()
, utilizamos ReactDOM para renderizar el componente AtlasMap dentro del elementodiv
seleccionado.Agrega el componente
atlasmap-wrapper
al archivoapp.module.ts
.Agregamos el componente
atlasmap-wrapper
a la lista de declaraciones.Usa el componente
atlasmap-wrapper
en la aplicación Angular. Puedes agregar el selectorapp-atlasmap-wrapper
en la plantilla de cualquier componente Angular para renderizar el componente React de Atlasmap.Con estos pasos, puedes integrar Atlasmap (React) en una aplicación Angular sin utilizar iframes o enfoques de microfrontend. El enfoque de web components con el componente envolvente de Angular proporciona una solución limpia y sencilla a este problema.