前端面试常问问题[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分片执行任务,支持优先级调度和并发模式。


框架深入类问题
4. 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),用于日志注入、权限控制等逻辑复用。


项目实战类问题
7. Q:在灾害系统中,如何通过BPMN.js实现拖拽式配置?遇到哪些技术难点?
A:基于BPMN的Modeler实例和自定义palette,解析XML生成流程节点。难点包括节点间数据传递、自定义样式和与后端模型引擎的协议对接。

  1. Q:SSE协议与WebSocket有何区别?为何在LLM项目中选择SSE?
    A:SSE是HTTP长连接,服务端单向推送(如流式文本);WebSocket支持全双工通信。SSE更轻量且原生支持断线重连,适合LLM的逐字输出场景。

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

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

性能优化类问题
10. Q:针对海量矢量数据渲染,除了服务端渲染还做了哪些优化?
A:采用LOD(细节层次)分片加载、WebWorker异步解析数据、IndexedDB本地缓存,以及Cesium的3D Tiles规范优化渲染性能。

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

设计模式类问题
12. Q:观察者模式与发布订阅模式的区别?在项目中如何应用?
A:观察者直接耦合(如Vue的Dep-Watcher),发布订阅通过事件中心解耦(如Vue的EventBus)。灾害系统中用于模型状态变更通知。

  1. Q:如何用单例模式封装全局WebGL上下文?
    A:
    class WebGLContext {
      static instance;
      constructor() {
        if (!WebGLContext.instance) {
          this.ctx = canvas.getContext('webgl');
          WebGLContext.instance = this;
        }
        return WebGLContext.instance;
      }
    }
    

工程化与工具类问题
14. 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(需团队协商)。

开放性问题
16. Q:作为博客作者,你如何保持对前沿技术的敏感度?
A:定期阅读RFC(如React18)、关注GitHub趋势榜、参与技术社区(如掘金/V2EX)、复盘实际项目痛点。

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

软技能类问题
18. Q:在跨职能团队协作中,如何与非技术成员高效沟通需求?
A:使用原型工具(Figma)可视化需求,拆分用户故事(User Story),明确验收标准(如DoD)。

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

终极问题
20. Q:未来3年你的前端技术成长规划是什么?
A:深耕可视化方向(如WebGPU)、参与开源社区(如Three.js)、探索智能化(LowCode/AI辅助开发),目标成为领域专家。


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


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


1. JavaScript事件循环机制

同步代码
调用栈
栈空?
微任务队列
Promise.then, MutationObserver
宏任务队列
setTimeout, DOM事件

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

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

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

示例:

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防抖封装

// 高阶工厂实现
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调度优先级?”)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GISer_Jinger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值