simonw
4 days ago
If you've found web development frustrating over the past 5-10 years, here's something that worked great for me: give yourself permission to avoid any form of frontend build system (so no npm/React/TypeScript/JSX/Babel/etc) and code in HTML and JavaScript like it's 2009.
The joy came flooding back to me! It turns out browser APIs are really good now.
You don't even need jQuery to paper over the gaps any more - use document.querySelectorAll() and fetch() directly and see how much value you can build with a few dozen lines of code.
icameron
4 days ago
I absolutely completely agree and do this myself. Unfortunately all of my peers and bosses don’t see the value, and the shop is overrun with trend chasing resume driven developers. React/node/next hosting on aws and containers and it will all be out of date next year. Everything we do has such low amount of users we don’t need anything but a single VPS and simple backend. Many of my apps from 10 years ago still run the same rails and jQuery just fine. Actually upgrading the rails versions and pulling out the jQuery dependencies is easy now too. It’s just so much simpler and works perfectly. But this is seen as detrimental to my career. It’s not appreciated. I sound like a dinosaur to the bosses and coworkers. But I enjoy it and my shit works fine. I’m saving so much time and hosting costs. Everything runs on a $40 VPS.
jonas21
3 days ago
> React/node/next hosting on aws and containers and it will all be out of date next year.
All of these things except Next.js are over 10 years old now (Next is 8). What makes you think they'll be out of date next year?
cookiengineer
3 days ago
The point of your opponent's argument is that measured age should be an indicator of maturity and stability of frameworks and toolchains.
In JavaScript, it is not. So you claiming 10 years as a time frame in your response is in bad faith, because you certainly know that code written 10 years ago is 100% incompatible with the modern versions of the same frameworks.
hu3
3 days ago
Next.js keeps breaking code so there's that.
shakna
2 days ago
React has broken compatibility about once every two to three years. Next.js feels more like every other day.
These are not stable targets, which means your code is out of date next year.
user
3 days ago
princevegeta89
4 days ago
This is the case at many teams in almost all companies. One sad reality is people want to keep their jobs and so they tend to inflate stacks and codebases so much so that they can "keep working on things" for a long long time.
Sorry to hear your situation but I found there's hardly any point in debating with your team on moving towards simplicity - just better to keep your head down and take that paycheck every 2 weeks.
My goal is to build a microstartup with a small team - and for that I am definitely going to choose the traditional JQuery/HTMX/Turbo setup with a server that renders templates. To hell with React.
exiguus
4 days ago
I understand your perspective. It's similar to AWS services like CloudFront, API Gateway, SQS, and Lambdas—all designed for a microservice architecture that may not be necessary if scaling isn't a priority. The same applies to frameworks and libraries such as Next.js, and even React, Vue, or Angular, in my opinion. Most products and companies are not on the scale of Netflix, Spotify, or Facebook.
This leads me to question why people still use jQuery instead of native JavaScript. From my understanding, jQuery primarily serves as a polyfill. So why jQuery and not native Javascript?
owebmaster
4 days ago
> This leads me to question why people still use jQuery instead of native JavaScript.
Most cases because it is not worth the refactoring to remove jQuery and in a few cases when it is in new project is because the person coding doesn't know to code without it.
princevegeta89
4 days ago
I don't mind adding that 200kb of bundle size, and I'm one of the peeps that feel Jquery is easier to read and less code to write. Just me opinion
jiggawatts
3 days ago
I just saw someone put an expensive cloud API management product in between the Angular and API parts of a tiny monolith app.
Not even a shared API management service — dedicated to the app!
It’s insanity.
LtWorf
3 days ago
Good luck hiring people that will agree to that.
princevegeta89
3 days ago
I am not hiring engineers that won't agree to that, actually.
magic_hamster
3 days ago
You are right that you are being efficient and reasonable, but also you are right that you sound like a dinosaur. This is the same for people who cling to C as "this is all I need", possibly producing beautiful efficient code with no VMs or slow interpreters, at the cost of lower cooperation with their colleagues.
The bottom line is your choice of tools is also a social thing. Rejecting the mainstream tooling can be appreciated by some, confuse others, and sadly developers with lower self confidence might even see it as a form of insult.
lcnPylGDnU4H9OF
3 days ago
> You are right that you are being efficient and reasonable
Well, that’s all I needed to hear. What’s the point of not sounding old-fashioned when the new fashion is worse? Considering the social point, why not be more critical when the efficient and reasonable thing is derided by others as old-fashioned? Why not expect those people to update their world view?
satvikpendem
3 days ago
Well you wouldn't do this in a company environment, this is for personal projects only.
AstroBen
4 days ago
Often this works out to a better user experience too
Case in point: this site versus Reddit. HN is 100x snappier. Just a few lines of un-minified plain JS. Reddit crashes the browser on my iPad
andrei_says_
4 days ago
Also CSS! CSS grid, :has(), custom properties and improved browser compatibility. CSS is an amazingly powerful and beautiful language.
Embrace the cascade - check out ITCSS methodology.
Fluid typography and spacing - https://utopia.fyi
simonw
4 days ago
That CSS Minecraft demo from last week was such a beautiful example of how much you can do with `:has()` these days: https://news.ycombinator.com/item?id=44100148
john_the_writer
3 days ago
100%.. tailwinds is a trendy way of adding inline style. I mean it's literally a 1 to 1 translation in most cases. I miss when css was css.
satvikpendem
3 days ago
Now get ready for if() coming soon, then we won't need JS at all, it'll all be Turing complete in HTML and CSS only.
jacques_chester
4 days ago
Grids! I knew I forgot something in my list. Updated.
perrygeo
4 days ago
HTML and Javascript (the vanilla kind, written right into <script> tags like a caveman) is still one of best ways to experiment with UIs. It's not sustainable or maintainable but why do you need those qualities in demo software? I still maintain that a competent developer should be able to bang out an HTML/JS demo faster than they can draw the same complex flow in Figma.
1dom
4 days ago
I agree, modern browsers, CSS and JS can do so much now.
However, the frontend build systems are often complex to do complex state management. Sure, it's possible to reimplement it all and accidentally end up rewriting your own vanilla JS frontend framework, but beyond a point, that's equally as unfun as modern webdev.
It's not hard to shift the state management though, and when I find myself sat with a nice architecture that's formed without a complex frontend system, and with some really simple, uncluttered backend that could probably serve millions of requests a day from a homeserver and internet connection.... it gives me a profound feeling. It's a satisfying and familiar feeling from webdev I enjoyed around 2 decades ago as a teen. It feels like the old way of doing it.
Now, having designed, built and run systems from on-prem, through VPS & VMs onto serverless and static site stuff, doing it the old way again just feels better overall. Maybe it's nostalgia.
But then I feel the reason why we moved away from doing it the old way was because the complexity of the applications needed more efficient ways to make use of relatively limited bandwidth, storage and compute resources at the time. Now these things are all commoditised, and my home desktop and internet connection now has probably the same capabilities as a small datacentre back then... the dreamer in me wants to believe there's no reason why we can't all go back to the old ways of doing it now.
Toritori12
4 days ago
Big part of why FE system are so complex now is because we moved a lot from BE to FE, especially state management. I dont think it is possible to get back to session cookies and keep the "infinite" horizontal scaling that modern BE have.
1dom
4 days ago
Yeah, that's what I was referring to mainly - frontend frameworks to help manage complex state in the browser. If you want complex state in the browser, using vanilla JS to do the same clientside state and rendering becomes tedious: it's easier and more fun to shift it back to the backend.
Not sure I fully understand the second bit. Given how much more powerful servers are now (both physical and abstracted) doesn't that vertical scaling mean horizontal scaling is less necessary? If horizontal scaling is necessary, depending on where in the stack you're scaling, the global consistency offered by modern cloud data stores make it more efficient than ever for lots of servers to exchange a session cookie for state and return fully rendered HTML.
AstroBen
4 days ago
I think it's more nuanced than that. The original React model of UI = f(state) is pretty simple and solved the state management issue. Building your UI with function composition isn't a massive jump in complexity
..but then they kept adding. And adding. And adding. And adding.. and now where are we? Death by a thousand cuts. 10x the complexity for an additional 7% benefit
Toritori12
4 days ago
React is pretty barebones, they keep adding stuff because how ugly the original one looks like and how outdated feels like compared to "modern" ones like Vue, Svelte, etc...
schwartzworld
4 days ago
You don’t have to use all that other stuff. React works best if you prioritize function composition. So much of the ecosystem is there to support the people that don’t know what composition is.
exiguus
4 days ago
> It's not hard to shift the state management though, and when I find myself sat with a nice architecture that's formed without a complex frontend system, and with some really simple, uncluttered backend that could probably serve millions of requests a day from a homeserver and internet connection.... it gives me a profound feeling. It's a satisfying and familiar feeling from webdev I enjoyed around 2 decades ago as a teen. It feels like the old way of doing it.
I recall working on systems where the frontend and backend lacked clear separation, such as through an API layer, and there were no defined contracts outlining these boundaries between different teams or disciplines. This often led to significant challenges and disorganization, necessitating numerous compromises, not just in UX and UI.
Such issues typically arise in projects involving many people and disciplines. Fortunately, libraries like React and frameworks like Next.js have significantly reduced this chaos by facilitating the development of a decoupled frontend and backend.
This was 10 or 15 years ago. Now, with a decoupled front-end and middleware/backend, it's much easier to refactor or even replace services and features. Additionally, it's much easier to integrate new teams and technologies.
john_the_writer
3 days ago
That delineation is all but gone in some apps. Elixir liveview for instance, has not concept of front or backend. It's all socket, so there's no break.
I agreed it makes it harder in places. Like when I (as a be dev) have to write JS hooks, or the JS dev's on the team have to interact with the database.
I find I'd rather code in a RESTfull code base than a socket system. I miss the lines.
danenania
4 days ago
You can do state management easily enough with variables and a rerender function. React et al give you granular DOM updates for performance, but for a simple app it doesn't really matter.
midiguy
4 days ago
Tbh, I would be pretty frustrated developing any non-trivial frontend code without a type system. But I am interested to try dropping frameworks.
AlbinoDrought
4 days ago
For the projects I've written like this, I've been able to get by with simple JSDoc and an IDE that supports them.
Here's a random example: https://dev.to/ingosteinke/using-jsdoc-to-write-better-javas...
65
4 days ago
You can always compile your front end code from Typescript to Javascript with something like esbuild.
sadcodemonkey
3 days ago
Yes! I have to do front-end work occasionally but have been bad at staying on top of trends, so I would resort to jQuery if the requirements aren't super complex. Discovering querySelectorAll() and fetch() eliminated 75% of what I used jQuery for.
In the bad old days, there were a handful of canonical tutorials you used to learn the basics (HTML, CSS, JS) of web dev. Is there anything like that now that starts from those three technologies to build an understanding of web apps?
It seems like it could fill a real need for beginners who want to start by grasping the DNA of the web, so to speak, instead of the complex/sophisticated tools that are popular (not that there's anything wrong with that approach, if you need those skills for a job or project immediately).
notyouraibot
3 days ago
The hate towards modern front end tooling such as React/TS/JSX is nothing but a phase. 10 years ago engineers were hating and raging against PHP, but today they want to bring PHP back and make it a fundamental part of their tooling? They hated writing plain old CSS but now they want it back instead of Tailwind? None of this hate is actually based on any engineering value, sure you can build a little dumb todo app in plain old HTML, CSS and JS and it will work flawlessly, and if that's your goal you better stick to that, React, Next, Webpack, Vite and all these other tools aren't built for that purpose. Its nothing but nostalgia and elitism.
lcnPylGDnU4H9OF
3 days ago
> sure you can build a little dumb todo app in plain old HTML, CSS and JS and it will work flawlessly
This is a weak argument. These technologies can be used along with a database for state persistence to make literally any website in existence. That’s before even mentioning that those three things are how React et al. even work in the first place. What is a React component if not a logical collection of HTML, JS, and CSS?
notyouraibot
2 days ago
Sure you can build anything, hell you can even build websites using C and C++ if you really want to. React exists to make life easier, if working with HTML, JS and CSS was just as easy there would be no reason for React to exist. React and other JS frameworks are aimed at large tech companies that have thousands of engineers working on the same codebase, a framework provides structure, rules that everyone has to follow. Have you tried maintaining a single JS file with 50 functions written by a bunch of engineers? Yeah its not pleasant at all.
dontlaugh
3 days ago
Nobody wants PHP back, though.
roywiggins
3 days ago
Along those lines, I've found Alpine.js a very friendly framework to use for stuff benefits from one. It doesn't have a build system and works alongside vanilla JS or jQuery if you want it.
strogonoff
3 days ago
React does not require a build system. Just alias createElement() to e() and you get the exact same capabilities with a slightly more verbose syntax. I’ve done just that in the past to add small bits of interactivity to vanilla JS client side without modifying anything else.
It is a similar sort of confusion that comes from people thinking React is a Web framework. It’s actually a small library.
simonw
3 days ago
Yeah I've tried that way of using React and I don't like it.
I know it's an unpopular opinion (and the React people swear it's not true) but React is absolutely a framework, not a library!
Adding React to a project fundamentally changes how that project is architected, and affects almost all of the code written for that project going forward.
Trying to use it just as a library very much goes against the grain of how it is commonly used.
strogonoff
3 days ago
> I've tried that way of using React and I don't like it.
I didn’t say you would like it. I just said a build system is not required, contrary to what you wrote. JSX is not an integral part of React, and it is practical to omit it for small cases where interactivity is needed. Contrast it with things like Vue, Qwik, Astro, etc.
> I know it's an unpopular opinion (and the React people swear it's not true) but React is absolutely a framework, not a library
On the contrary, I think it is a very widespread opinion (most of this site will probably claim the same, and opposing comments are often downvoted), but that doesn’t make it less wrong. People form their opinion from encountering various instances of React use in the wild and common patterns of using React, not from what React actually is. Those instances or patterns will necessarily be mostly bad because the barrier of entry to Web development is very low and with LLMs the amount of that bad code only multiplies as of late.
> Adding React to a project fundamentally changes how that project is architected, and affects almost all of the code written for that project going forward.
By that logic, something like fp-ts or Effect is a framework, rather than a set of tools for functional TypeScript programming.
An important quality of a framework is that “you are building within its realm”. Consider Django. You have project scaffolding and structure, batteries are included, and the way you use it is strongly prescriptive or you are fighting the framework.
By contrast, like the above-mentioned Effect, React prescribes little and can be used in vastly different ways and applications not limited to Web. React itself does not even depend on there being DOM or browser context of any kind, I think last I checked it actually had no Web-specific code at all, though I don’t know if RSC changed that. All DOM-related stuff comes from ReactDOM, which is another library.
> Trying to use it just as a library very much goes against the grain of how it is commonly used.
First, if most people use it wrong[0], then just go against that grain. It will not go against React’s grain, because it has not much grain to speak of. It is a library with a few restrictions about what kind of callbacks you pass it.
Second, React is most commonly used through frameworks, like Next.js and such. There are also many instances of people using React via CRA project templates, which again are not part of React proper.
[0] …and using a library as if it was a framework is most definitely wrong. If your use case is of the framework-fitting scale, you should either A) use a framework or B) be conscious of the fact that you will end up with a framework of your own and plan accordingly (by default those frameworks tend to suck).
user
4 days ago
conradfr
4 days ago
Personally I'm pretty happy with Vite + Vue + Typescript (+ whatever for css).
I usually don't make a SPA though, only using it for specific parts (with their own entry file).
princevegeta89
4 days ago
Front-end is now a cesspool of numerous complex layers that try so hard to work with each other, all while only trying to deliver mostly the same kind of experience from 10 years ago or older.
Many big companies and startups blindly jump into the React/Vue/Angular stack, along with other complexities like Vite, Webpack, SSR, Zzzzzzzz... etc, where things are tied so loosely with 100s of dependencies and with a fragile underlying platform such as NPM. The output produced is only very marginally different from what could be achieved by the traditional MVC frameworks like Django/Rails/Phoenix etc. What do we lose here? a breathtaking amount of productivity and time. In addition, all the complex layers brought in place to make React FEs work with the backend such as GraphQL etc, also only increase the number of places you will have to maintain.
With SPA and all the modern snake oil like "serverless", engineers only will have to make changes at several places and implement some extra adapter logic, and spend a lot more time writing crap, than actually getting things out the door. With something as simple as JQuery which still holds its ground today, coupled with helper libraries like HTMX, Stimulus/Turbo, you can replicate 90% of the SPA experience, and ship things insanely fast, and maintain logic and state only on the backend. Your user only cares about seeing new features and existing features being easy to use. They don't give a fuck about whether you're using React or plain JavaScript or JQuery at the end of the day.
hirvi74
4 days ago
> They don't give a fuck about whether you're using React or plain JavaScript or JQuery at the end of the day.
Absolutely! However, I believe users aren't the issue. Hiring managers, HR, etc. absolutely give a fuck about whether you're using React or plain JS.
I have a friend that is a recruiter for a moderately sized company. She said that when they were looking for a frontend developer, if one's resume listed Angular and not React, then your resume was instantly thrown away. Not even a second of consideration was given.
I am not sure how common that is within the industry as a whole, but it wouldn't surprise me if it's quite common. It's shit like this that makes me absolutely hate our industry. I love programming, but I am really beginning to hate doing it for an occupation.
I come from the old school way too. I still publish applications in 2025 with just plain HTML, CSS, JS, and .Net backend. Nothing fancy. However, I am feeling compelled to learn React (against my will) sheerly for job prospects. My users nor my employer would benefit from React, but I've been considering using it sheerly for 'Resume Drive Development.'
princevegeta89
3 days ago
Well, let me tell you: jobs and independent/solo projects are very different. Jobs run on the idea of extreme commercialization and some politics. When you're building small products though, 90% of your ideas are engineering-centric. I think this is where the juice lies.
Small companies are great - but in the general job market, when you propose an idea that is not inline with the higher ups in the company, it quickly becomes a matter of ego and hate, even if it is the right idea.
user
4 days ago
bstsb
4 days ago
opinionated, but i add tailwind to this. sometimes makes code less clean with no components but if you're insistent on reusability you can @apply
exiguus
4 days ago
I agree that allowing yourself to forgo learning another library or build system is valid, particularly when you're working on a project alone. However, I disagree with reverting to 2009 standards for HTML, CSS, and JavaScript.
Instead, you can adopt 2025 standards, including Web Components, JavaScript and CSS modules, and modern JavaScript (ECMAScript 2022, also known as ES13, and even ES15). Additionally, CSS Level 3 features such as variables and container queries, along with WCAG 2.2 guidelines, are all widely supported by the latest browsers.
simonw
3 days ago
Completely agree with you - by "code like it's 2009" I meant writing HTML directly without a build script. I love using the most modern versions of the various web platform components.
soulofmischief
4 days ago
I've been using web components liberally in my side projects, but for more complex SPAs I still reach for mithril as a frontend lib because it just leads to simpler, more idiomatic code which can be linted better than huge html strings.
Web Components definitely have their thorns, as well as the shadow DOM. They're still a lot more capable than people give them credit for. Nested CSS has also been great, but I still reach for SCSS because nested CSS is still missing a few syntactical goodies. However, LLMs really bridge the gap and allow me to quickly write decent small web components without worrying too much about the internals.
exiguus
4 days ago
In my professional role, I primarily work with Next.js, React, Vue, Golang, Rust, and various AWS technologies. These tools help address common software engineering challenges such as scalability, maintainability, and compatibility. Consequently, I prefer to adhere to native standards in my personal and side projects.
For web components, I utilize Lit for its syntactic sugar and because I appreciate the decorator approach. Since browser compatibility is typically not an issue in these projects, I leverage native CSS 3 features and avoid using SCSS as a polyfill for nesting, variables, and maintaining DRY principles.
I haven't heard of Mithril before. Thanks for sharing!