字节跳动前端面经(1h版带答案)

1.浏览器从输入url到页面渲染的过程
2.浏览器做了哪些工作解析HTML最终形成页面展示(渲染过程)
3.对js的解析是解析什么内容
4.就是假设我们已经解析完了,不管它是解析什么内容,那解析完之后的话,它其实会有一个事件循环的机制,介绍一下js的事件循环机制
5.事件循环在nodejs和浏览器的区别
- 宏任务:浏览器是 “单队列”,Node.js 是 “多阶段队列”(按 timers → poll → check 等顺序执行);
- 微任务:Node.js 比浏览器多一个 nextTick 队列,且优先级最高;
- 执行节奏:浏览器是 “1 个宏任务 → 所有微任务”
- Node.js 是 “1 个阶段的宏任务 → nextTick → 其他微任务 → 下一阶段”。

6.vue3的vue2响应式的话有哪些区别
7.vue3实现一个自定义的响应式的数据应该怎么实现
日常开发优先用 Vue 内置的 reactive/ref,兼容性和功能更完善
8.对于引用类型和基础类型的ref 实现上有什么区别
基础类型通过包装对象实现响应式,引用类型则借助 reactive 转换为代理对象,两者最终都通过 .value 访问,但内部处理机制不同。
基础类型(如 number、string)会被包装成含 value 属性的对象,ref 直接对这个 value 属性用 Proxy 拦截 get/set,确保修改时触发响应。
引用类型(如对象、数组)传入 ref 后,会先被 reactive 转为响应式代理对象,此时 ref 的 value 指向这个代理对象,修改属性时实际触发的是 reactive 的响应逻辑。

9.vite的热更新为什么比webpack快
10.vite是怎么支持解析所有文件的为什么
11.性能优化的方式,首屏加载优化
- 资源层面,优先压缩和拆分资源,如用 Vite/Webpack 拆分代码(Code Splitting),大文件分片加载;
- 图片懒加载非首屏图片
- 通过 CDN 分发静态资源
- 代码层面,路由懒加载(如 React.lazy、Vue 异步组件),移除未使用代码(Tree Shaking),避免大型库全量引入(如用 lodash-es 按需导入)
- 缓存层面,设置 HTTP 缓存(强缓存 Cache-Control,协商缓存 ETag),利用 Service Worker 缓存关键资源

12.大文件进行分片加载是如何实现的?
首先前端获取文件总大小,按固定尺寸(如 1MB)计算分片数量;然后通过 HTTP Range 请求头,每次请求一个分片(如Range: bytes=0-1048575);服务端根据 Range 返回对应片段;前端接收所有分片后,用 Blob 或 ArrayBuffer 合并成完整文件。
实际开发中,可结合 Promise.all 控制并发数,避免请求过多阻塞;用 localStorage 记录已下载分片,支持断点续传。例如视频网站加载大视频时,会按时间分片,用户观看时只加载当前需要的片段,既节省带宽也提升加载速度。

13.强缓存的,就是说要用强缓存。那你如果强化了之后,那你怎么更新呢?就比如我发了个紧急的 V3版本,你是当前可能强化才能 V1,那我怎么更新到 V3
给静态资源(JS/CSS/ 图片等)添加版本标识,如在文件名后加哈希值(app.8f3d2.js)或版本号(app.v3.js)。构建工具(Webpack/Vite)可自动生成哈希,哈希值随文件内容变化而变。
当发布 V3 版本时,修改的资源会生成新哈希文件名,浏览器请求时发现是新路径,不命中强缓存,会从服务器拉取最新文件;未修改的资源因哈希不变,仍可利用缓存,兼顾性能与更新。

14.标识是在哪里做的?
构建工具(如 Webpack、Vite)会在打包时,根据文件内容生成唯一哈希值(如 MD5),并添加到文件名中(如index.abc123.js)。这一步由构建工具的配置实现,比如 Webpack 的contenthash、Vite 的rollupOptions.output.assetFileNames。
同时,HTML 文件作为入口,引用这些带哈希的资源路径(如<script src="index.abc123.js">)。当文件内容更新,哈希值变化,HTML 中引用的路径也会更新,浏览器会识别为新资源,触发重新请求。

15.那如何要设置html的强缓存,如何做到强制更新?
1. 配置html的强缓存响应头(catche-control、expires)
2. 叠加协商缓存(ETag、Last-Modified)(强缓存过期后,浏览器会主动请求服务器。此时需通过「协商缓存」让服务器判断 HTML 是否有更新:若未更新,返回304 Not Modified,浏览器继续用缓存;若已更新,返回200 OK和新 HTML。)
3. 若发布紧急版本(如从 V1 更到 V3),即使强缓存没过期,也需让浏览器立刻放弃旧缓存、请求新 HTML。关键是让浏览器认为 “新 HTML 是一个完全不同的资源”,具体有两种落地方式:
方式 1:给 HTML 文件名加版本 / 哈希(推荐,无兼容问题)
直接修改 HTML 的文件名,在发布新版本时添加版本号或哈希,例如:
- 旧版本:index.html → 新版本:index.v3.html 
- 同时,需修改服务器的 “默认访问路径”:用户访问https://xxx.com/时,服务器默认返回index.v3.html(而非旧的index.html)。
原理:浏览器缓存是按 “资源 URL” 存储的,index.html和index.v3.html是两个不同的 URL,即使旧的index.html还在强缓存时效内,浏览器访问新 URL 时也会直接请求服务器,获取最新 HTML。
方式 2:给 HTML 路径加查询参数(简单,但需注意服务器配置)
不修改文件名,而是在 HTML 的访问路径后加版本参数,例如:
- 旧版本:https://xxx.com/index.html → 新版本:https://xxx.com/index.html?v=3

16.RAG(检索增强生成)到底是什么东西,工作原理怎么样
17.为什么要做向量化的过程
18.RAG减少的原因是什么,还有什么方式可以减少幻觉
19.就是你是如何去了解一个全新的一个技术领域的,就是你是怎么去做对应的一个学习的?有没有一些学习的方法论可以分享一下
20.分享一下Mi-BRAG
21.手撕:要实现支持并发限制和先进先出(FIFO)的异步任务调度器

class TaskScheduler {
  constructor(concurrency) { }

  addTask(task) { }

  runTasks() { }
    

22.追问:task返回什么类型
    任务执行失败了上面功能能执行么,promise如何处理失败,但是不阻塞队列->finally()
    catch的时候,能否将其重新加入队列重试

📍面试公司:字节跳动-今日头条
💻面试岗位:前端开发#牛客AI配图神器#

#发面经攒人品#
全部评论
base南京OD,机会多多
点赞 回复 分享
发布于 昨天 19:34 贵州
大佬
点赞 回复 分享
发布于 昨天 18:52 法国
过了吗
点赞 回复 分享
发布于 今天 16:50 山东
佬这是几面啊
点赞 回复 分享
发布于 今天 16:40 广东

相关推荐

站队站对牛:营销党 会造势
点赞 评论 收藏
分享
评论
14
37
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务