Skip to content

Single-SPA CI/CD

CI/CD sits at the heart of ci/cd in single-spa. This guide walks through the concept step by step, with examples, a cheatsheet, and common mistakes to avoid.

CI/CD Overview

CI/CD lets you structure single-spa work so it stays readable, testable, and easy to scale. Instead of ad-hoc code, you follow a clear pattern that other developers can recognise immediately.

The key is to keep ci/cd focused and predictable. Start from the minimal example here, then layer in only the complexity your feature actually needs.

# each micro frontend publishes its own bundle + import-map entry
@org/checkout -> https://cdn.example.com/checkout/v3/checkout.js

# update only this app's import-map entry to release it
{ "@org/checkout": "https://cdn.example.com/checkout/v3/checkout.js" }

Deploying a micro frontend is often just updating its import-map URL.

CI/CD Example

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

Single-SPA Cheatsheet

Core single-spa APIs related to ci/cd.

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 CI/CD Works in Single-SPA

CI/CD 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.

Deploying a micro frontend is often just updating its import-map URL.

  • 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 CI/CD

For reliable micro frontends, ci/cd 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

  • Skipping error handling and edge cases when wiring up ci/cd.
  • Leaving ci/cd untested, so regressions slip into production.
  • Over-engineering ci/cd before you actually need the extra flexibility.
  • Ignoring documentation, which makes ci/cd hard for the next developer to change.

Key Takeaways

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

Pro Tip

When you get stuck on ci/cd, reduce it to the smallest reproducible example first — most single-spa issues become obvious once the noise is gone.