前言:工作 2 年,我写的不一定对,如有错误,望评论区大佬指正,共同成长
答:首屏耗时,业界衡量首屏性能一般有FCP(First Contenful Paint)、LCP(Largest Contentful Paint),公司内部用的是体感耗时,指的是从打开页面到 dom 不再变化的耗时。
(当时脑子短路了,没反应过来,说了不知道。事后查了发现是 Mutation Observer,其实 Mutation Observer 我在业务中有用过,当时是用来监听页面是否在可视区,可惜了,知识用过但是没融会贯通)
答:FPS:帧率,每秒渲染的帧数,在简历写的 3D 项目中用的这个指标衡量性能
答:公司内部引擎暴露了一个生命周期函数,会在每一帧时调用,形参是当前帧的耗时,可以依据这个来算。我理解底层依赖的应该是 requestAnimationFrame。因为 requestAnimationFrame 会在浏览器渲染下一帧之前执行。
答:用 Chrome 的 lighthouse 面板分析是哪些帧卡顿,看是不是因为在这段时间用开销巨大的 js 任务在执行。比如如果页面中有很多串行的异步请求,改成并行。
答:确实,我刚刚说错了,异步请求线程和 GUI 渲染线程是独立的,不影响,JS 线程才会阻塞 GUI 线程。如果有开销巨大的 js 任务,比如可能是遍历一个巨大的数组
答:用 web worker 单独开一个线程执行这个任务。
答:看这个数组里哪些项的遍历和可视区内的 dom 有关,就先执行这部分,其他部分等用户滑动页面,可视区 dom 变化了再执行其他任务。(事后看感觉这里就是在胡扯)
答:了解过,但这跟刚刚的问题好像没有关系诶
答:react 会解析 jsx 生成 fiber 树,当需要更新时,reconciler 会构建新的 fiber 树,每个 fiber 节点保存了当前节点需要更新的 props 和更新的方式。然后将 rootFiberNode 指向这个新的 fiber 树。
答:reconciler 会把长任务拆分成多个子任务,每一帧作为一个时间切片,每个时间切片里默认预留 5ms 去渲染视图(这里事后复盘发现说错了,应该是预留 5ms 执行拆分出的子任务,直到所有子任务执行完)
(内心 OS: 三流前端学技术,二流前端学方法,一流前端学思想,面试官不愧是大佬)
答了协商缓存的过程
答:复杂请求(比如 PUT、DELETE 请求)跨域时会客户端先发起一个 options 预检请求,响应头里 access-control-allow-origin 如果包含请求方的域名,则表示可以跨域,接下来正式发起请求,否则直接在这一步被拦下,后续不再发起请求。
(不知道,简历上提到了分包加载,但是没了解背后原理,是自己的问题)
以下是 ChatGPT 的回答:
小程序分包加载机制设计时,为了避免不同包之间的变量命名冲突,主要依靠以下几种策略:
最后:两个 easy 数组题
反问环节:问了面试官组内负责的业务
#前端面经#