可以通过cava_csr=true或者__csr=1来触发CSR渲染
可以在F12中用来查看由前端请求的接口
CSR(客户端渲染,Client-Side Rendering)和 SSR(服务端渲染,Server-Side Rendering)是现代Web应用中两种主流的页面渲染方式,它们在数据加载、性能、SEO等方面有显著区别。以下是详细对比:
1. 核心区别
| 特性 | CSR(客户端渲染) | SSR(服务端渲染) |
|---|---|---|
| 渲染位置 | 浏览器(客户端)动态生成HTML | 服务器直接生成完整HTML并返回 |
| 首屏加载 | 较慢(需先加载JS,再渲染) | 较快(直接返回渲染好的HTML) |
| SEO友好性 | 较差(初始HTML为空,内容由JS动态插入) | 优秀(搜索引擎可直接抓取完整内容) |
| 交互体验 | 流畅(后续页面切换通过前端路由,无需重新加载) | 每次交互可能需刷新页面(除非结合SPA技术) |
| 服务器负载 | 较低(仅提供数据和静态资源) | 较高(需处理渲染逻辑,消耗CPU和内存) |
| 适用场景 | 动态交互多的应用(如管理后台、社交平台) | 内容型网站(如新闻、电商、博客) |
2. 详细对比
(1) 渲染流程
- CSR :
- 浏览器请求服务器,返回一个几乎空的HTML(仅包含
<div id="root"></div>和JS链接)。 - 浏览器加载JS文件(如React/Vue的bundle)。
- JS在客户端执行,通过API请求数据并动态生成DOM。
- 用户看到内容(需等待JS加载和渲染完成)。
- 浏览器请求服务器,返回一个几乎空的HTML(仅包含
- SSR :
- 浏览器请求服务器,服务器直接运行应用逻辑(如Node.js服务)。
- 服务器生成完整的HTML(包含数据),直接返回给浏览器。
- 浏览器直接渲染HTML,用户立即看到内容。
- 后续交互可能通过前端路由或重新请求SSR页面。
(2) 性能对比
- 首屏速度 :
- SSR更快(直接返回渲染好的页面)。
- CSR需等待JS下载和执行,可能出现"白屏时间"。
- 后续导航 :
- CSR通过前端路由(如React Router)实现无刷新切换,体验流畅。
- SSR每次导航需重新请求完整HTML(除非结合SPA技术,如Next.js的动态导入)。
(3) SEO友好性
- SSR :
- 搜索引擎爬虫直接获取完整HTML,内容易被索引。
- 适合需要SEO的页面(如商品详情、文章)。
- CSR :
- 初始HTML为空,内容由JS动态插入,爬虫可能无法抓取(除非使用预渲染或SSR降级)。
- 需通过服务端预渲染(如Prerender)或SSR框架(如Next.js)解决。
(4) 开发复杂度
- CSR :
- 开发简单(前端框架(React/Vue)自动处理DOM更新)。
- 需处理数据获取、状态管理(如Redux/Vuex)。
- SSR :
- 需服务端支持(如Node.js、PHP)。
- 需处理服务端和客户端的状态同步(如hydration,即客户端"接管"服务端渲染的DOM)。
- 调试更复杂(需区分服务端和客户端代码)。
(5) 服务器成本
- CSR :
- 服务器仅提供静态资源和API,成本低。
- SSR :
- 服务器需处理渲染逻辑,高并发时需更多资源(CPU、内存)。
3. 混合方案(SSR + CSR)
现代框架(如Next.js、Nuxt.js)支持混合渲染,结合两者优势:
- 首屏SSR:快速展示内容,提升SEO。
- 后续CSR:通过前端路由实现无刷新导航,提升交互体验。
- 预渲染:对静态页面提前生成HTML,减少服务器压力。
4. 如何选择?
- 选CSR :
- 应用以交互为主(如管理后台、仪表盘)。
- 不依赖SEO,或已通过其他方式解决(如预渲染)。
- 团队熟悉前端框架(React/Vue)。
- 选SSR :
- 内容型网站(如新闻、电商)。
- 需要快速首屏加载和SEO优化。
- 团队具备全栈能力(服务端+前端)。
5. 示例代码对比
CSR(React示例)
jsx
`// 客户端渲染:初始HTML为空,内容由JS动态插入
function App() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/data').then(res => res.json()).then(setData);
}, []);
return <div>{data ? data.content : 'Loading...'}</div>;
}`
SSR(Next.js示例)
jsx
`// 服务端渲染:直接在服务端获取数据并渲染HTML
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } };
}
function App({ data }) {
return <div>{data.content}</div>;
}`
总结
- CSR:适合动态交互,但需解决SEO和首屏性能。
- SSR:适合内容展示,但开发复杂度和服务器成本较高。
- 混合方案:现代框架(如Next.js)是折中选择,兼顾两者优势。