全栈高频面试题答案速查
这页把全栈工程师常见问题整理成“可直接说出口”的答案。面试时不要机械背诵,最好结合自己项目经历补一句“我在项目里怎么做过”。
计算机基础
从输入 URL 到页面展示发生了什么?
浏览器先解析 URL,然后查询 DNS 得到服务器 IP。接着建立 TCP 连接,如果是 HTTPS,还会进行 TLS 握手。连接建立后浏览器发送 HTTP 请求,服务端处理后返回 HTML、CSS、JS 等资源。浏览器解析 HTML 生成 DOM,解析 CSS 生成 CSSOM,执行 JS,最后布局、绘制并展示页面。
项目化补充:如果页面打不开,我会按 DNS、网络连接、证书、网关、服务状态、静态资源和接口请求逐层排查。
HTTP、HTTPS、WebSocket 分别适合什么场景?
HTTP 适合普通请求响应,比如接口查询和提交表单。HTTPS 在 HTTP 上增加 TLS 加密,适合所有生产环境,尤其是登录、支付和用户数据。WebSocket 适合服务端主动推送和双向实时通信,比如聊天、协作编辑、实时通知和监控面板。
项目化补充:普通后台系统多数接口用 HTTPS REST API,实时通知可以用 WebSocket,低频通知也可以用轮询或 SSE。
进程和线程有什么区别?
进程是资源分配的基本单位,线程是 CPU 调度的基本单位。一个进程可以包含多个线程,线程共享进程内存。进程隔离性更好,线程通信更方便但也更容易出现并发安全问题。
项目化补充:后端服务并发处理请求时,要关注线程池、连接池、阻塞 I/O 和共享资源竞争。
如何查看一个服务是否正在监听端口?
可以用 lsof -i :端口、netstat 或 ss 查看端口占用。还可以用 curl 请求健康检查接口,确认服务不仅启动了,而且能正常响应。
项目化补充:线上排查时我不会只看进程存在,还会看端口、健康检查、日志和上游网关是否能访问。
前端工程
如何设计一个可复用的表格组件?
我会先抽象稳定能力:列配置、数据源、分页、排序、筛选、loading、empty、错误状态、批量选择和操作按钮。业务差异通过插槽或 render 函数扩展,组件内部不绑定具体业务接口。
项目化补充:表格组件最重要的是边界清晰。通用表格负责展示和交互,业务页面负责请求数据和处理业务动作。
页面首屏加载慢怎么排查?
先用浏览器 Performance 和 Network 判断瓶颈:是资源下载慢、JS 执行慢、接口慢,还是渲染慢。常见优化包括路由懒加载、拆包、压缩资源、图片懒加载、接口并行、减少首屏不必要依赖和使用 CDN。
项目化补充:我会用数据验证优化效果,比如 LCP、JS 包体积、接口耗时和用户可交互时间。
大列表渲染卡顿怎么优化?
优先减少一次性渲染的 DOM 数量。可以分页、虚拟列表、懒加载,列表项组件要轻量,避免复杂计算放在渲染里。对于筛选和搜索,可以加防抖,避免每次输入都重新渲染和请求。
项目化补充:几千条数据一次性渲染时,虚拟列表通常比单纯加 memo 或 computed 更有效。
防抖和节流有什么区别?
防抖是连续触发时只执行最后一次,适合搜索输入、窗口 resize 后重新计算。节流是固定时间内最多执行一次,适合滚动、拖拽、频繁点击。
项目化补充:搜索框我会用防抖,滚动加载和拖拽位置计算我会用节流。
如何处理前端权限路由和按钮权限?
前端根据用户角色或权限点生成菜单和路由,按钮通过权限指令或组件判断是否展示。但前端权限只负责体验,真正的数据和操作权限必须由后端接口校验。
项目化补充:刷新页面后要能恢复权限路由,通常登录后拉取用户信息和权限菜单,再动态注册路由。
后端与 API
如何设计 RESTful API?
RESTful API 用资源表达 URL,用 HTTP 方法表达动作。比如 GET /users 查询列表,POST /users 创建用户,PATCH /users/:id 更新用户,DELETE /users/:id 删除用户。接口要有统一参数校验、错误码、鉴权和日志。
项目化补充:RESTful 的价值是语义稳定,让前端和后端都能预测接口行为。
如何设计统一错误返回?
我会返回结构化错误信息,比如 code、message、details、requestId。code 给程序判断,message 给用户或开发者阅读,requestId 用来查日志。
示例:
{
"code": "USER_NOT_FOUND",
"message": "User not found",
"requestId": "req_123"
}项目化补充:不要所有错误都返回 200,也不要只返回一个字符串,否则前端不好处理,线上也不好排查。
JWT、Session、Cookie 怎么选?
Session 是服务端保存会话,客户端通常用 Cookie 保存 session id,适合传统 Web。JWT 是自包含 token,适合前后端分离和分布式服务,但主动失效更麻烦。Cookie 是浏览器存储机制,可以配合 HttpOnly、Secure、SameSite 提高安全性。
项目化补充:我倾向于短期 access token + refresh token,并在服务端保留撤销能力。
如何保证创建订单接口幂等?
可以使用幂等 key、唯一索引、订单状态机和事务控制。客户端提交订单时生成 requestId 或 idempotencyKey,后端先检查这个 key 是否已经处理过,避免重复创建订单。
项目化补充:前端禁用按钮只能改善体验,真正防重复必须在后端兜底。
接口超时怎么处理?
客户端要设置超时时间和友好提示,服务端要排查慢 SQL、第三方服务、锁等待、线程池和连接池。对于耗时任务,可以改成异步任务,先返回任务 ID,再轮询或推送结果。
项目化补充:导出大文件、AI 总结、批量处理这类任务通常不适合同步接口一直等。
数据库与缓存
索引是什么?哪些字段适合建索引?
索引用来加速查询,本质是额外的数据结构。适合加在高频查询、过滤、排序、关联的字段上,比如用户 ID、订单状态、创建时间。索引会增加写入成本和存储成本,所以不是越多越好。
项目化补充:建索引前要看真实查询 SQL 和执行计划,不要凭感觉乱加。
为什么索引会失效?
常见原因包括对索引字段使用函数、隐式类型转换、前置模糊匹配、联合索引不满足最左前缀、返回数据量过大、or 条件不合理等。排查时用 EXPLAIN 看执行计划。
项目化补充:如果查询条件经常组合出现,要考虑联合索引的字段顺序。
事务 ACID 是什么?
ACID 指原子性、一致性、隔离性、持久性。原子性保证一组操作要么都成功要么都失败;一致性保证数据从一个正确状态到另一个正确状态;隔离性处理并发事务互相影响;持久性保证提交后的数据不会丢。
项目化补充:下单、支付、库存扣减这类流程必须认真设计事务边界。
缓存穿透、击穿、雪崩怎么解决?
缓存穿透是查不存在的数据,可以缓存空值、参数校验或布隆过滤器。缓存击穿是热点 key 过期瞬间大量请求打到数据库,可以用互斥锁、热点 key 不过期或提前刷新。缓存雪崩是大量 key 同时失效,可以给过期时间加随机值、限流降级、多级缓存。
项目化补充:缓存问题的核心不是“加 Redis”,而是保护数据库并控制一致性风险。
缓存和数据库一致性怎么处理?
常见做法是先更新数据库,再删除缓存,并设置缓存过期时间兜底。对一致性要求不高的场景接受最终一致性;对强一致场景直接读数据库或走事务流程。
项目化补充:缓存不是事实来源,数据库才是最终数据源。
网络与安全
XSS 是什么?怎么防?
XSS 是攻击者把恶意脚本注入页面,让脚本在用户浏览器执行。防护方式包括输出转义、避免直接渲染不可信 HTML、设置 CSP、Cookie 使用 HttpOnly、对输入做过滤。
项目化补充:Vue 的 v-html 和 React 的 dangerouslySetInnerHTML 都要谨慎使用。
CSRF 是什么?怎么防?
CSRF 是攻击者诱导用户浏览器带着登录态向目标网站发送请求。防护方式包括 CSRF Token、SameSite Cookie、校验 Origin / Referer、关键操作二次确认。
项目化补充:如果鉴权 token 放在 Authorization header 中,CSRF 风险会降低,但仍要防 XSS。
SQL 注入怎么防?
核心是不要拼接用户输入,使用参数化查询或 ORM 的参数绑定。还要做输入校验、最小权限数据库账号、错误信息不要暴露 SQL 细节。
项目化补充:前端校验不能代替后端防护。
如何设计 RBAC 权限模型?
RBAC 基本模型是用户、角色、权限。用户绑定角色,角色绑定权限。权限可以分成菜单权限、按钮权限、接口权限和数据权限。后端必须校验接口和数据权限,前端只负责展示控制。
项目化补充:复杂系统还会引入部门、资源归属和数据范围。
DevOps 与部署
CI/CD 一般包含哪些步骤?
一般包括拉取代码、安装依赖、静态检查、测试、构建、生成产物、部署到环境、健康检查和通知。生产发布还可能包括灰度、审批和回滚策略。
项目化补充:CI/CD 的价值是减少人工操作,让每次发布更稳定、可追踪。
Docker 解决什么问题?
Docker 把应用和运行环境打包成镜像,减少环境差异导致的问题。它让部署更一致,也方便扩容和回滚。
项目化补充:Dockerfile 要注意镜像体积、依赖缓存、环境变量和敏感信息不要写进镜像。
Nginx 常见用途有哪些?
Nginx 可以托管静态资源、反向代理、负载均衡、HTTPS 终止、gzip 压缩、缓存和路由转发。前端项目常用 Nginx 部署静态文件,并把 /api 转发到后端。
项目化补充:前端 history 路由刷新 404,通常需要 Nginx fallback 到 index.html。
发布后白屏怎么排查?
先看浏览器控制台和 Network,确认 JS/CSS 是否 404、是否缓存了旧资源、环境变量是否错误、接口是否跨域或报错。再看最近发布内容、CDN 缓存、Nginx 配置和构建产物。
项目化补充:如果影响范围大,先回滚或切回旧版本,再定位根因。
测试与质量
哪些功能必须写自动化测试?
登录、支付、权限、订单状态流转、核心表单、核心接口、数据迁移等高风险功能优先写测试。普通展示页面可以少测,关键业务链路必须测。
项目化补充:测试投入要看风险,不是所有代码都追求 100% 覆盖率。
单元测试、集成测试、E2E 测试有什么区别?
单元测试验证函数或组件的局部逻辑。集成测试验证多个模块协作。E2E 测试模拟用户从页面到后端的完整流程。
项目化补充:核心链路通常需要 E2E,复杂逻辑适合单元测试,接口联动适合集成测试。
Code Review 主要看什么?
主要看需求是否实现、逻辑是否正确、边界情况、错误处理、安全风险、性能问题、可读性、是否有测试、是否影响其他模块。
项目化补充:Code Review 不只是挑格式,而是提前发现线上风险。
可观测性和排障
用户反馈“提交失败”,你怎么定位?
先确认用户、时间、操作页面和请求。通过前端日志拿到 requestId,再查后端日志,确认是参数错误、鉴权失败、服务异常、数据库问题还是第三方接口失败。最后看是否需要补提示、补监控或修复逻辑。
项目化补充:没有 requestId 时,排查会非常痛苦,所以链路追踪要提前设计。
requestId 为什么重要?
requestId 可以把一次请求从前端、网关、后端、数据库日志串起来。线上问题发生时,可以快速定位一条请求的完整链路。
项目化补充:全栈系统最好每个响应都返回 requestId,错误提示里也可以展示给客服或研发排查。
线上事故应该先定位根因还是先恢复服务?
如果影响用户或核心业务,应该先止血,比如回滚、降级、扩容、关闭 feature flag。服务恢复后再完整定位根因和复盘。
项目化补充:事故处理顺序是先降低影响,再追求完整解释。
系统设计
如何设计一个登录系统?
需要包括注册、登录、密码哈希、登录态、token 过期和刷新、权限校验、退出登录、失败限流、日志审计。前端处理表单校验和错误提示,后端负责真正鉴权和授权。
项目化补充:不要把权限只放前端,敏感接口必须后端校验。
如何设计文件上传系统?
小文件可以直接上传。大文件需要分片上传、断点续传、进度展示、失败重试、文件 hash 校验和合并。后端保存 metadata,文件可以放对象存储。还要处理文件类型校验、权限、病毒扫描和访问控制。
项目化补充:私有文件不要直接给公开 URL。
如何设计通知系统?
先区分通知类型:站内信、邮件、短信、WebSocket、Push。核心设计包括通知模板、接收人、发送渠道、消息队列、失败重试、已读未读、频率限制和用户订阅设置。
项目化补充:短信和邮件通常异步发送,不能阻塞主业务流程。
AI 时代的全栈能力
如何把 AI 助手接入业务系统?
先明确场景:问答、总结、客服、搜索还是自动操作。然后设计模型调用、Prompt、权限、RAG 或工具调用、流式输出、错误降级、日志和评估。高风险操作必须经过业务规则和用户确认。
项目化补充:AI 不能绕过原有权限系统,模型看到的数据必须经过权限过滤。
RAG 和微调怎么选?
知识经常变化、需要引用来源、使用企业私有文档时优先 RAG。需要稳定格式、特定风格、特定任务模式时可以考虑微调。很多项目会组合使用:RAG 提供知识,微调改善输出方式。
项目化补充:不要为了显得高级就微调,很多问题先用 RAG、Prompt 和评估解决。
AI 成本突然升高怎么排查?
先看调用量、输入 token、输出 token、模型类型、是否重复请求、是否上下文过长。优化手段包括裁剪 Prompt、缓存高频结果、简单任务用小模型、限制输出长度、设置配额和限流。
项目化补充:AI 功能上线前就应该做 token 监控,否则成本问题很难定位。
产品和沟通
需求不清楚时你会问什么?
我会问目标用户是谁、要解决什么问题、核心流程是什么、边界情况有哪些、验收标准是什么、优先级如何、是否有时间限制、数据从哪里来、权限怎么控制。
项目化补充:全栈工程师不能只等需求文档,要主动把模糊需求拆成可开发任务。
如何评估任务时间?
先拆分任务:页面、接口、数据库、联调、测试、上线。再判断风险点,比如第三方依赖、需求不确定、数据迁移、权限复杂度。估时要预留联调和回归时间。
项目化补充:我会说明不确定项,而不是给一个看起来精确但不可靠的时间。
如何证明自己的方案带来了收益?
用数据说话,比如接口耗时降低、错误率下降、首屏时间减少、转化率提升、人工操作减少、线上故障减少。没有数据时,也可以用可维护性、风险降低和交付效率说明。
项目化补充:面试里讲项目结果时,最好带一个具体指标或前后对比。