import type * as React from 'react'; import * as ReactDOM from 'react-dom'; type ContainerType = Element | DocumentFragment; const { version } = ReactDOM; /** * 获取 React 主版本号 * * Get React major version * @returns 主版本号 | Major version */ function getReactMajorVersion(): number { return Number((version || '').split('.')[0]); } const getRenderer = (() => { let rendererPromise: Promise<{ render: (node: React.ReactElement, container: ContainerType) => unknown; unmount: (container: ContainerType) => unknown; }>; return () => { if (!rendererPromise) { const majorVersion = getReactMajorVersion(); if (majorVersion >= 18) { rendererPromise = import('./render18'); } else { rendererPromise = import('./render16'); } } return rendererPromise; }; })(); /** * 渲染 React 节点(兼容 React 16 ~ 19) * * Render React node(Compatible with React 16 ~ 19) * @param node - React 节点 | React node * @param container - 容器 | Container * @returns Promise | Promise */ export async function render(node: React.ReactElement, container: ContainerType) { const { render } = await getRenderer(); return render(node, container); } /** * 卸载 React 节点(兼容 React 16 ~ 19) * * Unmount React node(Compatible with React 16 ~ 19) * @param container - 容器 | Container * @returns Promise | Promise */ export async function unmount(container: ContainerType) { const { unmount } = await getRenderer(); return unmount(container); }