1. 事件循环相关代码输出分析

可以参考这一个练习

  1. 如何判断元素是否在视口

判断元素是否在视口内,主要有两种方法:

  1. Intersection Observer API (推荐,现代、高效)
  2. Element.getBoundingClientRect() (传统,兼容性好但性能稍差)
特性Intersection Observer APIgetBoundingClientRect()
性能极高,异步,不阻塞主线程较差,同步操作,高频触发会引起重排,需手动优化
使用复杂度简单,声明式相对复杂,需要手动计算和事件绑定
功能强大,支持阈值、自定义根元素基础,只能获取位置,逻辑需自己实现
代码可读性,意图清晰一般,计算逻辑和事件处理混在一起
兼容性现代浏览器 (IE 不支持)非常好,兼容所有主流浏览器
核心思想告诉浏览器:“当这个元素进入/离开视口(或者与另一个元素交叉)时,请通知我。”在 scrollresize 等事件中,不断调用 getBoundingClientRect() 获取元素的位置,并与视口的尺寸 (window.innerHeightwindow.innerWidth) 进行比较。
  1. 浏览器工具中的 ‘Performance’(性能)有什么用

简单来说,它的核心作用是:记录、分析和可视化你的网页在运行期间(Runtime)的所有活动,帮助你找到导致页面卡顿、缓慢或无响应的性能瓶颈。

具体可以查看Chrome官方的开发者文档

  1. 如何提升首屏加载速度

可以关注这两个指标(可以在性能页面找到):

  • FCP (First Contentful Paint):首次内容绘制。浏览器首次在屏幕上渲染出任何 DOM 内容(文本、图片、Canvas 等)的时间点。这是用户感知到“页面活了”的第一个信号。
  • LCP (Largest Contentful Paint):最大内容绘制。视口内最大的图像或文本块完成渲染的时间。它衡量了主要内容对用户的可见速度。

具体提升方法:

优先级优化项效果实现难度
极高开启 Gzip/Brotli 压缩显著
极高使用 CDN 加速静态资源显著
极高图片优化(压缩、WebP、懒加载)显著低-中
服务端渲染 (SSR) / 静态生成 (SSG)巨大
JS 使用 defer 并置于底部显著
代码分割 (Code Splitting)显著中 (框架已支持)
代码压缩 (Minify)明显低 (构建工具)
提取并内联关键 CSS明显
利用浏览器缓存明显
DNS 预解析略微
  1. Vue中的 nextTick 有什么用

nextTick 是一个让你在下次 DOM 更新循环结束之后执行延迟回调的工具。

你通常在以下情况需要使用 nextTick

  1. 获取更新后的 DOM 元素属性
    • 在一个列表数据更新后,获取列表的实际高度或宽度。
    • 在一个元素通过 v-if 从 false 变为 true 后,立即获取该元素的尺寸或对其进行操作。
  2. 操作新生成的 DOM 元素
    • 在一个元素通过 v-if 显示后,立即对其聚焦 (focus)。这是一个非常经典的例子。
  3. 集成需要操作 DOM 的第三方库
    • 当数据更新导致图表或某些 UI 插件需要重新渲染时,你需要在 nextTick 回调中调用该库的初始化或更新方法,以确保它能操作到最新的 DOM 结构。
  1. 如何实现缓存

这个范围比较广,主要从几个方向答,http协议提供的缓存,强缓存和协商缓存;然后js提供的缓存,sessionStorage和localStorage;然后项目实现中的缓存,也就是内存中的缓存。

  1. 项目相关
  1. 从零设计一个组件,比如说弹窗组件,会考虑什么?如果需要自定义样式,可以怎么做?

设计props,events和slot,保证其易用性;提前规定好组件会有一些什么行为;考虑可访问性(保证残障人士的使用);

自定义样式的部分,可以:

  • 暴露CSS自定义属性,用户可以在自己的CSS的文件或者父容器中定义
  • 提供稳定的CSS类名,允许用户进行覆盖
  • 通过style、className等相关的props,让用户可以直接注入内敛样式或者类名
  1. 项目中为什么要同时用Vite + Webpack
  1. 函数式编程,面向对象编程和过程式编程之间的区别是什么
特性过程式编程 (PP)面向对象编程 (OOP)函数式编程 (FP)
核心思想按步骤执行一系列指令模拟现实世界,将事物抽象为对象将计算描述为数学函数的求值
关注点过程 (How):如何一步步完成任务对象 (Who/What):谁拥有数据,谁负责行为转换 (What):数据如何流动和转换
数据与行为分离:数据结构和操作数据的函数是分开的封装:数据(属性)和行为(方法)被捆绑在对象内部分离:数据(通常是不可变的)和操作数据的纯函数是分开的
状态管理通过可变变量,状态是共享和可变的,容易产生混乱状态被封装在对象内部,由对象自己管理避免可变状态,强调数据不可变性 (Immutability)
主要单元函数、过程类、对象、实例纯函数、高阶函数
代码示例使用循环和可变累加器创建一个类,通过实例方法计算使用 mapreduce 等高阶函数链式调用
  1. 手撕:拍平数组并且去重和排序,括号匹配
  1. 如何学习新的技术栈,印象深刻的学习经历

快手主站二面

作者

MeorinLime 梦灵

发布日期

2025 - 08 - 18