When I'm developing large applications I break the server up into independent micro-services, and I put the frontend code in its own repository or repositories. The tools you use to make sure everything is connected are integration tests, unit tests, and end to end tests. As far as the bonus question; if you have multiple frontend applications that share code, the frontend itself can be broken up into independent modules, which you can manage via a private npm repository. Keeping everything together and monolithic makes it difficult to reason about how the whole thing works together. By breaking things up you create cohesive chunks of functionality that can be worked on independently and reasoned about easily.