页面卡顿别只答网慢:用OfferFlow一道真实题练排查顺序

0 阅读3分钟

面试官问“按钮点了没反应,怎么排查”,如果只答接口慢、加缓存,很容易被追问:假如请求早就结束了呢?

我做的 OfferFlow 世界面经里,有一道真实前端题:什么是长任务,为什么阻塞页面交互,如何用 PerformanceObserver 识别,以及怎样拆分。本文围绕这道题写一份原创解题示例,不把示例当作唯一标准答案。

先说清楚,长任务不等于长请求

主线程上的一个任务执行超过50毫秒,是长任务的常见判断门槛。主线程忙着执行JavaScript、布局等工作时,用户输入和绘制机会可能被延后。

但接口耗时很长,并不自动表示主线程一直被占用;页面卡顿也可能与网络、渲染、资源加载等有关。先区分现象和证据,才能决定下一步查哪里。

先拿到一条观察记录

在支持Long Tasks API的浏览器中,可以先用一个最小的观察器:

const canObserve =
  typeof PerformanceObserver !== "undefined" &&
  PerformanceObserver.supportedEntryTypes?.includes("longtask");

if (canObserve) {
  const observer = new PerformanceObserver((list) => {
    for (const entry of list.getEntries()) {
      console.log("[longtask]", {
        startTime: entry.startTime,
        duration: entry.duration,
        context: entry.name,
      });
    }
  });

  observer.observe({ type: "longtask", buffered: true });
}

这里拿到的是时间与上下文线索,不是自动定位到了业务代码的某一行。entry.name也不等于业务函数名。观察到记录以后,再结合浏览器Performance面板、交互时间点和业务日志排查。

浏览器支持情况需要单独判断,不支持该API时不能据此得出“没有长任务”。

拆分方案,回答适用前提与代价

第一种,把大批处理拆成小块,在块之间把执行机会交还给主线程。块大小需要结合设备与实际耗时调整;单纯把所有工作塞进连续的微任务,不能保证页面获得绘制机会。

第二种,把适合的纯计算放到Web Worker。要考虑通信、序列化和启动成本;Worker不能像页面脚本一样直接操作DOM,也不是把函数挪进去就自动变快。

可用的回答顺序是:观察到什么 → 怀疑什么 → 怎么验证 → 怎样拆分 → 如何比较交互体验与开销。优化以后,仍需要在实际设备和真实负载下复查。

在OfferFlow里怎么找

入口:offerflow.best/

首页进入“世界面经”,从岗位树选“前端开发”→“Web前端工程师”,打开长任务题,再看参考答案与条目已有记录。

这次已实际打开该题与参考答案区域,画面来自公开面经内容。产品支持共创与记录,不代表每一题的答案都完整或必然正确。本文没有新增题目,也没有修改公开答案。

参考资料: developer.mozilla.org/en-US/docs/… developer.mozilla.org/en-US/docs/…

我是OfferFlow开发者,本文为开发者自荐、AI辅助整理。代码是本文原创最小示例;隔离页面中的人工长任务仅用于检查观察器能否收到记录,不是OfferFlow性能测评,也不能当成真实业务优化结论。