文章目录

牛客面经整理:美团前端二面(含 Node / Koa / 部署)(十四)

收录日期:2026-04-23
关键词:前端、Node、Koa、部署、工程化、浏览器

1. 项目技术点介绍(怎么讲)

参考答案

建议用“背景-目标-方案-难点-结果”结构,并准备好下钻点。

  • 背景与目标:解决什么业务问题、指标是什么(转化/耗时/稳定性)。
  • 方案:模块拆分、关键链路、技术选型理由(而不是罗列技术名词)。
  • 难点:性能、状态复杂度、兼容性、工程化、稳定性与监控。
  • 结果:用数据说明(首屏、包体、错误率、QPS、成本)。

2. Node 事件循环(浏览器 vs Node 有什么不同)

参考答案

  • Node 事件循环是分阶段的(常见说法:timers → pending callbacks → idle/prepare → poll → check → close callbacks)。
  • setTimeout 在 timers 阶段,setImmediate 在 check 阶段;I/O 回调通常在 poll 相关阶段。
  • 微任务:Promise 的 microtask 队列;另外 Node 还有 process.nextTick(优先级更高,容易饿死 I/O,需要谨慎)。
  • 追问点:为什么某些输出顺序在 Node 和浏览器不一样(阶段不同 + nextTick 特性)。

3. Koa “洋葱圈”模型是什么?为什么这样设计?

参考答案

  • 本质:中间件是 async (ctx, next)await next() 之前是“请求阶段”,之后是“响应阶段”,形成前后包裹。
  • 好处:
    • 统一处理:日志、鉴权、异常捕获、耗时统计可以在一处“包住”后续逻辑。
    • 组合性强:中间件可插拔,顺序决定链路。
  • 常见坑:漏写 await next() 会导致后续中间件不执行;异常需要最外层中间件捕获。

4. Express 和 Koa 的区别

参考答案

  • 中间件模型:Express 更偏线性(传统回调链),Koa 是基于 async/await 的洋葱模型。
  • 内置能力:Express 内置更多功能;Koa 更轻,很多能力靠社区中间件组合。
  • 错误处理:Koa 倾向统一 try/catch;Express 需要按约定传递 next(err) 或错误中间件。
  • 风格:Koa 更“底层/灵活”,适合搭框架;Express 更“开箱即用”。

5. Node 全局变量有哪些?需要注意什么?

参考答案

  • 常见全局:globalprocessBuffersetTimeout/setImmediate__dirname/__filename(CommonJS 环境)。
  • 注意点:
    • 全局可变状态会带来测试困难、并发污染与内存泄漏。
    • 生产里少挂 global.xxx,用依赖注入或模块封装替代。

6. 项目部署方案怎么设计(前端常见)

参考答案

  • 静态站点:构建产物上传 CDN/对象存储,Nginx/边缘节点托管。
  • 容器化:构建镜像(Nginx + 静态资源),走 K8s/发布平台。
  • 灰度与回滚:
    • 产物带 hash(内容寻址),新版本发布不覆盖旧资源。
    • 入口 HTML 控制版本切换,支持快速回滚。
  • 配套:SourceMap 权限管控、健康检查、监控报警(404/JS error/白屏)。

7. Vue 和 React 对比(重点讲差异与取舍)

参考答案

  • 心智模型:Vue 更“模板 + 响应式”,React 更“函数式 + 状态驱动 UI”。
  • 更新机制:Vue 依赖追踪更细粒度(按需触发);React 依赖 props/state 变化触发渲染,靠 memo/shouldComponentUpdate 优化。
  • 生态与工程:React 选择更自由(路由/状态/构建),Vue 更偏官方整合。
  • 取舍回答:结合团队习惯、可维护性、性能与生态成熟度给出理由。

8. Vuex 的单向数据流是什么?

参考答案

  • 数据流:View 触发 action/commit → mutation 修改 state → state 驱动 View 更新。
  • 好处:状态变更可追踪、可回放,方便调试与协作。
  • 追问:为什么 mutation 设计成同步(方便追踪与时间旅行调试)。

9. HTML5 新增/常用特性有哪些?

参考答案

  • 语义化标签:header/nav/main/section/article/footer
  • 多媒体与图形:audio/video/canvas/svg
  • 表单增强:email/url/daterequiredpatternplaceholder
  • 存储与通信:localStorage/sessionStoragepostMessageWebSockethistory API。

10. Doctype 的作用是什么?

参考答案

  • 作用:告诉浏览器使用“标准模式”渲染,避免怪异模式(Quirks Mode)导致盒模型与布局行为不一致。
  • 现代项目基本使用:<!DOCTYPE html>

11. Storage 和 Cookie 的区别

参考答案

  • Cookie:会随请求自动携带到同域;体积小(通常 ~4KB);可设置 HttpOnly/Secure/SameSite;适合会话与鉴权。
  • localStorage/sessionStorage:不随请求携带;容量更大;仅前端可读写(易受 XSS 影响);适合非敏感缓存。
  • 安全建议:敏感 token 尽量放 HttpOnly Cookie,并配合 CSRF 防护(SameSite/双重 cookie/CSRF token)。

12. Flex 属性(常见追问:flex: 1 是什么)

参考答案

  • flexflex-grow flex-shrink flex-basis 简写。
  • flex: 1 常等价于 flex: 1 1 0%(不同浏览器/规范实现细节略有差异,面试回答抓住核心即可)。
  • 常用:两端对齐(justify-content: space-between)、居中(align-items/justify-content: center)。

13. ES5 继承怎么做?原型链是什么?

参考答案

  • 原型链:对象通过 [[Prototype]] 链式查找属性,直到 null 结束。
  • ES5 继承常见实现:
    • 构造函数继承(借用构造函数):Parent.call(this)(解决实例属性)。
    • 原型链继承:Child.prototype = Object.create(Parent.prototype)(解决方法共享)。
    • 组合继承:两者结合,最后修正 constructor 指向。

14. 跨域是什么?怎么解决?

参考答案

  • 来源:浏览器同源策略限制读取跨域资源(协议/域名/端口任一不同即跨域)。
  • 解决方案:
    • CORS(推荐):服务端配置 Access-Control-Allow-Origin 等。
    • 反向代理:同域转发到后端(Nginx/Vite proxy)。
    • JSONP(历史,GET 限制)。
    • postMessage(跨窗口通信)。
  • 注意:跨域请求可能已到达服务端,但响应被浏览器拦截;不要把“跨域”当“后端没收到”。

15. Cookie 的 SameSite 属性是什么?有什么用?

参考答案

  • 目的:限制第三方上下文携带 Cookie,降低 CSRF 风险。
  • 取值:
    • Strict:最严格,跨站不带。
    • Lax:一般跨站不带,但顶级导航 GET 等场景可能会带(更适合大多数站点)。
    • None:允许跨站携带,但必须同时设置 Secure(HTTPS)。
  • 落地:鉴权 Cookie 常用 LaxNone+Secure(视业务是否需要第三方跳转/嵌入)。