React Forum
Blog & Guide Responses
Dec 27, 2022 · 04:00 PM

[Deep Dive #38] Single-Pass Migration Bridges - discussion

Started by Jules Kwon
blogmigrationroutingimportFileRoutesadoptAllbridge ledger

Deep Dive #38 is pushing a decisive migration posture: adopt in a single pass to avoid split mental models, preserve URLs by importing legacy routes into the file router, and layer replacement UI via component routes while a bridge ledger tracks what is still legacy vs replaced.

Read the post

If you have done a large migration, what made the bridge period survivable? Do you prefer a short, intense hybrid phase (single pass), or a longer incremental rollout with more parallel patterns? How do you keep the bridge ledger honest as teams replace pieces at different speeds?

Comments (10)

Back to latest
Noah Vance
Dec 27, 2022 · 04:06 PM

The strongest argument for single pass is the human side: one story, one router model, fewer footguns.

Keira Santos
Dec 27, 2022 · 04:14 PM

I like the preserve-URL-first posture. Once URLs are stable, you can iterate on the surface without breaking users.

Related: Migrating to React and Routing and Navigation.

Amina Farouk
Dec 27, 2022 · 04:23 PM

We kept a literal ledger (in state) and rendered it in internal builds so nobody could pretend the bridge was done:

ts
type BridgeProgress = { shell: boolean; header: boolean; panel: boolean; footer: boolean };

const ledger = useLiveState('bridge-ledger', { replaced: { shell: true, header: true, panel: false, footer: false } });

When you can see it, it is harder to drift into permanent hybrid.

Theo Bennett
Dec 27, 2022 · 04:35 PM

Counterpoint: single pass is aspirational. In regulated products, you often cannot do one big cutover without extended parallel runs.

Jules Kwon
Dec 27, 2022 · 04:40 PM

That is fair. I read single pass as: one adoption moment for the mental model, not necessarily one deploy for all surfaces.

You can still have phased rollout, but you try to avoid two competing routing languages at once.

Theo Bennett
Dec 27, 2022 · 04:44 PM

That interpretation makes it more practical. The issue is when teams keep both models forever.

Grace McCoy
Dec 27, 2022 · 04:56 PM

The component-route layering part is the most useful.

We replaced panels inside a legacy screen without touching the URL map at all, and it made the migration feel incremental even though the router story was unified.

Salma Qureshi
Dec 27, 2022 · 05:05 PM

Misunderstanding I had: I thought preserve URLs meant keep the legacy router alive.

Importing the map into file routes is the opposite: you make the new router authoritative immediately.

Keira Santos
Dec 27, 2022 · 05:11 PM

Exactly. You keep the address stable, not the implementation.

Dmitri Kline
Dec 27, 2022 · 05:24 PM

We put the ledger into PR review. If you replaced a component route, you also updated progress evidence.

It sounds bureaucratic, but it prevented the bridge from becoming a graveyard of half-migrated surfaces.

Harper Iqbal
Dec 27, 2022 · 05:33 PM

A tiny detail: normalize route map imports early.

We had two teams import the same legacy route with different casing rules and it caused bizarre redirects until we made it deterministic.

Priya Liao
Dec 27, 2022 · 05:46 PM

If you are going to do single pass, invest in audit tooling for the bridge period.

Without evidence, leadership starts asking why it is taking so long and engineers cannot answer coherently.

Benji Rios
Dec 27, 2022 · 06:02 PM

The ledger part is the key. The migration does not exist unless the route can prove where it is.