<!--
  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
It needs to be weak because we do this even for roots that failed to mount.
 If there is no WeakMap, we won't attempt to do retrying.
let rootElements: WeakMap<any, ReactNodeList> | null = 
  typeof WeakMap === 'function' ? new WeakMap() : null;
let isPerformingRefresh = false;
function computeFullKey(signature: Signature): string {
  if (signature.fullKey !== null) {
    return signature.fullKey;
  }
  let fullKey: string = signature.ownKey;
  let hooks;
  try {
    hooks = signature.getCustomHooks();
  } catch (err) {
    
    
    
    signature.forceReset = true;
    signature.fullKey = fullKey;
    return fullKey;
  }
  for (let i = 0; i < hooks.length; i++) {
    const hook = hooks[i];
    if (typeof hook !== 'function') {
      
      signature.forceReset = true;
      signature.fullKey = fullKey;
      return fullKey;
    }
    const nestedHookSignature = allSignaturesByType.get(hook);