I've come to understand what's happening in frontend's decade-long failure to deliver decent user experiences as a sort of epistemic closure. I'm calling it "frameworkism", and the epicenter is now React.

Here's a lot of words on why we should all reject it, and what the post-React world should look like:

https://infrequently.org/2024/11/if-not-react-then-what/

If Not React, Then What?

Frameworkism is now the dominant creed of today's frontend discourse, and it's bullshit. We owe it to ourselves and to our users to reject dogma and embrace engineering as a discipline that strives to serve users first and foremost.

Alex Russell

@slightlyoff I've being doing this for so long (#webdev). I have an inkling that everytime this conversation comes up and the person doing the "front end frameworks are killing us" cautioning - can't or won't actually recommend an alternative - it's because it will never be possible.

Not until the JS baked directly into the browser stops sucking so badly.

It's bandaids on top of wounds on top of bandaids.

#Javascript

@slightlyoff Until we can write *real*, performant frameworks in Native-JS or in Typescript directly in the browser that have better DOM integration.... we will never escape this.

Userland keeps patching the problem with the next bandaid (frameworks, transpilers, livewire, HTMX, etc).... when only the browsers and the creaking, sluggish, joke of JS browser standards can actually fix it.

Browser tech jumped the shark so many years ago I don't know what the damn hold up is.

@slightlyoff They should take the approach #PHP has taken over the last decade - rapid release of modernizing updates, eventually leaving the old behind.

Honestly I'm shocked with browsers being essentially down to a single monopoly now... why JS is still *almost* the same as it was 15 years ago! 🤦‍♀️

Just fix it #Chromium.... ffs.

@syntaxseed Progress on the web is rate-limited by Apple. If you want that to change (i.e., by Apple facing enough competition that it is forced to staff WebKit above starvation levels), supporting @owa is the most effective thing you can do.
@slightlyoff @syntaxseed I’d also add that it also takes developers to contributing back to standards. It’s not a black box. GitHub was feeding back to Web Standards from the beginning. Exactly what is lacking, and what platform-compatible prototypes are out there—were what browsers asked of my old team the most. GH JS built polyfills, sent patches, demoed how 50 lines of code can be reduced to a one liner if an API was exposed. Things got implemented. The web got better.
@syntaxseed @slightlyoff I would argue JavaScript is vastly different than 15 years ago. Sure all the old stuff still works, but 15 years ago people pretty much used jQuery for everything outside of large orgs like Google.

@syntaxseed @slightlyoff Browsers have done that with #CSS. I'd argue all CSS frameworks are obsolete now with how far CSS had come. But people still reach for tailwind or whatever, despite it being built for a CSS that doesn't exist anymore.

For JS, same problem but it's React. For #PHP, it's #Laravel.

Once a critical mass of people use something, it's almost impossible to get them to migrate to something better, because the network effect costs are too high.

And here we are.

@Crell @syntaxseed @slightlyoff

You should check out Vanilla Extract to see what a good CSS build system can offer you. Think of it like a superset over regular CSS that gives you more confidence in your CSS because of the type system.

Building on that foundation they offer many variations on how to structure your CSS code.

- Sprinkles: atomic css classes
- Recipes: easy configuration of styles based on component props

https://vanilla-extract.style/

vanilla-extract — Zero-runtime Stylesheets-in-TypeScript.

Zero-runtime Stylesheets-in-TypeScript.

vanilla-extract

@hmiron @syntaxseed @slightlyoff That offers nothing I want, as I don't use TypeScript.

I don't want a CSS superset. CSS is now good enough that it doesn't need a superset. The only pre-processing that has any value anymore is whitespace stripping for better compression, and I'm not even convinced that's worth it these days. 🙂

@Crell @hmiron @syntaxseed @slightlyoff There is one good post-processing, and it is un-nesting of CSS selectors. They break the experience on relatively new browsers in most possibly not so progressive enhancement scenarios.
@Crell @syntaxseed @slightlyoff This thread is getting a bit all over the place, but I feel like you're definitely missing the point of what Tailwind is trying to do.

@syntaxseed @slightlyoff

> Not until the JS baked directly into the browser stops sucking so badly.

I've heard this before, and while I don't disagree, the goal post for "good js" always seems to be moving.

Granted it's been ages since I wrote front end, one big issue we had was cross browser compatible. It seems that's mostly a moot point. Yet the sentiment remains.

@syntaxseed @slightlyoff

I very rarely like frameworks. I find they are to focused and ridged. They only work when my problem is exactly their problem.

I think "good js" in the browser will always be a moving target.

I think it will be the responsibility of frameworks (or fingers crossed small libs) to do the exploratory work.

@UkiahSmith @syntaxseed @slightlyoff cross-browser compat for modern JS is basically a solved problem now. But there are a few gaps left in core browser API’s: easy and native same-document routing (including lazy loading), native reactive templating (prop and event binding, dom-diffing) and built-in typescript. Everything else that client-side frameworks do already has reasonable alternatives that are supported everywhere.
@joeri_s @UkiahSmith @syntaxseed @slightlyoff So basically what React and its ecosystem is providing right now and in the meantime. Crazy right? 😬
@UkiahSmith @syntaxseed @slightlyoff Just bake jQuery UI in the browser!
3 years later: these UI primitives baked in the browser are terrible, here is a much better userland alternative.

@slightlyoff I don't see React adoption reducing at all. I keep noticing so much next.js usage in the job market (SMEs), which is surprising to me even within React ecosystem (I thought esbuild or Vite setup would be top usage).

It's marketing! FB/Meta/Vercel marketing keeps winning, and developers love packaged solutions (which actually is way way over what they need and keeps upgrading major versions every 5 days).

@slightlyoff

Tremendous article, as always. Thanks for all you do.

"Graciously accept the resignations of PMs who decide managing products is not in their wheelhouse."

I can understand the devs, tech leads etc who are part of frameworkism. But what role do these sorts of PMs even currently play, given that, in some sense, their role should be framework-agnostic...?

Do I just not have a proper conception of what a PM does? Or did the mass layoffs get the wrong folks...?

@nickchomey Being a rubber stamp is easy! And there are always more meetings to go to and decks to construct and offsites to lead and bug backlogs to triage. Those things *could* be part of managing a product, but it's also possible to do all of them and not manage anything affirmatively.

@slightlyoff

gotcha - the issue is not that the PMs are explicitly frameworkists themselves, but that they're not actually managing/holding to account the frameworkists.

(Which, I suppose, makes them frameworkists...)

Thanks!

If Not React, Then What?

Frameworkism is now the dominant creed of today's frontend discourse, and it's bullshit. We owe it to ourselves and to our users to reject dogma and embrace engineering as a discipline that strives to serve users first and foremost.

Alex Russell
@nickchomey Cheers, will fix!

@slightlyoff Also, the link to the Harry Frankfurt - On Bullshit essay seems to be dead. Here's one that hopefully will live longer

https://archive.org/details/on-bullshit-by-harry-frankfurt

On Bullshit by Harry Frankfurt : Harry Frankfurt : Free Download, Borrow, and Streaming : Internet Archive

A treatise on rhetorical bullshit.

Internet Archive
@slightlyoff I totally agree and what's why I built #PieFed the way I did - https://join.piefed.social
PieFed - Open Source Federated Forum

A link aggregator, a forum, a hub of social interaction and information, built for the fediverse.

PieFed
@slightlyoff Working with #phoenixframework LiveViews is such a breath of fresh air. No JS, no npm dependencies, tiny footprint, but I can go seamlessly between pure HTML/CSS pages and fully interactive SPAs while doing everything on the server side.

@slightlyoff Great comprehensive work!

I know some companies, which are highly invested in React and SPA architecture for quiet well-taken for that web applications, but then for another simpler almost content -only web pages they again use the same stack because of the already developed React-based UI kit.

So, it's another portion of logic behind such decisions.

@slightlyoff also not sure that provide alternatives for React Native as Cordova and another web-based solutions is performance wise. Especially in the light of migration of React Native to the new interop-based architecture. Yep, it has JS bloat overhead, but still on top of native components.

But it is only true if we develop React components deligently, otherwise your mobile application with all your native components will strive because of JS side and drain battery enormously.

@slightlyoff one downside of the persistent myth that programmers are inherently smart and thus immune to soft issues like feelings and marketing is that there's basically no industry-wide defense against completely meaningless terminology like "modern" being used as a substitute for figuring out whether something is fit for purpose.
@dotstdy @slightlyoff This is why I am turned off by projects describing themselves as "modern". I have a years-old note to blog about this in my TODOs tracker...
@sethmlarson
how wonderfully recursively meta...
@sethmlarson @dotstdy @slightlyoff "What problem does it solve?" is a closely related question that is skipped far too often (https://www.curiousefficiency.org/posts/2016/08/what-problem-does-it-solve/ is a longer musing on that)
What problem does it solve?

One of the more puzzling aspects of Python for newcomers to the language is the stark usability differences between the standard library's urllib module and the popular (and well-recommended) third pa

Curious Efficiency
@dotstdy @slightlyoff one needs only look at the success of mongodb's marketing, turning them into a huge player despite it being incredibly bad for the first decade or so. (Probably still is)
@dotstdy @slightlyoff try also "simple", "opinionated" and "awesome" (these words arranged in chronological order of their popularity)
@dotstdy @slightlyoff part of that myth I think is the pernicious underlying idea that we must move fast or die. If we operate with that as unquestioned truth, then we must also grab and use premade looks-close-enough things with little consideration.

@maphew @dotstdy And it doesn't even work! I sit with *so many* teams that are beached on the shores of unshippability because their "move fast" stacks only provided a one-time burst of acceleration, rather than sustainable gains in velocity and momentum.

Adding the time folks have to spend remediating these made-up problems to the cost side of the equation makes these "move fast" systems look like what they are: irresponsibily marketed tools for experts in the hands of n00bs.

@dotstdy @slightlyoff See also: programmers who insist on using ambiguous or incorrect definitions of MB and GB because they just don't like MiB and GiB.
@slightlyoff Excellent as usual, thank you. Particularly useful for us who lean more on the BE side
@slightlyoff your footnotes are the best part of the article!
@slightlyoff I’m eager to dig into your post soon. I run a large React meetup in Dallas, and I keep mentioning to the members that I’m mentally gearing up for a talk titled something like “Why You Shouldn’t Use React”. Might be my last event as the organizer for that crew, though. 😝
@drumsensei Honestly, we need people to support folks through the transition away. It's going to operate as these things usually do: permission structures to make change possible based on past affiliations. So you can outsource the pyrotechnics to someone like me and help folks in the aftermath. They will need it.
@slightlyoff Thanks for writing this. I really liked the breakdown of different product domains and their relationships to SPA/SSR apps.
@bmac Reviewers mentioned it as a shortcoming in drafts, so all thanks to them for getting me to flesh those out, particularly @ksylor.
@slightlyoff One thing I've been struggling with at Etsy is that while Preact is a fantastic solution if you want to use React syntax but want to shave some KB, over time, our JS bundles have still *significantly* bloated from all of the JSX and clientside logic. Several years after @ksylor introduced "islands", I've had to introduce the term "continents" to describe when people are building full-page "islands" that often completely fail SSR and wind up in a "worst of both worlds" situation.
@slightlyoff @ksylor Saving a ton of KB off of your initial payload by using Preact is great, but if you're shipping hundreds of KB of gzipped JSX for each page, the bundle size win eventually becomes relatively minimal. And now we've gained a culture of building "highly interactive" functionality with Preact... but the highly interactive stuff is often just forms with fancy interactions and animations. Mostly it seems like our eng just desperately don't want to use PHP & Mustache templates.
@sangster @ksylor The original library switch isn't the whole game, as you say. It's a chance to change the mindset, start to take client bytes seriously, etc.
@slightlyoff Your articles are really interesting, thanks. As someone who is studying and getting ready to get his first job as a web developer I still feel like there's no way of not learning how to build SPAs with React, unfortunately. Just have a look on any jobs ads platform, on each and every job offer for either full stack or front end dev positions. React is always a requirement. From my current point of view, there's yet no way out of it, unfortunately. But it's nice to be aware.

@slightlyoff This prompted me to think a bit more of how bundlers play a role in the bad perf outcomes of frontend projects, and my conclusion is that they currently are like power tools without appropriate safety features:
https://hachyderm.io/@fvsch/113583490410827935

(also cross-posted on bluesky: https://bsky.app/profile/fvsch.com/post/3lcd7taxvh22i)

Florens Verschelde (@[email protected])

Spicy opinion: JS bundler authors have messed up big time by growing the ability to add JS code to websites without providing similarly powerful tools to control how, why and by how much you add code (let alone to help you drive numbers down). Great power with no responsibility.

Hachyderm.io
@slightlyoff That first footnote is an article all on its own, holy crap.
@slightlyoff sent this to my workplace's Slack, in hopes that I'll never have to learn or write anything React in 2025. thanks for writing and sharing it with us!
@joshavanier Thanks, that's kind, but if my losing streak on this front is anything to go by, perhaps pin your hopes on someone else's persuasive abilities. 😅
@slightlyoff actually it's going quite well! the discussion has been opened and the team seems open to the idea of adopting an alternative framework; just gotta look at feasibility as unfortunately we can't stop the train to replace the engine at this point (not without irking clients) 

@joshavanier Remember: the important thing isn't the framework, it's the chance switching gives you to rethink architecture and values.

Bonne chance!

@slightlyoff

Could you explain “epistemic closure” cuz I can’t find a signified to that sign.