Avoid that design and using a "libraries over frameworks" approach solves this problem but has other tradeoffs obviously, although a good ecosystem of libraries that have designed for interop solves most of them. These library ecosystems aren't the norm though, and the lure of "I'm going to package these together in a framework, that does things the way I like, and then brand it and help my career" for the library devs is always there (see Flask in Python for example, it was the "unDjango" until it got popular and now it's just another framework)
The idea being that each small piece is easier to leave alone for long periods of time, and, should it ever become impossible to leave it alone, whether for security reasons or something else, updating it or replacing it is much easier than doing the same for a big tightly coupled pile of components.