WebAssembly: Yes, but for What?
Native apps vs web and user experience
- Several commenters prefer native mobile apps for most tasks; others deliberately avoid them and stick to browser apps.
- Arguments for native: better integration with OS features (especially accessibility), potentially lower power/memory use.
- Arguments for web: stronger sandboxing, easier inspection/modification (F12, ad blockers), multi-tab workflows, and extensions like Vimium.
- Some view the web as the “last democratic platform,” contrasting it with app stores, “crapware,” and opaque notification/ads controls.
Where WebAssembly is useful today
- Strong agreement that Wasm is good for:
- Performance‑critical inner loops (e.g., Figma’s core, image/video processing, parts of Google Sheets, Photoshop, Prime Video).
- Porting large native codebases (e.g., LibreOffice/ZetaOffice, SQLite, Doom, 8‑bit emulators).
- Plugin/extension systems and untrusted code: fine‑grained sandboxing, no implicit I/O, revocable network access, and clear host–guest boundaries.
- For typical UI-heavy web apps, many think JS/TS remains more practical; DOM-based UIs in Wasm are seen as painful.
Wasm beyond the browser (server, cloud, multi‑target)
- Some see Wasm as a “universal, sandboxed VM” useful for:
- Running customer code on servers or at the edge (wasmCloud, Cloudflare Workers, workflow engines).
- Cross‑platform binaries (abstracting over CPU/OS; alternative to Docker/JVM, or to universal binaries).
- Embedded/plugin scenarios (e.g., on ESP32) where isolation and resource limits matter.
- Others are skeptical, seeing it as “reinventing the JVM/Docker,” often driven by JS/Web devs not wanting to learn other stacks.
Missing pieces, complexity, and standards friction
- Complaints about slow, bureaucratic standardization: string interop, DOM access, Wasm exception handling, and shared-memory threading are seen as incomplete or fragmented.
- DOM access from Wasm still requires JS “glue”; some argue browser APIs aren’t first-class in Wasm, limiting its appeal for general web apps.
- WASI and the component model are promising but immature; different runtimes support different subsets, making portability hard.
- Tooling pain points: Emscripten standalone builds, lack of consistent setjmp/longjmp or EH support, weak wasm32 library compatibility, especially in Rust’s async ecosystem.
Language choices and Rust
- Debate over JS/TS vs other languages: JS is called “great for apps” by some and “unsafe/unergonomic scripting glue” by others.
- Rust is widely cited as a strong Wasm target and “write once, bind everywhere” vehicle, though still considered niche compared to mainstream managed languages.
- Some projects use Rust+Wasm merely as a packaging/interop layer, preferring direct native bindings when good options (e.g. PyO3) exist.
Real‑world project experiences
- C#/Blazor-in-Wasm: benefits from shared C# across client/server and small teams, but suffers from large binaries, slow startup, and JS/DOM interop friction; server-side Blazor might have been a better fit.
- A Rust+Wasm backend on Cloudflare Workers: author reports severe ecosystem friction (libraries not compiling to wasm32, Tokio incompatibilities), unclear standards, and runtime limitations (e.g., no time API), but values the clarity and discipline imposed by constraints.
- Other SDKs (TypeScript, Go) successfully embed Rust/Wasm cores but require careful runtime pooling and manual bindings.