https://gist.github.com/joepie91/bca2fda868c1e8b2c2caf76af7d...
https://gist.github.com/joepie91/bca2fda868c1e8b2c2caf76af7d...
It's not clear to me how you get top-level await with CJS with significant drawbacks OR breaking changes that would just end up back up in ESM land.
With blocking require there's of course no problem with top level await. And having a thenable import doesn't even need any language level support.
Yeah, you can parallelize static imports. But you can just as well doing this by having a semantically blocking require that is free to of course do whatever it wants as long as the execution is sequential in effect.
If there's some dynamic trickery the implementation can't figure out, just revert to blocking and nag in the console.
Saying that you need declarative for static analysis is like saying tail call optimization is impossible.
And if a stricter module system would be still required, it could have been quite easy to make compatible with, well, require.
import('this').then(r => that())
rather suck.But this problem has been solved by modulepreload[0], also natively supported in the browser, which lets you specify the modules upfront in the HTML, avoiding the need for additional roundtrips. Tooling could help with generating the list of preloads but is not necessary.
[0] https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes...
I'm all for development without a compilation step. I've written hacks to resolve node modules and transpile in browser to avoid compilation. Implementing prefetching even with this hack would be less hacky than going full circle and injecting HTML tags to do the prefetching.
ESM is like XML: The problem it solves is not hard, and it doesn't solve the problem well. Actually ESM it isn't even close to solving the problem after trying for almost 15 years.
Yes, all but the simplest applications currently use the tooling-based solutions, because there was no other way. But now that we have an alternative solution, perhaps all but the most complex applications will manage just fine without tooling, using just the built-in module support.
A simple sync and/or async function/statement would had solved the problem of having modules in the browser. E.g. RequireJS solved this in 2010 or so. There were straightforward proposals for native modules even before this.
Yes. This is exactly what I want. It's helpful for simple apps, and without all the toolchain complexity more apps can be simple.
ES modules solve the problems I care about:
1) Eliminating the extra roundtrips.
2) Nice and simple syntax.
3) Tooling not required.
2) ESM syntax is objectively more complicated than CJS while managing to be less expressive. It's one of the most complicated module syntaxes out there. Subjectively it's not nice at all, much due to the objective difference.