<!--
  Note: if the issue is about documentation or the website, please file it at:
  https://github.com/reactjs/reactjs.org/issues/new
-->

**Do you want to request a *feature* or report a *bug*?**

feature

**What is the current behavior?**

When `react-dom` is loaded from CDN like `<script src="https://cdn.jsdelivr.net/npm/react-dom@16.12.0/umd/react-dom.development.js"></script>`, `react-refresh` failed to inject hook into devtools.

I've created a related issue here: https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/13

We should find a way to invoke `injectIntoGlobalHook` function from `react-refresh/runtime`, however this file is in cjs format so we cannot currently do this in a simple way.

**What is the expected behavior?**

I'd like `react-refresh` to publish runtime as a umd bundle so we can reference it from CDN and put it before `react-dom`'s `<script>` element, then invoke `injectIntoGlobalHook` in the right place.

**Which versions of React, and which browser / OS are affected by this issue? Did this work in previous versions of React?**

- `react-dom`: 16.12.0
- `react-refresh`: 0.7.0
failedRoots.delete(root);
        if (rootElements !== null) {
          rootElements.set(root, children);
        }
      }
      return oldOnScheduleFiberRoot.apply(this, arguments);
    };
    hook.onCommitFiberRoot = function(
      id: number,
      root: FiberRoot,
      maybePriorityLevel: mixed,
      didError: boolean,
    ) {
      const helpers = helpersByRendererID.get(id);
      if (helpers === undefined) {
        return;
      }
      helpersByRoot.set(root, helpers);
      const current = root.current;
      const alternate = current.alternate;
       We need to determine whether this root has just (un)mounted.
       This logic is copy-pasted from similar logic in the DevTools backend.
       If this breaks with some refactoring, you'll want to update DevTools too.
      if (alternate !== null) {
        const wasMounted =
          alternate.memoizedState != null &&
          alternate.memoizedState.element != null;
        const isMounted =
          current.memoizedState != null &&
          current.memoizedState.element != null;