最近面试总结

2025-07-11

1. 大文件上传会遇到的问题

  • 大文件上传超时/中断
  • 上传失败无法断点续传
  • 前端 ui 卡顿问题
  • 后端存储压力大
解决方案
  • 使用 slice 将大文件按固定大小进行分片,每片生成一个请求,独立进行,所有切片上传完成后,通知后端合并
  • 使用 Promise.all或Promise.allSettled控制并发上传,可重试失败的分片
  • 支持断点续传(基于文件 hash和上传状态记录),上传前使用 md5 对文件 计算hash,(使用 web worker避免主线程卡顿)
  • 后端通过查询该 hash下已上传的chunk索引来判断,前端跳过已上传的部分
  • 避免重复上传相同文件(秒传)
  • 前端 ui优化+错误提示

2. js 是单线程语言,如何做到多线程

只有了解过 js 可以通过 web worker 做多线程,先做一个总结,但是没有实际的应用经验,下面会写一个 demo 做个尝试

什么是 web worker?
  • web worker是浏览器提供的 api,用于在后台线程中运行脚本,从而提升主线程的响应能力
主要特点
  • Worker 运行在独立线程中,不阻塞主线程
  • 与主线程之间通过postMessage 通信
  • 无法访问 DOM 和window 对象
  • 适合处理CPU 密集任务
  • 与主线程之间的通信是异步的
// main.js
const worker = new Worker('worker.js')
const data = Array.from({ length: 100000 }, () => Math.random())
 
// 传递数据
worker.postMessage(data)
 
// 接受消息
worker.onmessage = (event) => {
    console.log(event.data)
}
 
// 错误
worker.onerror = (event) => {
    console.log(event)
}
 
 
// worker.js
self.onmessage = (event) => {
    const arr = event.data
    const sum = arr.reduce((acc, cur) => acc + cur, 0)
 
    // 将数据返回给主线程
    self.postMessage(sum)
}
Worker 中可用的 API(部分)
  • fetch xhr
  • setTimeOut setInterval
  • 存储