[{"data":1,"prerenderedAt":94},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fweb-performance-is-a-feature":26,"\u002Fblog\u002Fweb-performance-is-a-feature-surround":89},[4],{"title":5,"path":6,"stem":7,"children":8,"page":25},"Blog","\u002Fblog","blog",[9,13,17,21],{"title":10,"path":11,"stem":12},"How I Built a Reusable Component Library from Scratch","\u002Fblog\u002Fbuilding-a-reusable-component-library","blog\u002Fbuilding-a-reusable-component-library",{"title":14,"path":15,"stem":16},"From Idea to Production: My End-to-End Engineering Process","\u002Fblog\u002Ffrom-idea-to-production","blog\u002Ffrom-idea-to-production",{"title":18,"path":19,"stem":20},"Web Performance Is a Feature","\u002Fblog\u002Fweb-performance-is-a-feature","blog\u002Fweb-performance-is-a-feature",{"title":22,"path":23,"stem":24},"The Case for Boring Technology and Maintainable Code","\u002Fblog\u002Fwriting-maintainable-code","blog\u002Fwriting-maintainable-code",false,{"id":27,"title":18,"author":28,"body":32,"color":77,"date":78,"description":79,"extension":80,"icon":81,"image":82,"layout":83,"meta":84,"minRead":85,"navigation":86,"path":19,"seo":87,"stem":20,"__hash__":88},"blog\u002Fblog\u002Fweb-performance-is-a-feature.md",{"name":29,"avatar":30},"Rong Yuthean",{"src":31,"alt":29},"\u002Fprofile.jpg",{"type":33,"value":34,"toc":73},"minimark",[35,39,42,45,48,51,70],[36,37,38],"p",{},"Performance is often treated as a nice-to-have, something to fix \"later\". After a series of experiments on the Wavelength music web app, I've seen first-hand how much speed directly impacts user behavior.",[36,40,41],{},"When we first launched, our homepage took over four seconds to become interactive on mid-range mobile devices. Our engagement metrics were underwhelming, so I proposed treating performance as a product feature with its own goals and dashboards.",[36,43,44],{},"We started by collecting real-user metrics (Core Web Vitals) instead of relying only on lab tests on fast laptops. Then we tackled the biggest wins: code-splitting large routes, server-side rendering critical pages, lazy-loading images, and caching API responses at the edge.",[36,46,47],{},"The results were striking: cutting Largest Contentful Paint from 4.1 s to 1.6 s increased session starts by 34%. Even more interesting, users on slower networks saw the biggest gains, showing that performance work is also accessibility work.",[36,49,50],{},"I've since adopted a simple framework for performance:",[52,53,54,58,61,64,67],"ol",{},[55,56,57],"li",{},"Measure real users, not just your own machine",[55,59,60],{},"Set performance budgets and enforce them in CI",[55,62,63],{},"Fix the biggest bottleneck first, then measure again",[55,65,66],{},"Make performance visible to the whole team with dashboards",[55,68,69],{},"Treat regressions like bugs, not nice-to-haves",[36,71,72],{},"The most valuable lesson I've learned is that fast software feels better, and users notice even when they can't explain why.",{"title":74,"searchDepth":75,"depth":75,"links":76},"",2,[],"#f59e0b","2025-03-15","How measuring and optimizing real-user performance metrics directly improved engagement, conversion, and the overall user experience.","md","i-lucide-gauge",null,"dashboard",{},5,true,{"title":18,"description":79},"oM3OxgJSz0maKN3YGiPgh6D4cO_KqPBp30cN24nHoCQ",[90,92],{"title":14,"path":15,"stem":16,"description":91,"children":-1},"A detailed breakdown of how I take a feature from requirements to a reliable production release, with practical tips for engineers at every stage.",{"title":22,"path":23,"stem":24,"description":93,"children":-1},"Why choosing simple, proven tools and writing code for the next reader leads to more reliable systems and happier teams.",1793207677059]