I have a similar project that I'm working on, with Express as the backend and Angular as the frontend. I've structured the project as a monorepo using Lerna. So there's a top-level folder with a packages/ folder that then contains several subprojects folders. Each subproject is itself an NPM package. Along with server and client projects, I have a common project for shared code.
Lerna has a bootstrap command that wires up links between your subprojects. It also deals with shared NPM dependencies. The whole monorepo is committed to a single Git repository but each subproject is published as its own scoped NPM module (this is an optional step though).
For a more advanced setup, you can also host each subproject using Docker. I have made each subproject that will act as a server into a Docker image. I then use Docker Compose to orchestrate setting up a stack containing each of the server. nginx acts a proxy layer between all of the servers.
├── monorepo
│ ├── packages
│ ├── api
│ ├── Dockerfile
│ └── package.json
│ ├── common
│ └── package.json
│ ├── db
│ ├── Dockerfile
│ └── package.json
│ ├── nginx
│ ├── Dockerfile
│ └── package.json
│ └── ui
│ ├── Dockerfile
│ └── package.json
│ ├── docker-compose.yml
│ ├── lerna.json
│ ├── package.json
│ └── tsconfig.json