An async function is non-blocking. await is blocking within the async function. Top-level await basically boils down to a proposal to wrap your entire app inside an async function.
It's not difficult to imagine some code nested deep in some NPM module completely changing the load behaviour of your app without you knowing.
"Any module with a dependency on data that it needs to execute will have to wait for that data before it executes."
That's a good thing.
Doesn't the same risk apply if one of the modules in the graph declaratively imports a module hosted on a slow external CDN?
As far as I'm concerned, an explicit call to `ModuleB.loadData()` is far better than having it happen as part of module loading, without me necessarily being aware of it. Right now, module loading is assured to be synchronous, and losing that certainty seems like a bad idea to me.