Métodos de separação de front-end e back-end com javascript de pilha cheia?


31

Suponha que eu tenha um front-end, que é principalmente um aplicativo de página única, escrito usando angular, grunhido e caramanchão. E suponha que eu possua um back-end, que na maioria das vezes é apenas uma API REST em cima de um ORM, que armazena / recupera objetos de um banco de dados, usando coisas como grunhir, expressar e sequenciar.

O aplicativo angular faz todo o material visual que o usuário vê, mas faz isso por ser uma GUI sobre os serviços fornecidos pelo back-end.

Seria desejável separá-los em duas bases de código diferentes, para permitir desenvolvimento independente, versionamento, integração contínua, push to development, etc.

Minha pergunta é: quais métodos existem para fazer isso de forma limpa? Existem práticas recomendadas para javascript de pilha completa?

A opção 1 parece ser um monólito, ou seja, "não os separe". O profissional é que a cadeia de construção é simples e tudo está em um só lugar - mas parece haver muitos contras; mais difícil de versão independentemente, uma frente quebrada significa uma traseira não implantável e assim por diante.

A opção 2 parece ser um quase-monólito, em que a cadeia de criação do front-end resulta na gravação de vários arquivos no back-end. O distdiretório no front-end se referiria a algum diretório no back-end, portanto, essencialmente, quando o front-end reduz, uglifica, etc, acaba publicando no back-end, que executa tudo.

A opção nº 3 parece ter separação total: o front-end e o back-end executam seus próprios servidores em portas diferentes e são projetos totalmente separados. A desvantagem parece que eles precisam ser configurados para conhecer as portas um do outro; o back-end deve permitir o CORS a partir do front-end e precisa saber onde todos esses pontos de extremidade devem estar.

A opção 4 pode ser usar algo como docker-compose para montar a coisa toda.

Tenho certeza que existem outras opções. Qual é a melhor prática recomendada?

Respostas:


18

É um aplicativo front-end, back-end, com uma interface REST no meio. Você já tem separação completa.

Meu voto é para a opção 3. Você parece preocupado com a configuração, mas esse é o ponto principal. A configuração permite que você tenha uma separação completa sem precisar de ligações de código fortemente acopladas. Se você está preocupado com o CORS, coloque tudo em um domínio. Se você precisar do CORS, a melhor maneira de gerenciar isso é uma configuração.

Mas não há "boas práticas" aqui. A melhor prática é aquela que melhor atenderá às suas necessidades específicas.


2
Como você colocaria tudo em um domínio se fossem dois servidores separados? Mesmo se eles rodassem no mesmo host, teriam que estar em portas diferentes, criando origens diferentes.
— FrobberOfBits

11
Se não houver uma prática recomendada, existem exemplos disponíveis de como essa configuração é feita?
— FrobberOfBits

7
Você pode colocar um proxy reverso (nginx) na frente do aplicativo e montar o /local em localhost:3000(servidor front-end) e /api/em localhost:3001(servidor api). O nginx escutará a porta http padrão então.
— Nvartolomei

@nvartolomei Concordo em usar o proxy reverso. Existe uma maneira de compartilhar corretamente algumas informações entre back-end e front-end, como informações de rotas? Além disso, é fácil apontar seu proxy reverso para uma CDN?
— Andrew Allbright

6

Sim, você deve separar os dois e tratar o aplicativo front-end como um aplicativo de terceiros - você pode adicionar outro cliente, um aplicativo móvel, por exemplo, e se o primeiro cliente tiver sido construído dessa maneira, sua vida será mais fácil.

O uso de contêineres de docker ou outro sistema de implantação pertence principalmente ao back-end, pois o front-end do seu aplicativo são apenas ativos estáticos que precisam ser resolvidos. Você pode hospedar esses ativos estaticamente em seu servidor ou em outro lugar como uma CDN como a cloudfront.

Evitar cors economizará uma configuração Little, mas, como a resposta acima mencionada, esse é o tipo de questão. O uso de cors (e autenticação de token) também preparará melhor o seu back-end para outros clientes.

Editar: no que diz respeito às práticas recomendadas de pilha cheia js - eu diria apenas isso, seja consistente. Se você estiver usando promessas (e deveria), faça-o dos dois lados. Mantenha o mesmo estilo e formatação js, ​​use as mesmas bibliotecas de teste (sempre que possível) etc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.