客户端渲染 (CSR)
在 React 的客户端渲染 (CSR) 中,浏览器下载一个最小的 HTML 页面和该页面所需的 JavaScript。然后,JavaScript 被用于更新 DOM 并渲染页面。当应用首次加载时,用户可能会在看到完整页面之前注意到轻微的延迟,这是因为直到所有 JavaScript 被下载、解析和执行后,页面才完全渲染。
页面首次加载后,导航到同一网站上的其他页面通常会更快,因为只需获取必要的数据,并且 JavaScript 可以重新渲染页面的部分内容,而无需完全刷新页面。
在 Next.js 中,您可以通过两种方式实现客户端渲染:
- 在页面中使用 React 的
useEffect()钩子,而不是服务器端渲染方法(getStaticProps和getServerSideProps)。 - 使用数据获取库(如 SWR 或 TanStack Query)在客户端获取数据(推荐)。
以下是在 Next.js 页面中使用 useEffect() 的示例:
pages/index.js
import React, { useState, useEffect } from 'react'
export function Page() {
const [data, setData] = useState(null)
useEffect(() => {
const fetchData = async () => {
const response = await fetch('https://api.example.com/data')
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`)
}
const result = await response.json()
setData(result)
}
fetchData().catch((e) => {
// handle the error as needed
console.error('An error occurred while fetching the data: ', e)
})
}, [])
return <p>{data ? `Your data: ${data}` : 'Loading...'}</p>
}在上面的示例中,组件最初渲染 Loading...。然后,一旦数据获取完成,它会重新渲染并显示数据。
尽管在 useEffect 中获取数据是您可能在较旧的 React 应用程序中看到的模式,但我们建议使用数据获取库以获得更好的性能、缓存、乐观更新等。以下是使用 SWR 在客户端获取数据的最小示例:
pages/index.js
import useSWR from 'swr'
export function Page() {
const { data, error, isLoading } = useSWR(
'https://api.example.com/data',
fetcher
)
if (error) return <p>Failed to load.</p>
if (isLoading) return <p>Loading...</p>
return <p>Your Data: {data}</p>
}须知:
请记住,CSR 会影响 SEO。一些搜索引擎爬虫可能不会执行 JavaScript,因此只能看到应用程序的初始空状态或加载状态。对于互联网连接较慢或设备较慢的用户,这也可能导致性能问题,因为他们需要等待所有 JavaScript 加载和运行才能看到完整页面。Next.js 提倡一种混合方法,允许您根据应用程序中每个页面的需求,结合使用服务器端渲染、静态站点生成和客户端渲染。在 App Router 中,您还可以使用 带 Suspense 的加载 UI 来在页面渲染时显示加载指示器。
这有帮助吗?