Skip to content

Front-End Development: What the Predictions Got Wrong

Front-end does not evolve in a straight line, and the confident predictions about its future have a poor record. What the misses have in common is more useful than any new forecast.

Share
Abstract visualisation of a pendulum arc traced across a field of connected nodes

Articles about the future of front-end development have a poor track record, and they fail consistently. They predict new capabilities: virtual reality interfaces, voice-controlled navigation, whatever is currently exciting. Then the actual change turns out to be something duller and more structural, usually a piece of complexity being absorbed into the platform, or a decision being reversed after a decade of being obvious.

I find that pattern more interesting than another set of forecasts, so rather than write predictions that will read badly in five years, this is an honest look at what the last stretch actually did, which of the confident calls missed, and what the misses have in common.

The line that was not a line

The standard telling is a ladder. Static HTML, then CSS, then JavaScript, then frameworks, then whatever comes next, each step a clear advance on the last.

It is a tidier story than what happened. The more accurate shape is a pendulum, and the clearest example is where rendering happens.

The web started with servers producing HTML. Then jQuery made it comfortable to manipulate the page after load, and progressively more logic moved to the browser. Then single-page applications moved essentially everything there: routing, templating, state, data fetching, the lot, with the server reduced to a JSON endpoint. For roughly a decade, this was the default answer, and asking whether a project needed it marked you as behind.

Then the costs became undeniable. Enormous bundles, poor performance on mid-range devices, content invisible to crawlers, accessibility regressions, and a great deal of machinery reimplementing things browsers already did well, like navigation and scroll restoration.

So it swung back. Server-side rendering returned as a default rather than an optimisation. Static generation took over content sites. Islands architecture, popularised by Astro, ships HTML with interactivity only where it is needed. React Server Components moved component execution back to the server. htmx found an audience by arguing the whole detour was unnecessary.

The important part is that this was not a correction of a mistake so much as a swing. Client-heavy rendering solved real problems for genuinely application-like interfaces, and it still does. What was wrong was universalising it, and the same universalising instinct is what makes the current server-rendering enthusiasm worth watching sceptically too.

The absorption cycle

The engine underneath most real change is less dramatic than any prediction, and it runs like this: a library solves a gap in the platform, the approach proves itself, the platform absorbs it, the library becomes unnecessary.

Nearly every tool that dominated a decade of front-end work has been through this.

jQuery existed largely because DOM APIs were inconsistent and unpleasant. querySelector, classList and fetch absorbed most of it. Bootstrap's grid existed because CSS had no layout system, and flexbox and grid absorbed it. Modernizr existed to detect features, and @supports absorbed it. Moment.js existed because Date was a mess, and Temporal is now absorbing it. A large fraction of Lodash is now standard library. Sass provided variables, nesting, and colour manipulation, all of which are now native CSS, which I covered in the piece on CSS architecture.

This is the most reliable pattern in the field, and it is worth more than any forecast, because it tells you where to place your attention. Skills in the platform compound over decades. Skills in a specific abstraction over the platform depreciate, sometimes quickly. That is not an argument against using libraries, which are frequently the right answer today. It is an argument about what you invest in learning deeply.

The corollary is that the interesting question about any new tool is not what it does, but what gap it fills, and whether that gap looks like the kind of thing the platform will eventually close.

Grading the old predictions

The predictions that dominated this conversation a decade ago were Web Components, progressive web apps, AI assistants, voice interfaces and VR/AR. It is only fair to mark them.

Web Components: partial credit. They exist, they work, they are genuinely used, particularly in design systems that must serve multiple frameworks and in large organisations that need components to outlive framework churn. What did not happen is the prediction as stated: that they would become the standard way applications are built. Framework components won that, comprehensively. The reason is worth noting: Web Components solved encapsulation and reuse, but the market cared more about state management, rendering ergonomics and developer experience, which they did not address.

PWAs: mixed, and the reasons are political. The technology largely delivered. Service workers are everywhere, offline capability works, background sync exists. What didn't arrive is the outcome people meant by the prediction: installable web apps would displace native ones. That was never purely technical. Platform vendors control installation and notification affordances, and their incentives run the other way. The gap between what the technology can do and what it is permitted to do is where the prediction failed.

AI: happened, but not as described. The framing at the time was chatbots and virtual assistants embedded in websites, which did arrive and are mostly unloved. The change that actually mattered to front-end developers was elsewhere entirely: AI assistance in writing code. Almost nobody predicted that, and it has had more effect on the daily practice of the job than every other item on the list combined.

Voice interfaces: essentially none. Voice found a home in dedicated hardware and phone assistants, and almost none on the web. The Web Speech API exists and is rarely reached for. The prediction mistook a capability for a demand.

VR and AR: no, at least not here. WebXR is a real specification with real implementations, and it powers a small number of genuinely good experiences. It is not part of mainstream front-end work and shows no sign of becoming so on the timescale predicted.

The pattern across the misses is consistent. Every prediction was about a new capability arriving, and capabilities are the easy part. Adoption depends on whether something solves a problem people actually have, at a cost they will actually pay, with the permission of whoever controls the platform. Those constraints are much harder to forecast, so predictions default to the technology and get it wrong.

What is actually true now

Setting predictions aside, a few things about the current state are worth stating plainly, because they are less visible than framework news.

The build layer moved to Rust and Go, and got much faster. esbuild, SWC, Lightning CSS, Turbopack, Biome, oxc and Rolldown replaced a generation of JavaScript-based tooling. This is unglamorous and has changed daily work more than most feature releases, because a build that takes two seconds instead of forty changes how often you iterate.

TypeScript stopped being a question. Not universal, but the default for anything of size, and increasingly assumed by libraries and documentation.

Frameworks converged on the same idea. Signals, in one form or another, are now in Solid, Svelte, Angular and Vue, and React has arrived at similar ends by different means. Fine-grained reactivity beat virtual DOM diffing on the merits, and the convergence is more notable than the competition, since it suggests the problem is genuinely settled rather than fashionable.

The platform closed many gaps at once. Container queries, cascade layers, :has(), native nesting, @scope, view transitions, popover, dialog, subgrid, dynamic viewport units. An unusual concentration, and a lot of it removes the reason for a dependency.

AI-assisted development became normal. Worth being measured about, since both the enthusiasm and the dismissal are overstated. What is observably true is that the generation of routine code is faster, and that reviewing and verifying code has become correspondingly more of the job. That shifts the value of skills: knowing what correct looks like matters more than knowing how to produce it from memory, which argues for understanding fundamentals rather than against it.

The only predictions worth making

If the lesson is that capability forecasts fail, the honest response is to make structural bets instead, and to hold them loosely.

The absorption cycle will continue, because it has run without interruption for twenty years. Specifically, expect more of what currently requires a library to become a browser feature, and expect today's essential tool to be next decade's compatibility shim.

The build step will keep shrinking. Native ES modules, import maps and native CSS features already remove much of what bundling was for. It will not disappear, since minification, tree-shaking and asset pipelines remain useful, but the distance between what you write and what ships keeps narrowing.

The rendering pendulum will swing again, though I would not guess when or how far. The current server-side consensus is solving real problems, and it will accumulate its own costs; someone will eventually write a persuasive piece about why we overcorrected.

And the things that will not change: HTTP, HTML semantics, the cascade, the event loop, the accessibility tree. Everything in that list was true a decade ago, is true now, and will still be true when the current framework generation is legacy.

What this means if you are working in it

Three practical conclusions.

Learn the platform deeply and frameworks pragmatically. A framework is a set of answers to platform-level questions, so understanding the questions makes every framework easier and makes it survive all of them.

Be sceptical of anything that requires adopting a whole new mental model to solve a problem you do not currently have. Most of the cost of front-end churn hasn't come from tools being bad; it's come from adopting them for fashion rather than fit.

And judge a new tool by the gap it fills. If the gap looks like something the platform will close, treat the tool as temporary and structure your code so you can remove it. If the gap is genuine and durable, commit properly.

The part that does not change

The usual framing, that front-end development is a story of continuous advance towards richer experiences, is not exactly wrong, but it flatters the field. Much of the last decade was spent rebuilding capabilities the browser already had, discovering why they existed, and then partially undoing the work.

That is not a failure so much as how the field learns, and it argues for a particular disposition: interested in new things, slow to universalise them, and firmly grounded in the layer underneath, which changes far less than the discourse suggests.

The job has always been the same underneath. Get content in front of people, quickly, on whatever device they have, in a way they can actually use. Every tool is a means to that end, and the tools that lasted were the ones that stayed honest about it.