For a long time, I treated React as a hammer.
Every problem looked like a nail.
Dashboards, landing pages, blogs, SEO pages, e-commerce.
Same stack, same patterns, same assumptions.
That worked, until it didn’t.
🧠 The early mistake
In my early production systems, I built everything as a single React SPA. It felt clean and modern. One codebase, one mental model, fast iteration.
Then real traffic showed up.
Marketing pages loaded slowly on mobile.
SEO performance was unpredictable.
Dashboards felt heavy despite being internal tools.
E-commerce pages struggled with crawlability and first paint.
Nothing was “broken” in isolation. The problem was architectural laziness.
⚙️ What production taught me
Dashboards and SEO-sensitive surfaces solve fundamentally different problems.
For dashboards, I care about interaction density, state complexity, and perceived responsiveness after login. React shines here. Client-side state, aggressive caching, optimistic updates, complex charts. SEO is irrelevant, speed after auth is everything.
For landing pages, blogs, and e-commerce, the priorities flip. First contentful paint matters. Crawlability matters. Predictable rendering matters. This is where Next.js earned its place in my stack, not because it is trendy, but because it lets me choose rendering intentionally.
Static generation for programmatic SEO pages.
Server rendering for product and category pages.
Incremental regeneration where content changes slowly but traffic is high.
Same React mental model, different execution strategy.
⚖️ The tradeoffs nobody talks about
This split is not free.
Two deployment pipelines instead of one.
More opinions in the team about where code should live.
Shared components need discipline or they rot fast.
Developers must understand rendering, not just write JSX.
But the alternative is worse.
A single stack that optimizes for everything usually optimizes for nothing.
🔍 Programmatic SEO at scale
The hardest lessons came from programmatic content.
Generating thousands of pages is easy. Making them fast, indexable, and maintainable is not.
I learned to treat content like data. Validate it, cache it, version it. Build guardrails so bad data cannot ship broken pages. Accept that not every page deserves hydration. Sometimes HTML is enough.
That mindset shift mattered more than any framework choice.
📌 What I’d do again, and what I wouldn’t
I would still use React everywhere.
I would not render it the same way everywhere.
I would design around user intent, not developer convenience.
I would explain these tradeoffs early to non-technical stakeholders, especially marketing and leadership, because performance and SEO are business risks, not frontend details.
Closing thought
Senior engineering, to me, is not about knowing more tools. It is about knowing when not to use the same one twice.
When your architecture starts matching user behavior instead of developer preference, everything gets calmer. Teams move faster. Metrics improve. Conversations with leadership become simpler.
That is usually how I know the system is finally growing up.
Top comments (0)