Skip to main content

Notes / React / Design / Performance

React Website Design: What It Is, When to Use It, and What a Good Build Requires

React can power a polished marketing site or a complex web application—but it is not automatically the right tool. This guide explains how React website design works, when it earns its complexity, and how SEO, accessibility, and performance should shape the build.

By William Lodge 10 min read

"Should this be built in React?" is a question I hear from business owners and project leads more often than "How do we build it in React?" That's the right order to ask them in.

React is popular, well-documented, and genuinely good at certain jobs. It's also frequently reached for on projects that would ship faster and cost less as a simpler site. The useful question isn't whether React is capable—it almost always is—but whether React website design would improve this specific project, or add complexity it doesn't need.

What React website design actually means

React is a JavaScript library for building user interfaces out of components—small, reusable pieces of UI that manage their own markup, behavior, and state. That is the whole of what React is. It is not a visual style or a design aesthetic. Two sites built in React can look nothing alike, because typography, layout, color, spacing, and content decisions are what make a site look good, and React does not make any of them for you.

React does not replace CSS, content strategy, or UX research. What it replaces is the manual work of keeping many instances of the same interface piece—a nav bar, a product card, a filter, a form, a dashboard widget—consistent as an application grows. Components can represent navigation, cards, search interfaces, dashboards, filters, forms, and any other element that repeats or responds to changing data.

So: would React improve this project, or add complexity it does not need? That depends on how much of the interface is genuinely dynamic—driven by user input, live data, or account-specific state—versus how much is content that reads the same for every visitor. The rest of this guide is about telling those two situations apart.

Component-driven design

The practical benefit of components is operational, not aesthetic. When a button, a card, or a form field exists as one component used everywhere, a design change happens once and appears everywhere it is used. That improves consistency across a growing site, speeds up maintenance because there is one place to fix a bug instead of many, and makes it realistic to enforce a design system instead of hoping every page copied the last one correctly.

Component architecture also makes iteration cheaper: testing a new card layout, adding a form state, or extending a dashboard with a widget becomes a contained change instead of a site-wide edit. That matters most on products expected to keep growing—more screens, roles, and data views—where the cost of inconsistency compounds over time.

None of that happens automatically. Reusable components can encode a bad design decision everywhere just as easily as a good one. Components enforce consistency; they do not supply good typography, a clear hierarchy, or a usable layout. Component-driven design delivers design decisions—it doesn't make them for you.

When React is a strong fit

React earns its complexity on interfaces with real, ongoing state a static page can't represent cleanly:

  • Dashboards with live or frequently updating data
  • Customer or staff portals with account-specific views
  • Interactive tools—calculators, configurators, builders
  • Complex, multi-step, or conditionally branching forms
  • Live search and filtering across large data sets
  • Account-based experiences with authentication and permissions
  • Data-heavy interfaces: tables, charts, and drill-downs
  • Applications with many distinct UI states—loading, empty, error, partial, success
  • Products expected to expand significantly in scope over time

What these share is state that changes based on what the user does, not just what page they're on. A dashboard that reshapes around live data, or a portal that shows a different view per account, is doing something a stack of static HTML pages was never built to do well. That's where component-driven state stops being overhead and starts being the feature.

An example from my own work: FieldCompass walks a user through a short question wizard and matches them to verified services based on their answers—multiple UI states and branching logic, no server round-trip needed to progress. A good fit for a stateful interface rather than a set of static pages.

When React may be unnecessary

The same complexity that makes React valuable on a stateful application is dead weight on a site without that kind of interactivity. A small brochure website, a simple local-business site, a single landing page, a mostly static informational site, or a straightforward blog usually doesn't need a component framework, a build step, or client-side state management to do its job well.

These projects are content-first: largely the same page for every visitor. HTML, CSS, and a content-managed or simple server-rendered backend deliver that faster to build, faster to load, cheaper to host, and easier to hand off to someone who isn't a React developer. Adding React here doesn't usually make the site better—it adds a build pipeline and an ongoing maintenance surface for a problem the project didn't have.

The technology should follow the project's actual requirements, not the reverse. If the honest need is "publish and update content reliably," that's a content and information-architecture problem first, not a state-management problem.

React does not automatically mean "single-page application"

A common assumption is that a React site is automatically a single-page application that depends entirely on client-side JavaScript to become visible. That's one way to build with React, but not the only way, and increasingly not the default recommended way.

A few rendering approaches, in plain terms:

  • Client-side rendering (CSR): the browser downloads mostly-empty HTML plus a JavaScript bundle, then builds the page in the browser—the classic SPA pattern, fast after the first load, slower to show anything on the first request.
  • Server-side rendering (SSR): the server renders full HTML per request, so the browser has real content immediately, then React "hydrates" it to make it interactive.
  • Static generation: pages are rendered to HTML ahead of time, at build time, and served like static files—simple to host, well suited to content that doesn't change per request.
  • SPA-style navigation: after the first load, moving between routes updates the view without a full page reload, regardless of whether that first load was client-rendered, server-rendered, or static.

A single React project can mix these per route: static marketing pages, a server-rendered account area, a client-rendered dashboard behind login. Not every React website is an SPA, and treating the two as synonyms leads to architecture decisions built on a false assumption.

Framework versus custom build setup

React's own documentation now recommends starting most new, complete applications with a framework rather than assembling one from individual tools. Create React App, the long-time default starting point, was deprecated by the React team in February 2025, citing a lack of active maintenance and limitations for high-performance production apps.

In its place, React's current guidance points toward full-stack frameworks—Next.js, React Router as a full-stack framework, Expo for native apps—as the starting point for a new app or website. Frameworks handle routing, data loading, and rendering strategy as connected decisions instead of separate tools bolted together after the fact.

Vite remains a legitimate, actively maintained option when a custom setup built from scratch is the right call—unusual constraints or a team that wants full control over routing and data fetching. React's own guidance is candid that this route means making your own decisions about routing, data fetching, and rendering—effectively building a lightweight framework yourself. Its rule of thumb: if the app needs routing, it will likely benefit from a framework.

There's no universally correct stack. The right architecture depends on the project's routing needs, data-loading pattern, hosting environment, SEO requirements, and how much the application is expected to grow.

React website design workflow

A React build that stays maintainable follows a consistent sequence, whether the team is one person or several:

  1. Define goals and the specific tasks users need to complete
  2. Map the pages, screens, and application states the product needs
  3. Create wireframes and responsive layouts before writing components
  4. Establish typography, color, spacing, and reusable design tokens
  5. Define the component architecture—what's reusable, what's page-specific
  6. Connect content, data sources, and application state to the interface
  7. Implement accessibility as part of each component, not a final pass
  8. Test SEO and performance against real pages, not a staging shell
  9. Verify on real devices and browsers, including error and edge-case states
  10. Deploy, then maintain the system—dependencies, content, and data change

Skipping the design steps and going straight to component code is the most common way a React build ends up inconsistent and hard to extend. The framework doesn't replace the design process; it depends on it.

Styling and component ecosystems

React doesn't include a styling system, so most projects choose one:

  • Custom CSS gives full control over output and file size, at the cost of writing and maintaining more of the system yourself.
  • Tailwind CSS speeds up building consistent spacing and layout directly in markup, at the cost of more verbose component code.
  • Material UI ships a full, opinionated component library with Google's Material Design baked in—fast to start with, harder to make look distinctive.
  • shadcn/ui provides copyable, ownable component code rather than an installed dependency—less setup convenience, more direct control.
  • Accessible primitives like Radix supply unstyled, behavior-correct building blocks—focus handling, keyboard navigation, ARIA wiring—that you style yourself.

None of these choices does the design or accessibility work for you. A component library can shortcut a lot of implementation, but original design thinking, an accessibility review, and real testing still have to happen on top of it. FieldCompass, one of my own projects, pairs Tailwind CSS for layout with Radix primitives for interactive elements—two tools solving different problems, not one tool solving both.

SEO for React websites

Google can process JavaScript, but "can" isn't the same as "will, reliably, without careful implementation." Google renders pages in three phases—crawl, render, then index—and only sends pages with a real 200 status into the rendering queue. Content that depends entirely on client-side JavaScript to appear is one extra, fallible step away from being indexed compared to content already present in the HTML response.

What holds up in practice:

  • Real, crawlable <a href> links—not click handlers or button-only navigation—for anything that should be discoverable
  • Stable, unique URLs per meaningful view, using the History API rather than URL fragments for client-side routing
  • Page-specific titles and meta descriptions, whether rendered server-side or injected client-side
  • A canonical URL matching what you actually intend indexed—Google warns against using JavaScript to override the canonical you already specified
  • Server rendering, static rendering, or hydration for content that needs to be reliably visible—Google has been explicit that dynamic rendering is a workaround, not a long-term solution
  • Structured data describing the real, visible content of the page
  • A clear internal linking structure so important pages are reachable
  • An accurate XML sitemap listing canonical, indexable URLs
  • Real HTTP status codes—404 for missing pages, not a soft 404 that returns 200
  • Optimized, properly sized, lazy-loaded images
  • No essential content or navigation path that disappears when JavaScript fails to load

React isn't inherently bad for SEO, and it isn't automatically SEO-friendly either. The outcome depends on whether the rendering strategy actually delivers indexable content—exactly why the framework-versus-custom decision above matters for search visibility, not just developer experience. Validate the rendered HTML and metadata that actually reach the crawler; what a browser shows after JavaScript runs isn't always what a crawler sees on the first pass.

Performance

React doesn't make a site fast by default, and it doesn't make a site slow by default either. Performance is a property of what gets built, not of the library.

The factors that actually move the needle:

  • Component architecture that avoids unnecessary re-renders
  • Controlling the total JavaScript payload shipped to the browser
  • Code splitting by route and by component, so users download only what the current view needs
  • Image and font optimization—correct formats, sizes, and loading strategy
  • Avoiding libraries added for convenience that duplicate what the framework or browser already does
  • Caching at the right layers—build output, CDN, and data fetching
  • Measuring real performance—Core Web Vitals on real devices and connections—rather than how fast a project feels on a fast laptop

Every one of those is a decision made during the build, not a property React grants automatically. A poorly built React site can be slower than a well-built static one, and a well-built React site can outperform a bloated static one carrying unnecessary scripts. There's no guarantee in either direction—only measurement.

Accessibility

Accessibility in a React interface is an implementation responsibility, not something the library provides automatically. It has to be built in, checked, and tested like any other requirement.

Practical fundamentals:

  • Semantic HTML first—a real <button> or <a> is keyboard-accessible by default; a styled <div> is not
  • Full keyboard operability for every interactive element, with no keyboard traps inside modals or menus
  • Visible focus indicators, never removed purely for aesthetics
  • Clear labels and instructions on form fields, not placeholder text standing in for a label
  • Deliberate focus management after dynamic changes—especially route transitions, where focus should move to the main content, a heading, or a skip link rather than staying on a now-gone element
  • Sufficient color contrast across text and interactive states
  • Respect for reduced-motion preferences
  • Actual screen-reader testing, not just automated-tool passes
  • Touch targets large enough to use reliably on a phone

Dynamic content announcements are a common gap: content injected asynchronously into a live region is easy for assistive technology to miss. Content should already exist in the DOM and then update—most component frameworks, React included, provide tested live-announcer packages built for this. Radix and similar accessible-primitive libraries handle a meaningful share of this correctly out of the box, but the review and testing still have to happen.

Decision checklist and conclusion

Before choosing React, run through a short, honest checklist:

  • Does the interface have real, ongoing state—user input, live data, account context—or is it mostly the same content for every visitor?
  • Will the product keep growing in scope, screens, or user roles?
  • Does the project need routing, in which case a framework is probably the right call over a from-scratch build?
  • Who maintains this after launch—does that team have React experience?
  • Have SEO, accessibility, and performance requirements been defined before the architecture, not after?
  • Would a simpler PHP, HTML, or content-managed site deliver the same outcome for less ongoing complexity?

React website design is a strong choice when a project has real interactivity, evolving state, and room to grow—and avoidable complexity when it doesn't. The right answer is specific to the project, not to the trend.

Planning something with real interactivity?

Planning an interactive website, dashboard, portal, or internal tool? I can help determine whether React is the right architecture—or whether a simpler build would serve the project better. See my development capabilities or get in touch to talk through the project.

Start a conversation

Sources and further reading

  1. React: Official documentation
  2. React: Creating a React App
  3. React: Build a React App from Scratch
  4. React Blog: Sunsetting Create React App
  5. Google Search Central: JavaScript SEO basics
  6. Google Search Central: Dynamic rendering
  7. web.dev: Accessibility — JavaScript