I'm currently doing this with Next.js with a "custom server". Allows for sharing TypeScript interfaces/types and the express instance quite easily. It's just one big vscode project. But custom servers are frowned upon and will probably disappear in future versions which will make things slightly more complicated.
InertiaJS is an idea/implementation I like and its way of mitigating this issue of meta-framework dependence.