I'll chime in with my experience in maintaining/porting #godotengine to the Web.

The main issue is, non-standard standards.
I.e. the bad habit the web has taken to require devs to adopt new APIs that are not finalized and will break in a matter of years.
Examples👇 https://twitter.com/FlohOfWoe/status/1388839994580733959
- The Gamepad API worked flawlessly until now, but now requires SecureContext, breaking old applications.
- The WebAudio API was based on ScriptProcessorNode, which was then deprecated and will break old applications.
- The WebAudio API is now based on AudioWorklet, but it's still not finalized, and as someone reported is only usable with wasm-threads, so I expect it to change again (breaking more applications).
- The Fetch API is the new alternative to XMLHTTPRequest, but we lost the ability to detect content size when content encoding is not specified the moment the content-length header was whitelisted for CORS, but the content-encoding was not (breaking old applications).
- I just won't start talking about WebGPU, since that's basically not a standard yet, as we have little clue on how the final API will be.
- WASM threads looked great, but as someone mentioned, the new header requirement results in very little support from distributors.
Every API on the Web wants to be asynchronous, making ports a total pain.
Async storage, async network, async fullscreen, async mouse lock, async inputs, async clipboard... async game loop.
Networking is fun, WebSocket is actually great (still async, but great)... WebRTC... what a mess. The "One library" is an elephant that only big companies have the resources to build and maintain, any other native library is famous for incompatibilities with "The One library".
And then there is the question of the game loop, for which you have to use `requestAnimationFrame` but gets disabled when the window loses focus, so your game loop stops. So what? You use setInterval? No way, that gets throttled too.
There's probably more I'm forgetting, but this is a good overview.
Oh yeah, there was more, IME support is just a total s**t-show. Incompatibilities everywhere, an only works on Input/TextArea, not on `canvas` (which is where we MUST draw).
How could I forget?!
We still don't have an API for "soft keyboards", something that's been popular for so long it's starting to look old 🤔
You can follow @falessandrelli.
Tip: mention @twtextapp on a Twitter thread with the keyword “unroll” to get a link to it.

Latest Threads Unrolled: