[Dúvida] Subindo aplicação com Node e React

Fiz uma aplicação chamada teste com uma subpasta chamada backend, com os arquivos de servidor do node js com express, e outra subpasta da pasta teste, chamada frontend, está com os arquivos do react.

Para rodar a aplicação eu tenho que usar dois terminais, um para dar cd backend, npm run backend, e o segundo terminal para cd frontend, npm run start.

Dessa maneira consegui desenvolver em ambiente local minha aplicação de maneira fácil.

Porém ao subir em um servidor de hospedagem, sempre falha o processo de iniciar a aplicação, pesquisando, entendi que o erro é pq precisa digitar cd para mostrar o caminho das pastas onde estão localizados, e que deveria ser um único comando para iniciar a aplicação, em vez de dois, com um para o frontend e o outro para o backend.

Então a minha dúvida é sobre se meu entendimento sobre o processo de subir a aplicação para a internet está correto? Se sim, como eu monto a estrutura de pastas para a aplicação funcionar? Sugestão de artigos ou vídeos que exploram o tema são muito bem vindos, no momento eu estou bastante perdido sobre os próximos passos.

Obs. Sou iniciante em ambos os frameworks, React e Express, mas tenho bastante conhecimento em Javascript, então escrever as funções e componentes foi relativamente fácil.

E estou usando o Render para subir a aplicação.

Se eu entendi o post corretamente você tem uma estrutura assim:

Teste/
  -- Backend
    -- {content}
  -- Frontend
    -- {content}

e precisa iniciar ambos manualmente.

Provavelmente a hospedagem espera que quando rode npm run start o script de start inicialize ambas as dependencias juntas tanto do express quanto do react.

Supondo que esteja tudo corretamente construído, e você tenha um inicializador próprio para cada componente. Porque não criar tipo um arquivo start.js que seria o inicializador.

Dessa forma, você passaria o caminho para ambas as funções de inicialização de forma que ambas iniciem juntas.

const { spawn } = require('child_process');

function startProcess(name, command, args) {
    const process = spawn(command, args, { stdio: 'inherit', shell: true });
    
    process.on('close', code => {
        console.log(`${name} process exited with code ${code}`);
    });
    
    process.on('error', err => {
        console.error(`Failed to start ${name} process:`, err);
    });
}

startProcess('Backend', 'npm', ['run', 'start', '--prefix', 'backend']);

startProcess('Frontend', 'npm', ['start', '--prefix', 'frontend']);

provavelmente você poderia querer adicionar de forma que cada instancia suba com em um processo diferente.


No meu caso, eu recomendaria fortemente o uso de Docker ou Podman, mas como é apenas um teste simples usar esse script de inicialização deve funcionar