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 dist
diretó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?