真实面经题目 · 原创解析
Vite 和 Next.js 都用过,你会做 SSR 吗?
这题考察 SSR 全链路理解。回答要说明服务端渲染、数据获取、HTML 注水、客户端 hydration、构建产物和 Next.js 与 Vite 的职责差异。
真实面经题目 · 原创解析
这题考察 SSR 全链路理解。回答要说明服务端渲染、数据获取、HTML 注水、客户端 hydration、构建产物和 Next.js 与 Vite 的职责差异。
SSR 是服务端收到请求后匹配路由、获取数据、把组件渲染成 HTML 返回给浏览器,浏览器先展示 HTML,再加载客户端 JS 做 hydration 绑定事件。Next.js 把路由、数据获取、服务端组件或页面渲染、构建和部署约定都封装好了;Vite 更偏构建工具,自建 SSR 时要自己准备服务端入口、客户端入口、路由匹配、数据预取、状态注水、manifest 读取、资源标签注入和生产服务器。SSR 的收益是首屏 HTML 和 SEO 友好,但成本是服务端压力、缓存复杂度、hydration 不一致、客户端包体和部署链路复杂。
请求进入服务端后,根据 URL 匹配路由,执行页面级数据获取,把数据传给组件树,用 renderToString 或流式渲染生成 HTML,再把初始状态安全注入页面,浏览器加载 JS 后 hydrate。
服务端 HTML 只是静态结构,事件和客户端状态要靠 hydration 接管。服务端和客户端渲染结果必须一致,否则会出现 hydration mismatch,例如随机数、时间、浏览器专属 API 或环境分支导致差异。
Next.js 内建文件路由、数据获取、SSR/SSG/ISR、API 路由、资源优化、代码分割和部署约定。使用者更多是在框架约束内选择渲染模式和缓存策略。
Vite 提供开发期中间件、模块加载和生产构建能力,但路由、数据加载、HTML 模板、manifest 资源注入、错误处理、缓存、服务器部署通常要自己或借助上层框架实现。
服务端获取的数据要序列化给客户端复用,避免 hydration 后重复请求。注入 JSON 时要处理 XSS 转义,不能把用户输入或敏感字段原样写进 script。
SSR 可以改善首屏可见和爬虫抓取,但会增加 TTFB、服务器 CPU、缓存和运维复杂度。适合 SEO、首屏敏感和公开内容页面;强交互后台系统不一定需要全量 SSR。
CSR 主要在浏览器渲染,SSR 每次或按策略在服务端请求时渲染,SSG 在构建期生成 HTML。三者在首屏、SEO、实时性和部署成本上取舍不同。
服务端和客户端渲染不同的时间、随机数、用户环境、localStorage、window 尺寸、异步数据或条件分支都会导致 mismatch。
生产构建后文件名通常带 hash。服务端需要通过 manifest 找到当前页面依赖的 JS/CSS 文件,正确注入资源标签。
可以按页面、数据接口、用户维度和权限维度缓存,公开页面可用 CDN 或 ISR,个性化页面要谨慎区分用户上下文,避免缓存串数据。