Eu venho do PHP e Laravel + jQuery. O frontend era quadrado, formulário básico e tal. A internet evoluiu e jQuery se tornou obsoleto.
O Laravel me encantou por ser fácil e intuitivo, documentação muito bem organizada e escrita, e em relação a estrutura e código com design patterns aplicado do jeito certo tal qual Facade, Singleton, Builders (...) me faz apaixonar pelo framework.
Mas precisava usar algum framework de JavaScript e aposentar o jQuery, e testei vue.js e Next.js e vou te dizer: mesmo com typescript é decepcionante! Todo ecossistema do JavaScript é uma completa gambiarra, pior, é um caos!
Muitas dependencias de pequenos mantenedores. Um package para listar arquivos de uma pasta, outro package para criar um arquivo...
Tinha o NPM, e ao invés de melhorar o NPM, criaram o PNPM, depois dezenas de gerenciadores de pacotes.
Javascript tem em si o espirito das distro linux. Todos os dias alguem faz fork do Ubuntu e melhora algo, e ao invés de fazer (ou aceitar) uma pull request, e a consequencia é muda o nome (Kubuntu por exemplo) e dizer ser um sistema operacional novo. O ponto é que cada um quer ter seu 'framework' ao invés de contribuir com (ou aceitar contribuição em) um projeto já existente.
A comunidade de JavaScript constroem packages e frameworks igual ao dono dessa casa. Sem estudo, sem planejamento, um andar de cada vez, e quando precisar ampliar, ao invés de reestruturar, o negócio é "se a casa não caiu, dá pra morar dentro".
Desconhecem orientação a objetos, DRY, e todos os padrões de projeto.
Eu sei que estou sendo dramático, mas não estou exagerando...
Acho que todos que codaram node usaram Prisma ao menos uma vez, e na documentação deles, na seção de boas práticas, olha como eles definem Singleton:
import { PrismaClient } from '@prisma/client'
const prismaClientSingleton = () => {
return new PrismaClient()
}
declare const globalThis: {
prismaGlobal: ReturnType<typeof prismaClientSingleton>;
} & typeof global;
const prisma = globalThis.prismaGlobal ?? prismaClientSingleton()
export default prisma
if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma
Agora vejam o como é um Singleton de verdade que implementei em um projeto que estou trabalhando:
import { PrismaClient } from "@prisma/client";
export class PrismaClientSingleton {
protected static instance: PrismaClient;
public static getInstance() {
if (!PrismaClientSingleton.instance) {
PrismaClientSingleton.instance = new PrismaClient();
}
return PrismaClientSingleton.instance;
}
}
Vocês podem conferir sobre Singleton aqui https://refactoring.guru/pt-br/design-patterns/singleton.
A galera do javascript diz que não é bem assim, que estou exagerando. Mas a conclusão que passei a ter é que essa galera nunca programou com organização, estão acostumados a fazer scripts e gambiarra, e desconhecem algo melhor estruturado. E como meu caminho foi de vir algo mais estruturado, para algo mais caótico deu ruim.
Eu programo typescript, Next.js, Vue.js e o que mais surgir pela demanda da empresa que trabalho, mas não é prazeroso codar nada feito em javascript. É tudo muito penoso.
Eu não odeio nenhuma linguagem de programação (exceto Java por trauma), pois cada uma delas é ótima em resolver problemas especificos, e sinceramente, javascript tem potencial para ser a melhor, mas infelizmente javascript sofre desse mal.