The Watchmaker's First Unbalanced Wheel: On the False Economy of a Perfectly Lazy Component
There is a mantra in our craft, repeated with the fervent certainty of gospel: defer everything. Lazy-load every image, every script, every component that isn’t immediately in the viewport. It’s a principle born from a noble pursuit—to minimize initial payload and get that first pixel on the screen as fast as possible. We are taught to see the initial load as the only race that matters. But in our zeal to win that sprint, we are often building interfaces that stumble and falter the moment a user decides to interact with them.
I call this the ‘False Economy of Deferral.’ We save a few kilobytes and a few milliseconds on the initial paint, patting ourselves on the back as our Lighthouse scores glow a satisfying green. Yet, we’ve merely taken the computational cost and shifted it elsewhere—to the exact moment a person tries to *use* the thing we built. We’ve created a beautiful, empty shell, and hidden the machinery to make it work just out of sight. The user, expecting a seamless experience, clicks a tab, opens a menu, or scrolls, and is met not with instant feedback, but with a stutter, a blank space, or a loading spinner. The transaction of trust is broken.
The Jank of Deferred Intent
This is most painfully evident with so-called ‘lazy components.’ A complex charting library, a custom media player, a recommendation carousel—all neatly tucked away inside a React `lazy()` or a similar framework-specific method. They are not loaded until they are deemed ‘necessary.’ But the definition of ‘necessary’ is a cold, technical calculation, utterly divorced from human intent.
A user sees a ‘Financial Trends’ tab. Their intent forms; they move to click. Only *then* does the browser begin to fetch, parse, and execute the several hundred kilobytes of charting code required to fulfill that intent. The user is no longer waiting for a page to load; they are waiting for their own action to be acknowledged. This perceived latency feels profoundly slower, more obstructive, and more insulting than any initial load. It’s the difference between waiting for a store to open and waiting for a clerk to find a product after you’ve already asked for it.
We have optimized for the machine’s first impression at the expense of the human’s ongoing experience. We’ve built a watch with a beautifully polished face and an unbalanced wheel that grinds to a halt the second you try to read the time.
The craft, then, is not in blanket deferral, but in intelligent anticipation. It is the subtle art of knowing what is truly below the fold versus what is merely out of view. It is using interaction patterns and user journeys to preemptively prepare the resources for the next likely action, loading them quietly during browser idle time after the critical work is done. It is understanding that performance is not a single metric scored in a vacuum, but a continuous dialogue between the interface and the person using it. A fast first paint is a promise. We must ensure the rest of the experience doesn’t feel like a lie.
Notes & further reading
A few pages I came back to while writing this: