Files
zhuangang/topics/frontend/ssr/interview.md
T

68 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: frontend.ssr.interview
title: SSR 与 Next.js 面试题
type: interview
domain: frontend
stack: [ssr]
tags: [SSR, Next.js, Nuxt, 水合, 面试]
level: intermediate
related: [frontend.ssr.rendering-modes, frontend.ssr.nextjs-app-router]
week: [7, 16]
---
# SSR 与 Next.js 面试题
## 基础
### 【基础】CSR、SSR、SSG、ISR 有什么区别?
**参考答案**:区别在于 HTML 在哪里、什么时候生成:CSR 在浏览器;SSR 每次请求在服务器;SSG 在构建时;ISR 构建时生成并在过期后后台重新生成。按 SEO 需求、数据更新频率、个性化程度选择,一个站点可以混用。
**追问**:后台管理系统需要 SSR 吗?→ 一般不需要,没有 SEO 需求,CSR 更简单。
### 【基础】什么是水合?为什么会出现水合不匹配?
**参考答案**:浏览器加载 JS 后把交互能力附加到服务端渲染的 HTML 上。服务端和客户端第一次渲染结果不一致时出现不匹配,常见原因:时间、随机数、浏览器专有 API、时区和语言差异、无效的 HTML 嵌套。
**追问**:怎么修复?→ 浏览器专有逻辑放到挂载后执行,保证首次渲染两端一致;确实无法一致的地方使用框架提供的“仅客户端渲染”组件。
### 【基础】Next.js 中服务端组件和客户端组件的区别?
**参考答案**:服务端组件默认,在服务器上运行,可以直接访问数据和密钥,不增加浏览器端 JS,但不能使用状态和事件;客户端组件用 `"use client"` 声明,可以交互,会打包到浏览器。服务端组件可以渲染客户端组件,传递的 props 必须可序列化。
**追问**:边界怎么划分?→ 尽量把客户端组件下沉到需要交互的叶子节点。
## 进阶
### 【进阶】SSR 应用有哪些常见的坑?
**参考答案**:服务端访问浏览器 API;全局单例状态导致跨请求数据串用;个性化页面被 CDN 缓存;慢接口拖慢首屏;内存泄漏(服务端长期运行);环境变量误暴露到客户端。
**追问**:跨请求状态污染怎么避免?→ 每个请求创建新的 store 实例(Pinia、Redux),不使用模块级可变变量保存用户数据。
### 【进阶】Next.js 的路由处理器和 Server Actions 怎么选?
**参考答案**:路由处理器是标准的 HTTP 接口,适合给外部调用、Webhook、流式响应;Server Actions 适合表单提交和页面内的数据变更,可以直接在组件中调用并配合重新验证缓存。两者都要做鉴权和输入校验。
**追问**:Server Actions 安全吗?→ 它本质上也是公开的 HTTP 端点,必须校验身份、权限和参数,不能因为“只在页面里调用”就省略。
### 【进阶】什么是流式 SSR?
**参考答案**:服务器先发送页面外壳和已就绪的部分,慢数据对应的部分用 Suspense 边界包裹,准备好后通过同一个响应继续发送并插入页面。首字节和首屏更快,慢接口不阻塞整页。
**追问**:和 AI 的流式输出是一回事吗?→ 不是。流式 SSR 是页面 HTML 的分块发送;AI 流式输出是接口逐步返回生成的内容,两者可以同时使用。
## 场景题
### 【场景题】公司帮助中心 SEO 很差,同时要加智能客服,你怎么做?
**参考答案**:用 Next.js / Nuxt 重建,文章 SSG + 按需重新验证,个人页面动态渲染且禁止公共缓存;智能客服为客户端组件,通过 BFF 路由处理器鉴权、限流后转发到 AI 服务并透传流。详见[帮助中心场景](scenarios/help-center.md)。
**追问**:文章更新后多久能被看到?→ 取决于重新验证策略:基于时间的会有延迟;CMS 回调触发按路径重新验证可以做到几乎实时。
### 【场景题】Next.js 应用上线后,首屏可见但几秒内点击无反应,为什么?
**参考答案**:HTML 已经显示,但客户端 JS 还没加载和水合完成。排查:客户端组件过多、包体积大、第三方脚本阻塞、主线程长任务。优化:减少客户端组件、拆包和懒加载、延迟加载第三方脚本、关注 INP 指标。
**追问**:怎么量化?→ 看 Core Web Vitals 中的 INP 和 TBT,以及包体积分析报告。