<!--
  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
forceReset: boolean,
  fullKey: string | null, 
  getCustomHooks: () => Array<Function>,
|};
type RendererHelpers = {|
  findHostInstancesForRefresh: FindHostInstancesForRefresh,
  scheduleRefresh: ScheduleRefresh,
  scheduleRoot: ScheduleRoot,
  setRefreshHandler: SetRefreshHandler,
|};
if (!__DEV__) {
  throw new Error(
    'React Refresh runtime should not be included in the production bundle.',
  );
}
const PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
const allFamiliesByID: Map<string, Family> = new Map();
const allFamiliesByType: 
WeakMap<any, Family> | Map<any, Family> = new PossiblyWeakMap();
const allSignaturesByType: 
WeakMap<any, Signature> | Map<any, Signature> = new PossiblyWeakMap();
const updatedFamiliesByType: 
WeakMap<any, Family> | Map<any, Family> = new PossiblyWeakMap();
let pendingUpdates: Array<[Family, any]> = [];
let helpersByRendererID: Map<number, RendererHelpers> = new Map();
let helpersByRoot: Map<FiberRoot, RendererHelpers> = new Map();
let mountedRoots: Set<FiberRoot> = new Set();
 If a root captures an error, we remember it so we can retry on edit.
let failedRoots: Set<FiberRoot> = new Set();
 In environments that support WeakMap, we also remember the last element for every root.