facebook/react · error · Error

overrideSuspenseMilestone not supported by this renderer

Error message

overrideSuspenseMilestone not supported by this renderer

What it means

The legacy renderer adapter stubs overrideSuspenseMilestone as a throwing no-op. Suspense milestone tracking is an experimental/canary fiber-reconciler debugging feature; the stack reconciler (React <= 15) has neither Suspense nor milestone bookkeeping, so the backend throws rather than silently ignoring the command.

Source

Thrown at packages/react-devtools-shared/src/backend/legacy/renderer.js:1207

    throw new Error('getProfilingData not supported by this renderer');
  };
  const handleCommitFiberRoot = () => {
    throw new Error('handleCommitFiberRoot not supported by this renderer');
  };
  const handleCommitFiberUnmount = () => {
    throw new Error('handleCommitFiberUnmount not supported by this renderer');
  };
  const handlePostCommitFiberRoot = () => {
    throw new Error('handlePostCommitFiberRoot not supported by this renderer');
  };
  const overrideError = () => {
    throw new Error('overrideError not supported by this renderer');
  };
  const overrideSuspense = () => {
    throw new Error('overrideSuspense not supported by this renderer');
  };
  const overrideSuspenseMilestone = () => {
    throw new Error('overrideSuspenseMilestone not supported by this renderer');
  };
  const startProfiling = () => {
    // Do not throw, since this would break a multi-root scenario where v15 and v16 were both present.
  };
  const stopProfiling = () => {
    // Do not throw, since this would break a multi-root scenario where v15 and v16 were both present.
  };

  function getBestMatchForTrackedPath(): PathMatch | null {
    // Not implemented.
    return null;
  }

  function getPathForElement(id: number): Array<PathFrame> | null {
    // Not implemented.
    return null;
  }

View on GitHub (pinned to eafeac097b)

Solutions

  1. Run milestone debugging only on renderers that support it (canary fiber builds).
  2. Upgrade the legacy app off React 15.
  3. Update DevTools so milestone toggles are gated on renderer capabilities.
  4. For embedders: verify the renderer is fiber-based before forwarding 'overrideSuspenseMilestone'.

Example fix

// before
bridge.send('overrideSuspenseMilestone', {id, rendererID, value});

// after
if (typeof renderer.findFiberByHostInstance === 'function') {
  bridge.send('overrideSuspenseMilestone', {id, rendererID, value});
}
Defensive patterns

Strategy: validation

Validate before calling

const isFiberRenderer = renderer =>
  typeof renderer.findFiberByHostInstance === 'function';
if (isFiberRenderer(renderer)) {
  bridge.send('overrideSuspenseMilestone', {id, rendererID, value});
}

Type guard

function isFiberRenderer(renderer) {
  return typeof renderer.findFiberByHostInstance === 'function';
}

Try / catch

try {
  bridge.send('overrideSuspenseMilestone', {id, rendererID, value});
} catch (error) {
  if (/not supported by this renderer/.test(error.message)) return;
  throw error;
}

Prevention

When it happens

Trigger: The DevTools frontend sends the 'overrideSuspenseMilestone' message (canary debug action for suspending-at-milestone behavior) while the target renderer is the legacy (v15) adapter.

Common situations: Canary/experimental DevTools used against a production React 15 app; mixed-version multi-root pages; milestone-debug commands broadcast to all attached renderers including a legacy one.

Related errors


AI-assisted analysis of facebook/react@eafeac097b (2026-08-21). Data as JSON: /api/errors/21238211dfb02dda. Report an issue: GitHub.