this post was submitted on 01 Apr 2025
52 points (94.8% liked)

Asklemmy

47161 readers
683 users here now

A loosely moderated place to ask open-ended questions

Search asklemmy 🔍

If your post meets the following criteria, it's welcome here!

  1. Open-ended question
  2. Not offensive: at this point, we do not have the bandwidth to moderate overtly political discussions. Assume best intent and be excellent to each other.
  3. Not regarding using or support for Lemmy: context, see the list of support communities and tools for finding communities below
  4. Not ad nauseam inducing: please make sure it is a question that would be new to most members
  5. An actual topic of discussion

Looking for support?

Looking for a community?

~Icon~ ~by~ ~@Double_[email protected]~

founded 6 years ago
MODERATORS
 

Here sucks is in the sense of suckless philosophy, I don't think everybody likes the suckless movement but I've seen that many people, me included, don't like how modern web apps look like (messenger and tiktok are like the worst). So if I want to make interactive web apps, what are the better technologies to not make the web shittier ?

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 11 points 2 days ago (1 children)

Well, part of the problem is that web apps themselves are kind of alien on the web. The web is generally document-based. Web apps take the document format and try to turn it into something it's not.
There's a way to not do the JavaScript, but it doesn't fix things being document-based and it can be argued that it makes other things worse in some respects.

I'm talking about WebAssembly. Basically, you can write your web app in HTML+CSS+Rust and then the Rust part is compiled to WebAssembly, which then takes the role that JavaScript would normally take. It does not have to be Rust, lots of languages can be compiled to WebAssembly, but Rust has the most mature ecosystem for that, as far as I'm aware.

In principle, it is also possible to use WebAssembly to render directly to a pixel buffer, but that's really rather heavyweight and not terribly responsive, so not generally done, unless you implement a game¹ or similar.
Alright, so back to the document mangling approach. There's various frameworks available for Rust. I've used Leptos so far. There's also Dioxus and Yew and probably others.

Advantages:

  • Don't have to write JS.
  • Can write Rust. Rust has some concepts that mesh really well with frontend dev, like the Result and Option types for error handling, which you can pass directly to your rendering stack and it can show either the data or the error (or nothing).
  • Can use the same language in backend and frontend and therefore also get compile-time checks that the two work together.

Disadvantages:

  • The ecosystem is young. You will find barely a fraction of the component libraries as you can find for JS.
  • Rust also has concepts which don't mesh well with frontend dev, like the whole memory management concept. Those frameworks bypass that or make use of it in clever ways, but things can be a bit peculiar or overly complex at times.
  • WebAssembly is sent to the browser in one big blob, because it's a compiled program. This means you get somewhat of a loading time when first loading the web app. There's ways to mitigate that with "hydration" strategies, but yeah, still a thing.
  • While JS is often minimized/uglified and therefore not readable anyways, WebAssembly makes that even more of a reality, because it is essentially assembly code that's sent to the browser. It does still call the same APIs under the hood as JS does, so content blocking shouldn't be affected, but yeah, can't try to understand the code itself. This can also make debugging during development somewhat more painful.
  • Well, and it's also yet another web standard that browsers have to support. It doesn't make browsers simpler in the sense that suckless would like.

I've listed a lot of disadvantages, so just to point out that, yes, to me, the advantages are absolutely worth it. But I can totally understand, if others see that differently.

¹) See, for example, Bevy and this UI example in particular.

[–] [email protected] 3 points 2 days ago (1 children)

Webassemby is still limited to a single thread as far as I'm aware, so it's not a full runtime for the language you are writing in as anything using threads behind the scenes tends to fall over unexpectedly at runtime.

Its also an absolute bastard to debug (young ecosystem)

[–] [email protected] 3 points 2 days ago

Yeah, I doubt WebAssembly when executed in a browser will become multi-threaded anytime soon, since JavaScript is single-threaded just as well. If you need multiple threads, you need to use web workers. Haven't done anything with those yet, but I'd assume them to be usable from WebAssembly as well, since the whole JavaScript API seems to be accessible.

Well, and in Rust, I'm pretty sure the runtime that's typically used for async stuff (tokio) will produce a compile error, if you try to enable the "multi-thread" feature flag on the WebAssembly target.
But yeah, might be more of a problem with other languages.