Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Angular 2 - Aplicações separadas se integrando

Alguém já fez uma aplicação angular, separada em módulos, de modo que o cada módulo possa ter seu deploy feito de forma independente?

Algo como, eu fazer uma main page, e os meus módulos só carregando via um router-outlet ou algo do tipo?

10 respostas

Toda aplicação em Angular tem o módulo principal. (root module ou app module). Você só faz deploy de módulos principais da aplicação. Se você tem duas aplicações, cada uma terá seu módulo e serão dois deploys de duas aplicações distintas.

Se tem duas aplicações distintas, não conseguirá acessar os módulos de uma na outra, porque são coisas distintas.

Se o que você esta querendo é compartilhar módulos que não sejam módulos principais, cada aplicação deve ter uma cópia do módulo compartilhado e importado. Isso pode ser feito pelo engenheiro front-end que prepara um processo de build especial para que as duas aplicações distintas tenha os módulos compartilhados no deploy fazendo a cópia automaticamente.

Uma aplicação dependente de outra fere o princípio de reutilização. Se isso fosse possível, quando você fosse importar outra aplicação, traria TUDO o que a outra aplicação tem para dentro de outra. É por isso que angular é modular, justamente para você não fazer isso e importar apenas o que é comum.

Talvez seja interessante dar uma estuda sobre módulos, sistemas modulares, porque essa discussão vai além do Angular, mas tange certos princípios.

https://en.wikipedia.org/wiki/Modular_programming

Pense que uma aplicação pode utilizar diversos módulos que são usadas por outras aplicações, mas outra aplicação não pode usar outra aplicação, porque são coisas distintas. Usamos módulos para criar aplicações.

Como disse, se duas aplicações fazem uso de um mesmo módulo, esse mesmo módulo deve fazer parte das duas aplicações. Uma aplicação não "importa" outra, o que ela importa são módulos.

Talvez sua confusão seja que uma aplicação em Angular é criada a partir de um módulo principal (root module). Esse módulo é exclusivo da aplicação, tem coisas específicas, dita como a app é criada e ela não é importada por outras aplicações. Com disse, acho que até em outro post, se você quiser que duas apps distintas compartilhem os mesmos módulos, cada app deve ter esse módulo. Se você vai copiar na mão, automatizar na mão ou usar alguma ferramenta depende de você.

Beleza Orlando?

Entendi o que vc explicou sobre os modulos e o root module... O que eu queria fazer, antigamente eu faria com uma pagina só com um topo (menu) e o corpo seria um iframe aonde eu abriria minhas páginas. O que eu queria saber é se tinha algum jeito mais "elegante" de fazer isso em angular.

Não sei se expressei bem o que eu quero fazer...

Para ficar mais claro ainda, pense cada aplicação usa como um boneco construído usando lego e que cada peça de lego é um módulo. O módulo principal (root) da aplicação são as regras que definem como o boneco deve ser construído e qual peças usar, ou seja, quais são seus módulos.

Se você cria outro boneco parecido, esse outro boneco (aplicação) vai ter a regra de quais módulos usar (importar) para realizar essa tarefa.

E se agora você precisa de uma peça de um boneco em outro? Não pode tirar a peça do boneco porque desfalcará o primeiro. Sendo assim, você usa uma peça idêntica, cópia dessa peça para acabar de construir o mesmo boneco.

Quando um boneco for exibido, é algo complemente em separado do outro boneco. São coisas independentes.

Na sua App Angular.. se você quiser compartilhar uma peça de lego entre duas aplicações, precisará fazer uma cópia, porque assim como um boneco não pode importar o outro.. uma aplicação em angular não pode importar outra.

Ah, sim... se você usar o iframe, ainda assim, sua aplicação não poderá conversar com outra. porque para o navegador são coisas distintas. Característica do iframe.

O iframe é apenas para exibir o conteúdo de uma página em outra, mas não dá controle da página pai interagir com a página filha em JavaScript.

Então, explicando o que eu quero, é exatamente a característica do iframe: Exibir o conteúdo de uma aplicação dentro de outra. Não há a necessidade de interação entre elas.

Existe alguma forma diferente de fazer isto em angular ou o iframe ainda é uma boa saída?

Não conheço outra forma , dentro do contexto que você passou.

solução!

Para ser mais preciso, não há.

Ainda sobre este assunto, eu consigo ter uma pasta externa à pasta src/app, para que eu tenha componentes reutilizáveis entre minhas aplicações angular2?