TMEqq音乐前端暑期二面整理笔记(四十一)
1. 虚拟列表怎么实现的
答案
如果项目里既提过 Webpack 又提过 Vite,建议先说明主用哪一个,再对比原因。
- Webpack 生态更老更全,适合历史项目和高度定制场景。
- Vite 开发态基于原生 ESM,冷启动和热更新通常更快,适合现代前端项目。
- 如果面试官追问,一定补上:开发态和生产构建的策略不一样,不能只说“Vite 更快”。
2. 一道性能指标采集代码找错误
答案
这类题通常在考你对性能指标采集时机和 API 的理解。
- 要先确认指标采集是不是放在正确生命周期,比如
PerformanceObserver、paint、largest-contentful-paint等。 - 再看是否存在重复监听、时机过早、数据读取不准确、未清理 observer 等问题。
- 回答时可以强调:指标采集最怕“采到了,但不准”。
3. 文件上传是怎么实现的
答案
文件上传这类题建议按完整链路回答:
- 前端先按大小阈值切片,通常 2MB 到 10MB 比较常见。
- 上传前计算文件 hash,服务端据此判断是否已存在完整文件或部分分片。
- 断点续传时,前端先查询已上传分片列表,只补传缺失分片。
- 全部分片上传完成后,通知服务端按顺序合并。
- 秒传一般基于完整文件 hash;分片 hash 更多用于断点续传和重复分片复用。
- 分片不是越多越好:分太小请求数会暴涨,分太大失败重传成本高,所以要结合网络、文件大小和后端承载能力权衡。
4. 大文件分片上传时,计算 5MB 分片 MD5 大概要多久
答案
文件上传这类题建议按完整链路回答:
- 前端先按大小阈值切片,通常 2MB 到 10MB 比较常见。
- 上传前计算文件 hash,服务端据此判断是否已存在完整文件或部分分片。
- 断点续传时,前端先查询已上传分片列表,只补传缺失分片。
- 全部分片上传完成后,通知服务端按顺序合并。
- 秒传一般基于完整文件 hash;分片 hash 更多用于断点续传和重复分片复用。
- 分片不是越多越好:分太小请求数会暴涨,分太大失败重传成本高,所以要结合网络、文件大小和后端承载能力权衡。
5. 如果文件很大,计算完整文件 MD5 很耗时,有什么性能优化方案
答案
大文件算完整 MD5 耗时长,核心优化思路是“分片 + Worker + 增量计算”。
- 不要一次性把整个文件读进主线程。
- 按分片读取并增量计算 hash。
- 计算过程放到
Web Worker,避免页面卡顿。 - 如果业务允许,可以优先用分片 hash 配合后端做断点续传。
6. Web Worker 在大文件 MD5 计算里能怎么用
答案
Web Worker 的作用是把计算密集型任务移出主线程,避免页面卡顿。
- 适合大文件 hash、复杂解析、图片压缩、数据预处理。
- 它不能直接操作 DOM。
- 主线程和 Worker 通过
postMessage通信,大对象传输时要注意成本。
7. 服务端保存所有分片索引和分片文件,会不会导致碎片文件越来越多
答案
会,如果没有治理,碎片文件和索引确实会不断积累。
- 所以服务端要有上传会话状态和过期清理机制。
- 未完成上传的分片要定期回收。
- 合并完成后也要清理临时分片目录。
9. 如果清理了分片,下次上传同一个文件还能不能做分片级别的秒传
答案
文件上传这类题建议按完整链路回答:
- 前端先按大小阈值切片,通常 2MB 到 10MB 比较常见。
- 上传前计算文件 hash,服务端据此判断是否已存在完整文件或部分分片。
- 断点续传时,前端先查询已上传分片列表,只补传缺失分片。
- 全部分片上传完成后,通知服务端按顺序合并。
- 秒传一般基于完整文件 hash;分片 hash 更多用于断点续传和重复分片复用。
- 分片不是越多越好:分太小请求数会暴涨,分太大失败重传成本高,所以要结合网络、文件大小和后端承载能力权衡。
10. 秒传应该基于完整文件 hash 还是分片 hash
答案
文件上传这类题建议按完整链路回答:
- 前端先按大小阈值切片,通常 2MB 到 10MB 比较常见。
- 上传前计算文件 hash,服务端据此判断是否已存在完整文件或部分分片。
- 断点续传时,前端先查询已上传分片列表,只补传缺失分片。
- 全部分片上传完成后,通知服务端按顺序合并。
- 秒传一般基于完整文件 hash;分片 hash 更多用于断点续传和重复分片复用。
- 分片不是越多越好:分太小请求数会暴涨,分太大失败重传成本高,所以要结合网络、文件大小和后端承载能力权衡。
11. 服务端怎么设计分片管理,才能避免既存完整文件又存所有分片造成空间浪费
答案
服务端通常要区分“临时分片存储”和“最终文件存储”。
- 分片只是上传过程中的中间态。
- 一旦合并成功且校验通过,就应该删除临时分片。
- 如果要复用分片,可以做内容寻址和引用计数,而不是无脑永久保留所有碎片。
12. 如果两个文件部分分片相同、整体文件不同,怎么判断和复用分片
答案
如果要做分片复用,关键是给每个分片做内容级 hash。
- 相同 hash 的分片说明内容一致,可以复用。
- 但完整文件是否相同,仍然要靠完整文件 hash 判断。
- 这种设计本质上接近去重存储。
13. 歌曲列表页点击歌曲后,如何打开一个独立播放页
答案
最直接的方式是列表页点击后打开新窗口或新标签页,并把歌曲标识传过去。
- 可以通过 URL 参数、查询串或共享存储传 songId。
- 播放页根据 songId 拉取详情并开始播放。
14. 如果播放页已经存在,列表页怎么通知已有播放页切换歌曲
答案
如果播放页已经存在,关键是做跨页面通信。
- 可以用
postMessage、BroadcastChannel、storage事件等方式通知。 - 通知内容通常只传歌曲 ID 或播放指令。
- 播放页收到后更新当前播放状态。
15. 怎么判断播放页是否已经存在或是否被关闭
答案
如果是通过 window.open 打开的窗口,可以保留窗口引用。
- 有引用时可判断
windowRef.closed。 - 如果没有直接引用,也可以通过心跳或跨页面通信确认播放页是否还在线。
16. 如何用 LocalStorage 实现跨页面通信
答案
AI 相关题最好回答成“工具边界 + 落地方式”。
- AI 适合做样板代码、重构建议、测试用例、文档整理和方案对比。
- 真正落地时要给它足够上下文,比如代码规范、目录结构、接口文档、历史实现和约束规则。
- Skills / MCP / Agent 可以理解为不同层级的能力扩展:Skills 偏可复用能力包,MCP 偏工具和上下文接入协议,Agent 偏任务编排和执行过程。
- AI 不能代替工程判断,核心链路仍然要靠人 review 和兜底。
17. 如何用 LocalStorage 实现页面间心跳检测
答案
AI 相关题最好回答成“工具边界 + 落地方式”。
- AI 适合做样板代码、重构建议、测试用例、文档整理和方案对比。
- 真正落地时要给它足够上下文,比如代码规范、目录结构、接口文档、历史实现和约束规则。
- Skills / MCP / Agent 可以理解为不同层级的能力扩展:Skills 偏可复用能力包,MCP 偏工具和上下文接入协议,Agent 偏任务编排和执行过程。
- AI 不能代替工程判断,核心链路仍然要靠人 review 和兜底。
18. LocalStorage 轮询方案有什么性能问题
答案
AI 相关题最好回答成“工具边界 + 落地方式”。
- AI 适合做样板代码、重构建议、测试用例、文档整理和方案对比。
- 真正落地时要给它足够上下文,比如代码规范、目录结构、接口文档、历史实现和约束规则。
- Skills / MCP / Agent 可以理解为不同层级的能力扩展:Skills 偏可复用能力包,MCP 偏工具和上下文接入协议,Agent 偏任务编排和执行过程。
- AI 不能代替工程判断,核心链路仍然要靠人 review 和兜底。
19. 除了 LocalStorage,跨页面通信还有哪些更好的方案
答案
AI 相关题最好回答成“工具边界 + 落地方式”。
- AI 适合做样板代码、重构建议、测试用例、文档整理和方案对比。
- 真正落地时要给它足够上下文,比如代码规范、目录结构、接口文档、历史实现和约束规则。
- Skills / MCP / Agent 可以理解为不同层级的能力扩展:Skills 偏可复用能力包,MCP 偏工具和上下文接入协议,Agent 偏任务编排和执行过程。
- AI 不能代替工程判断,核心链路仍然要靠人 review 和兜底。
20. postMessage 和 Service Worker 怎么用于跨页面通信
答案
postMessage 适合窗口、iframe、worker 之间显式发消息。
- 页面之间如果有直接窗口关系,用
postMessage很方便。 - Service Worker 更像一个中间层,适合做多个页面共享消息和离线能力。
- 但轻量通信优先级通常还是
BroadcastChannel或postMessage更直接。
21. 歌曲列表中大量图片加载时,如何先展示占位图
答案
常见做法是先渲染占位图或骨架屏,等真实图片加载完成后再切换。
- 初始阶段展示统一占位图。
- 图片加载成功后替换成真实图。
- 失败时再兜底成错误图。
22. 图片加载成功后怎么切换为真实图片
答案
可以监听图片的 load 事件。
- 先让占位图展示。
- 图片真正加载完成后,把显示源切换成真实图片。
- 过渡时可以加淡入效果,避免闪烁。
23. 图片加载失败后怎么展示失败图
答案
图片失败兜底一般监听 error 事件。
- 一旦触发错误,就把图片地址切换到默认错误图。
- 同时可以记录错误日志或埋点,方便排查资源问题。
24. 如何通过图片的 load 和 error 事件判断加载状态
答案
图片加载状态最常见就是监听两个事件。
load表示资源成功加载完成。error表示加载失败。- 结合本地状态,就能切换占位、真实图和失败图。
25. 你接触过 React Native 或 Flutter 这类跨端技术吗
答案
如果接触过,就说实际使用场景;如果没深入用过,也可以从理解层面回答。
- React Native 和 Flutter 都是跨端方案,目标是复用业务逻辑和 UI 能力。
- React Native 更贴近前端生态;Flutter 有自己完整的渲染体系。
- 回答时不要硬装做过,诚实说明接触深度更稳。
26. Vite 相比 Webpack,为什么开发阶段启动更快
答案
如果项目里既提过 Webpack 又提过 Vite,建议先说明主用哪一个,再对比原因。
- Webpack 生态更老更全,适合历史项目和高度定制场景。
- Vite 开发态基于原生 ESM,冷启动和热更新通常更快,适合现代前端项目。
- 如果面试官追问,一定补上:开发态和生产构建的策略不一样,不能只说“Vite 更快”。
27. Webpack 能不能也配置成使用 ES Module
答案
可以,Webpack 本身就支持 ESM。
- 入口和源码层可以直接用
import/export。 - 它也支持输出成某些 ESM 格式。
- 但“支持 ESM”不代表开发态就和 Vite 一样按原生 ESM 直接跑。
28. Vite 的热更新 HMR 是怎么实现的
答案
Vite 的 HMR 核心是“原生 ESM + WebSocket 通知 + 精准模块失效”。
- 浏览器按 ESM 方式加载模块。
- 文件变化后,Vite 通过 WebSocket 通知客户端哪些模块失效。
- 客户端只重新请求受影响模块,而不是整页刷新。
29. WebSocket 和 SSE 有什么区别
答案
SSE 和 WebSocket 的核心区别是通信方向和适用场景。
- SSE 是服务端单向推送,基于 HTTP,天然适合大模型文本流、通知流、日志流。
- WebSocket 是全双工通信,更适合聊天、协同编辑、实时互动。
- AI 对话里如果主要是服务端不断吐内容,SSE 往往更简单、更稳定,也更容易复用现有 HTTP 鉴权和网关体系。
- 如果需要客户端高频主动发消息、双向实时同步,WebSocket 更合适。