Skip to content

single-spa-react

In this lesson you will learn single-spa-react in single-spa, why it matters within react integration, and how to use it correctly with clear, copy-ready examples.

single-spa-react Overview

At its core, single-spa-react is about doing one thing well inside your single-spa project. Once you understand the pattern, you can apply it consistently across features and teams.

Good single-spa-react pays off across the whole codebase: fewer surprises, easier testing, and smoother onboarding. The snippet below is a solid starting point.

import React from 'react';
import ReactDOMClient from 'react-dom/client';
import singleSpaReact from 'single-spa-react';
import Root from './root.component';

const lifecycles = singleSpaReact({
  React,
  ReactDOMClient,
  rootComponent: Root,
});

export const { bootstrap, mount, unmount } = lifecycles;

single-spa-react adapts a React app into single-spa lifecycle functions.

single-spa-react Example

registerApplication({
  name: '@org/app',
  app: () => System.import('@org/app'),
  activeWhen: ['/app'],
});
start();
  • Start from a minimal single-spa-react example and grow it only as needed.
  • Keep configuration explicit so single-spa-react behaves the same in every environment.
  • Name things clearly so teammates understand your single-spa-react at a glance.
  • Add tests around single-spa-react early to lock in expected behaviour.

Single-SPA Cheatsheet

Core single-spa APIs related to single-spa-react.

API Example Purpose
registerApplication registerApplication({ name, app, activeWhen }) Register a micro frontend
activeWhen activeWhen: ['/checkout'] Route ownership
start start() Begin routing
bootstrap export async function bootstrap() One-time setup
mount export async function mount(props) Render the app
unmount export async function unmount(props) Clean up the app
import map systemjs-importmap Locate app bundles

How single-spa-react Works in Single-SPA

single-spa-react is part of how single-spa lets multiple applications — even in different frameworks — coexist on one page. A root config registers each app and controls when it is active.

single-spa-react adapts a React app into single-spa lifecycle functions.

  • A root config registers apps and calls start().
  • Each app exports bootstrap, mount, and unmount lifecycles.
  • activeWhen decides which routes each app owns.
  • Import maps resolve each app's bundle at runtime.

Practical Guidance for single-spa-react

For reliable micro frontends, single-spa-react should isolate failures and keep shared state minimal. Let each team own its app end to end while agreeing on a few shared contracts.

Concern Recommendation
Isolation One app's crash should not break others
Shared state Prefer shared utility modules over globals
Routing Keep activeWhen rules explicit and non-overlapping
Deployment Release via import-map updates per app

Common Mistakes

  • Copying single-spa-react snippets without understanding what each line does.
  • Skipping error handling and edge cases when wiring up single-spa-react.
  • Leaving single-spa-react untested, so regressions slip into production.
  • Over-engineering single-spa-react before you actually need the extra flexibility.

Key Takeaways

  • single-spa-react is a core part of working effectively with single-spa.
  • Start small and keep single-spa-react focused on a single responsibility.
  • Apply consistent patterns so single-spa-react scales across your project.
  • Test and document single-spa-react to keep it maintainable over time.

Pro Tip

Bookmark this single-spa-react pattern and reuse it. Consistency across your single-spa codebase is worth more than clever one-off solutions.