前端面试常问问题[From CV]

作为前端面试官,我会针对简历中的技术栈、项目经历和技能细节提出以下20个问题,并附上参考答案:


技术基础类问题

  1. Q:请解释JavaScript事件循环机制,结合宏任务/微任务说明代码执行顺序

    A:事件循环分为调用栈、任务队列和微任务队列。同步代码执行后,优先清空微任务队列(Promise.then、MutationObserver),再执行宏任务(setTimeout、DOM事件)。例如setTimeout(()=>console.log(1),0); Promise.resolve().then(()=>console.log(2))输出顺序为2→1。

  2. Q:Vue的响应式原理中,如何通过Object.defineProperty或Proxy实现数据劫持?

    A:Vue2使用Object.defineProperty递归劫持对象属性,通过getter/setter触发依赖收集和更新;Vue3改用Proxy代理整个对象,支持动态新增属性监听,并通过Reflect操作原生行为。

  3. Q:React Fiber架构解决了什么问题?描述其核心设计思想

    A:解决大型应用卡顿问题。Fiber将递归渲染拆分为可中断的链表结构,通过requestIdleCallback分片执行任务,支持优先级调度和并发模式。


框架深入类问题

  1. Q:对比Vuex和Pinia的核心差异,为何Pinia更适合Vue3?

A:Pinia放弃Mutation概念,直接通过actions修改状态;支持Composition API和TypeScript,无需模块嵌套,且体积更小。

  1. Q:Vue和React的DIFF算法有何异同?

    A:Vue采用双端对比+静态节点标记,React基于Fiber的链表结构通过key和类型对比。Vue的patch更高效,React的Fiber支持中断。

  2. Q:如何实现React高阶组件(HOC)?举例说明应用场景

    A:HOC是接收组件返回新组件的函数,例如withLogger(Comp),用于日志注入、权限控制等逻辑复用。


项目实战类问题

  1. Q:在灾害系统中,如何通过BPMN.js实现拖拽式配置?遇到哪些技术难点?

A:基于BPMN的Modeler实例和自定义palette,解析XML生成流程节点。难点包括节点间数据传递、自定义样式和与后端模型引擎的协议对接。

  1. Q:SSE协议与WebSocket有何区别?为何在LLM项目中选择SSE?

    A:SSE是HTTP长连接,服务端单向推送(如流式文本);WebSocket支持全双工通信。SSE更轻量且原生支持断线重连,适合LLM的逐字输出场景。

  2. Q:Axios高阶工厂如何封装请求防抖?给出核心代码片段

    A:

    javascript 复制代码
    const debounceAdapter = (config) => {
      const debounceTime = config.debounce || 300;
      let timer;
      return new Promise((resolve) => {
        clearTimeout(timer);
        timer = setTimeout(() => resolve(axios.defaults.adapter(config)), debounceTime);
      });
    };

性能优化类问题

  1. Q:针对海量矢量数据渲染,除了服务端渲染还做了哪些优化?

A:采用LOD(细节层次)分片加载、WebWorker异步解析数据、IndexedDB本地缓存,以及Cesium的3D Tiles规范优化渲染性能。

  1. Q:如何通过Webpack实现代码分割?动态import的原理是什么?
    A:配置optimization.splitChunks或使用import()语法,Webpack会生成单独chunk文件,运行时通过JSONP动态加载。

设计模式类问题

  1. Q:观察者模式与发布订阅模式的区别?在项目中如何应用?

A:观察者直接耦合(如Vue的Dep-Watcher),发布订阅通过事件中心解耦(如Vue的EventBus)。灾害系统中用于模型状态变更通知。

  1. Q:如何用单例模式封装全局WebGL上下文?
    A:

    javascript 复制代码
    class WebGLContext {
      static instance;
      constructor() {
        if (!WebGLContext.instance) {
          this.ctx = canvas.getContext('webgl');
          WebGLContext.instance = this;
        }
        return WebGLContext.instance;
      }
    }

工程化与工具类问题

  1. Q:Vite相比Webpack的核心优势是什么?如何解决开发环境热更新慢的问题?

A:Vite基于ES Module原生加载,无需打包启动快;HMR利用浏览器缓存和ESM的模块依赖图,精准更新变更模块。

  1. Q:Git协作中如何规范提交信息?如何撤销已push的commit?
    A:遵循Angular规范(feat/fix/docs等),使用git rebase -i交互式修改历史后git push -f(需团队协商)。

开放性问题

  1. Q:作为博客作者,你如何保持对前沿技术的敏感度?

A:定期阅读RFC(如React18)、关注GitHub趋势榜、参与技术社区(如掘金/V2EX)、复盘实际项目痛点。

  1. Q:如果让你设计一个前端性能监控系统,会采集哪些指标?
    A:FP/FCP/LCP、TTI、CLS、内存占用、API耗时;通过Performance API和MutationObserver实现。

软技能类问题

  1. Q:在跨职能团队协作中,如何与非技术成员高效沟通需求?

A:使用原型工具(Figma)可视化需求,拆分用户故事(User Story),明确验收标准(如DoD)。

  1. Q:遇到与后端API联调延迟的问题,你会如何推动解决?
    A:本地Mock数据(如Apifox)、制定接口文档规范、推动Swagger契约测试、定期同步阻塞项。

终极问题

  1. Q:未来3年你的前端技术成长规划是什么?

A:深耕可视化方向(如WebGPU)、参与开源社区(如Three.js)、探索智能化(LowCode/AI辅助开发),目标成为领域专家。


以上问题覆盖技术深度、项目复盘、工程思维和职业规划,可全面考察候选人的能力层次。


以下是针对20个面试问题的详细解答和对应的Mermaid思维导图,帮助系统化理解技术要点:


1. JavaScript事件循环机制
是 否 同步代码 调用栈 栈空? 微任务队列 Promise.then, MutationObserver 宏任务队列 setTimeout, DOM事件

详细答案:

• 调用栈:同步代码立即执行,形成执行上下文栈。

• 微任务:Promise.then、MutationObserver等进入微任务队列,每轮事件循环结束后立即清空。

• 宏任务:setTimeout、I/O等进入任务队列,等待下一轮事件循环。

示例:

javascript 复制代码
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
// 输出顺序:1 → 3 → 2

2. Vue响应式原理对比
Object.defineProperty Proxy Vue2 递归劫持属性 数组方法重写 Vue3 代理整个对象 动态属性监听 Reflect操作原生行为

详细答案:

• Vue2:

• 递归遍历对象,通过getter/setter拦截属性。

• 缺陷:无法检测新增属性(需Vue.set),数组需重写push/pop等方法。

• Vue3:

• Proxy直接代理对象,支持动态属性增删。

• Reflect避免直接操作原始对象,如Reflect.set(target, key, value)


3. React Fiber架构
递归渲染 链表结构 旧架构 不可中断 Fiber 可中断/恢复 优先级调度 requestIdleCallback分片

详细答案:

• 核心改进:将虚拟DOM树转为Fiber链表(child/sibling/return指针)。

• 调度策略:高优先级任务(如动画)优先执行,低优先级任务可中断。

• 实现:通过requestIdleCallback在浏览器空闲时段分片执行任务。


4. Vuex vs Pinia
Vuex Mutations同步+Modules嵌套 Pinia Actions同步异步一体 Composition API友好 TypeScript支持

详细答案:

• Vuex:

• 严格分离mutations(同步)和actions(异步)。

• 模块需嵌套命名空间。

• Pinia:

• 直接通过actions处理同步/异步逻辑。

• 组合式API + 自动类型推断,代码更简洁。


5. Vue/React DIFF算法对比
双端对比 Fiber链表 Vue 静态节点跳过 React 节点类型+key比较 高效静态优化 支持中断渲染

详细答案:

• Vue:

• 双指针从首尾向中间对比,对静态节点进行缓存(patchFlag标记)。

• React:

• 基于Fiber节点的typekey比较,可标记Placement/Deletion等效果。


6. BPMN.js实现拖拽配置
建模器初始化 自定义Palette 节点XML生成 与后端协议对接 数据传递校验

难点与解决:

• 自定义节点:通过customElements.define注册新元素,注入paletteProvider

• 数据流:解析BPMN的XML生成模型配置,通过moddle扩展协议字段。


7. SSE vs WebSocket
HTTP长连接 TCP全双工 SSE 服务端单向推送 WebSocket 实时双向通信 自动重连 更高开销

选择理由:

• SSE:内置EventSourceAPI,适合LLM逐字输出(如data: {"token": "foo"}\n\n)。

• WebSocket:适合聊天室等双向交互场景。


8. Axios防抖封装

javascript 复制代码
// 高阶工厂实现
const debounceAdapter = (delay = 300) => (config) => {
  let timer;
  return new Promise((resolve) => {
    clearTimeout(timer);
    timer = setTimeout(() => {
      resolve(axios.defaults.adapter(config));
    }, delay);
  });
};
axios.defaults.adapter = debounceAdapter();

9. 海量数据优化方案
数据分片 WebWorker解析 IndexedDB缓存 LOD分级加载 3D Tiles规范


10. Webpack代码分割
动态import 生成独立chunk JSONP异步加载 按需加载


其他问题思维导图示例
观察者 vs 发布订阅
直接引用 事件中心 观察者 Subject-Observer 发布订阅 Publisher-Subscriber

单例模式WebGL
WebGLContext -static instance -ctx: WebGLRenderingContext +getInstance() : WebGLContext


总结

每个问题的思维导图聚焦核心概念对比或实现流程,结合代码片段和场景分析,可帮助候选人系统化回答。建议在面试中根据候选人回答深度追加细节问题(如"如何优化Fiber调度优先级?")。

相关推荐
magic 24512 分钟前
Spring 命名空间注入:p、c 与 .util 的深度解析
java·前端·spring
钢铁男儿32 分钟前
Python基本语法(函数partial)
前端·javascript·python
风清云淡_A33 分钟前
【angular19】入门基础教程(三):关于angular里面的响应式数据入门使用
前端·angular.js
蒟蒻小袁1 小时前
力扣面试150题--二叉树的最大深度
算法·leetcode·面试
green_pine_1 小时前
Vue3学习笔记2——路由守卫
前端·vue.js·笔记·学习
空中湖1 小时前
纯前端专业PDF在线浏览器查看器工具
前端·pdf
七灵微1 小时前
ES6入门---第二单元 模块二:关于数组新增
前端·javascript·es6
GUIQU.1 小时前
【Vue】性能优化与调试技巧
前端·vue.js·性能优化
娃哈哈哈哈呀1 小时前
组件通信-mitt
前端·javascript·vue.js
wuhen_n2 小时前
鼠标悬浮特效:常见6种背景类悬浮特效
前端·css·css3·html5