Atualização 24/05/2018: agora somos +3 versões do Angular da minha postagem original e ainda não temos uma solução final viável. Lars Meijdam (@LarsMeijdam) criou uma abordagem interessante que certamente vale a pena dar uma olhada. (Devido a problemas de propriedade, ele teve que remover temporariamente o repositório do GitHub onde havia publicado originalmente sua amostra. No entanto, você pode enviar uma mensagem diretamente se desejar uma cópia. Consulte os comentários abaixo para obter mais informações.)
Mudanças recentes na arquitetura do Angular 6 nos aproximam de uma solução. Além disso, o Angular Elements ( https://angular.io/guide/elements ) fornece algumas funcionalidades dos componentes - embora não sejam exatamente o que descrevi originalmente neste post.
Se alguém da incrível equipe Angular se deparar com isso, observe que parece haver muitas outras pessoas que também estão muito interessadas nessa funcionalidade. Vale a pena considerar a lista de pendências.
Gostaria de implementar um (plug-in) quadro conectável em um Angular 2
, Angular 4
, Angular 5
, ou Angular 6
aplicação.
(Meu caso de uso específico para desenvolver essa estrutura conectável é que eu preciso desenvolver um sistema de gerenciamento de conteúdo em miniatura. Por várias razões não necessariamente elaboradas aqui, Angular 2/4/5/6
é um ajuste quase perfeito para a maioria das necessidades desse sistema.)
Por estrutura conectável (ou arquitetura de plug-in), quero dizer especificamente um sistema que permite que desenvolvedores de terceiros criem ou estendam a funcionalidade de um aplicativo primário através do uso de componentes conectáveis sem ter acesso direto ou conhecimento do código fonte do aplicativo primário ou funcionamento interno .
(Essa frase sobre " sem ter acesso direto ou conhecimento do código fonte ou do funcionamento interno do aplicativo " é um objetivo principal.)
Exemplos de estruturas conectáveis incluem sistemas comuns de gerenciamento de conteúdo como WordPress
ou Drupal
.
A situação ideal (como no Drupal) seria simplesmente poder colocar esses componentes conectáveis (ou plug-ins) em uma pasta, fazer com que o aplicativo os detecte automaticamente ou os descubra e faça com que eles funcionem magicamente. Fazer com que isso ocorra de alguma maneira conectável a quente, ou seja, enquanto o aplicativo estava sendo executado, seria o ideal.
Atualmente, estou tentando determinar respostas ( com sua ajuda ) para as cinco perguntas a seguir.
- Praticidade: A estrutura de plug-ins para um
Angular 2/4/5/6
aplicativo é ainda prática? (Até agora, não encontrei nenhuma maneira prática de criar uma estrutura verdadeiramente conectávelAngular2/4/5/6
.) - Desafios esperados: Quais desafios alguém pode encontrar na implementação de uma estrutura de plug-ins para um
Angular 2/4/5/6
aplicativo? - Estratégias de implementação: Quais técnicas ou estratégias específicas podem ser empregadas para implementar uma estrutura de plugins para um
Angular 2/4/5/6
aplicativo? - Práticas recomendadas: Quais são as práticas recomendadas para implementar um sistema de plug-ins para um
Angular 2/4/5/6
aplicativo? - Tecnologias alternativas: se uma estrutura de plug-in não é prática em um
Angular 2/4/5/6
aplicativo, que tecnologias relativamente equivalentes (por exemploReact
) podem ser adequadas para um aplicativo Web altamente reativo moderno ?
Em geral, o uso de Angular 2/4/5/6
é muito desejável porque:
- é naturalmente extremamente rápido - impressionante.
- consome muito pouca largura de banda (após o carregamento inicial)
- tem uma pegada relativamente pequena (depois
AOT
etree shaking
) - e essa pegada continua a encolher - é altamente funcional, e a equipe e a comunidade Angular continuam o rápido crescimento de seu ecossistema
- ele funciona bem com muitas das melhores e mais recentes tecnologias da Web, como
TypeScript
eObservables
- O Angular 5 agora oferece suporte a funcionários de serviço ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- apoiado
Google
, é provável que seja apoiado e aprimorado no futuro
Eu gostaria muito de usar Angular 2/4/5/6
no meu projeto atual. Se eu puder usar Angular 2/4/5/6
, também o usarei Angular-CLI
e provavelmente Angular Universal
(para renderização no servidor).
Aqui estão meus pensamentos, até agora, sobre as perguntas acima. Revise e forneça seus comentários e esclarecimentos.
Angular 2/4/5/6
aplicativos consomem pacotes - mas isso não é necessariamente o mesmo que permitir plug-ins dentro de um aplicativo. Um plug-in em outros sistemas (por exemploDrupal
) pode ser adicionado essencialmente ao colocar a pasta do plug-in em um diretório de módulos comum, onde é automaticamente "captado" pelo sistema. EmAngular 2/4/5/6
, um pacote (como um plug-in) pode ser instalado vianpm
, adicionado aopackage.json
e importado manualmente para o aplicativo - como emapp.module
. Isso é muito mais complicado do que oDrupal
método de eliminar uma pasta e fazer com que o sistema detecte automaticamente o pacote. Quanto mais complicado for instalar um plug-in, menor a probabilidade de as pessoas os usarem. Seria muito melhor se houvesse uma maneira deAngular 2/4/5/6
para detectar e instalar plug-ins automaticamente. Estou muito interessado em encontrar um método que permita que não desenvolvedores instalem oAngular 2/4/5/6
aplicativo e instalem todos os plugins escolhidos sem ter que entender toda a arquitetura do aplicativo.Geralmente, um dos benefícios de fornecer uma arquitetura conectável é que é muito fácil para desenvolvedores terceirizados estender a funcionalidade do sistema. Obviamente, esses desenvolvedores não estarão familiarizados com todos os meandros do código do aplicativo em que estão conectados. Uma vez desenvolvidos os plugins, outros usuários ainda menos técnicos podem simplesmente instalar o aplicativo e quaisquer plugins selecionados. No entanto,
Angular 2/4/5/6
é relativamente complicado e tem uma curva de aprendizado muito longa. Para mais coisas complicar, a maioria produçãoAngular 2/4/5/6
aplicativos também utilizamAngular-CLI
,Angular Universal
eWebPack
. Alguém que esteja implementando um plug-in provavelmente precisará ter pelo menos algum conhecimento básico de como tudo isso se encaixa - junto com um forte conhecimento prático deTypeScript
e uma familiaridade razoável comNodeJS
. Os requisitos de conhecimento são tão extremos que nenhum terceiro desejaria desenvolver um plugin?A maioria dos plug-ins provavelmente terá algum componente do lado do servidor (por exemplo, para armazenar / recuperar dados relacionados ao plug-in), bem como alguma saída do lado do cliente.
Angular 2/4/5
especificamente (e fortemente) desencoraja os desenvolvedores a injetar seus próprios modelos em tempo de execução - pois isso representa um sério risco à segurança. Para lidar com muitos tipos de saída que um plug-in pode acomodar (por exemplo, exibição de um gráfico), parece que é provavelmente necessário permitir que os usuários criem conteúdo injetado no fluxo de resposta, de uma forma e de outra. Eu me pergunto como seria possível acomodar essa necessidade sem fragmentarAngular 2/4/5/6
os mecanismos de segurança.A maioria dos
Angular 2/4/5/6
aplicativos de produção é pré-compilada usando a compilaçãoAhead of Time
(AOT
). (Provavelmente todos deveriam ser.) Não tenho certeza de como os plug-ins podem ser adicionados (ou integrados a) aplicativos pré-compilados. O melhor cenário seria compilar os plugins separadamente do aplicativo principal. No entanto, não tenho certeza de como fazer isso funcionar. Uma alternativa pode ser recompilar todo o aplicativo com todos os plug-ins incluídos, mas isso complica um pouco as coisas para um usuário administrativo que simplesmente deseja instalar o aplicativo (em seu próprio servidor) junto com todos os plug-ins selecionados.Em um
Angular 2/4/5/6
aplicativo, especialmente um pré-compilado, um único pedaço de código incorreto ou conflitante pode quebrar o aplicativo inteiro.Angular 2/4/5/6
aplicativos nem sempre são os mais fáceis de depurar. A aplicação de plugins mal comportados pode resultar em experiências muito desagradáveis. Atualmente, não conheço um mecanismo para lidar com plugins mal comportados.