O motivo é a estabilidade .
No lado do servidor, eu posso escolher componentes estáveis. Normalmente, isso significa que eu escolho Java e um monte de bibliotecas selecionadas com muito cuidado, como o FreeMarker. Desnecessário dizer que todas as bibliotecas, além das bibliotecas padrão do Java, são tratadas como descartáveis, então eu acesso as bibliotecas externas através de um invólucro feito por você. Isso significa que eu posso mudar facilmente de uma biblioteca para outra se o requisito surgir.
Sempre que atualizo o Java para uma nova versão, geralmente funciona bem porque o Java é um componente extremamente estável, mesmo nas principais atualizações de versão. E também, todos os servidores que eu tenho estão executando a mesma versão Java. Nem todo cliente está executando a mesma implementação JavaScript.
No lado do cliente, não posso escolher componentes estáveis. Os fabricantes de navegadores me forçarão a escolher JavaScript, uma linguagem que particularmente não gosto, mas que sou forçada a usar. (E não me fale sobre idiomas compilados em JavaScript, eles são horríveis!) A implementação de JavaScript em todos os navegadores é diferente. Isso significa que é um inferno total testar meu produto com todas as versões de navegadores compatíveis.
Minha solução? Eu executo o máximo de processamento possível no lado do servidor, e o lado do cliente é apenas um invólucro leve que envia dados ao servidor e recebe dados do servidor na forma de fragmentos JSON e HTML. Evite XML; use JSON em vez disso.
Eu não faço modelagem no lado do cliente; Renderizo o conteúdo no servidor em um fragmento HTML que atribuo usando o .innerHTML
atributo a vários elementos de espaço reservado no lado do cliente. Isso mantém a pilha de tecnologia o mais simples possível, porque não preciso de dois mecanismos de modelo (um Java e um JavaScript).
A desvantagem é obviamente a latência da velocidade da luz; meio segundo de latência não é incomum entre os continentes.
Considere que seus clientes hoje em dia podem ser smartphones. Os smartphones têm uma autonomia limitada da bateria; portanto, se você estiver fazendo cálculos pesados, é melhor transferi-los para seus servidores. No entanto, coisas simples podem ser mais eficientes em termos de energia quando feitas no lado do cliente, pois assim você pode evitar o acesso por rádio. Mas o argumento principal, estabilidade, pode significar que realmente faz sentido transferir até mesmo a computação simples para o servidor.
Como adendo, como já observado em algumas respostas, você também ganha segurança . Se a lógica do aplicativo estiver inteiramente do lado do cliente, alguém pode, por exemplo, definir um preço para qualquer coisa que comprar na sua loja virtual.