--- title: Use React DOM Resource Hints impact: HIGH impactDescription: reduces load time for critical resources tags: rendering, preload, preconnect, prefetch, resource-hints --- ## 使用 React DOM 资源提示 **影响:高(减少关键资源的加载时间)** React DOM 提供了向浏览器提示其即将需要的资源的 API。这些 API 在服务端组件中尤其有用,可以在客户端甚至接收到 HTML 之前就开始加载资源。 - **`prefetchDNS(href)`**:为你预期要连接的域名解析 DNS - **`preconnect(href)`**:与服务器建立连接(DNS + TCP + TLS) - **`preload(href, options)`**:获取你即将使用的资源(样式表、字体、脚本、图片) - **`preloadModule(href)`**:获取你即将使用的 ES 模块 - **`preinit(href, options)`**:获取并执行样式表或脚本 - **`preinitModule(href)`**:获取并执行 ES 模块 **示例(预连接到第三方 API):** ```tsx import { preconnect, prefetchDNS } from 'react-dom' export default function App() { prefetchDNS('https://analytics.example.com') preconnect('https://api.example.com') return
{/* content */}
} ``` **示例(预加载关键字体和样式):** ```tsx import { preload, preinit } from 'react-dom' export default function RootLayout({ children }) { // 预加载字体文件 preload('/fonts/inter.woff2', { as: 'font', type: 'font/woff2', crossOrigin: 'anonymous' }) // 立即获取并应用关键样式表 preinit('/styles/critical.css', { as: 'style' }) return ( {children} ) } ``` **示例(为代码分割路由预加载模块):** ```tsx import { preloadModule, preinitModule } from 'react-dom' function Navigation() { const preloadDashboard = () => { preloadModule('/dashboard.js', { as: 'script' }) } return ( ) } ``` **何时使用每个 API:** | API | 使用场景 | |-----|----------| | `prefetchDNS` | 稍后需要连接的第三方域名 | | `preconnect` | 即将立即请求的 API 或 CDN | | `preload` | 当前页面所需的关键资源 | | `preloadModule` | 可能的下一次导航所需的 JS 模块 | | `preinit` | 必须尽早执行的样式表/脚本 | | `preinitModule` | 必须尽早执行的 ES 模块 | 参考文档:[React DOM 资源预加载 API](https://react.dev/reference/react-dom#resource-preloading-apis)