用途:DOM 组件让 Web 代码在原生平台(iOS 的 WKWebView、Android 的 WebView)中原样运行,在 Web 端则直接渲染、不套 WebView。适合使用仅支持 Web 的库(图表、语法高亮、富文本编辑器)、迁移现有 React Web 组件、需要复杂 HTML/CSS 布局、iframe 嵌入、Canvas 或 WebGL 的场景。若追求原生性能、界面简单、需要深度原生集成,或用于 _layout 布局路由,则不应使用。
主要能力:文件顶部加 'use dom'; 指令即可定义组件;每个文件只能有一个默认导出,不能内联定义或与原生组件混写;props 必须可序列化(字符串、数字、布尔、数组、普通对象);CSS 需写在组件文件内。每个组件接收 dom 属性(类型 import("expo/dom").DOMProps),可配置 scrollEnabled、contentInsetAdjustmentBehavior、style 等。可把异步函数作为 props 传入,向 WebView 暴露原生能力(如 Alert、存储)。
使用方式:在原生父组件中像普通组件一样导入使用,例如 <WebChart data={[10,20,30]} dom={{ style: { height: 300 } }} />。expo-router 的 Link 与 useRouter 可在 DOM 组件内使用;useLocalSearchParams、useGlobalSearchParams、usePathname、useSegments、useRootNavigation、useRootNavigationState 等需同步访问原生路由状态的 Hook 不可直接用,应在原生父组件读取后以 props 传入。可用 expo/dom 的 IS_DOM 判断运行环境。资源建议用 require 引入而非 public 目录。
限制:WebView 有额外开销,大型 DOM 组件可能影响性能;WebView 拥有独立 JavaScript 上下文,无法与原生直接共享状态;Web 端渲染与原生 WebView 可能略有差异,需多平台测试;Web 端会忽略 dom 属性。开发时支持热重载。