2025 秋招投递记录
米哈游
一面
- 什么是多线程?多线程操作如何保证安全性?
- 浏览器从输入 URL 到页面呈现的过程发生了什么
- TCP 与 UDP 的区别
- CSS 的几种定位
- computed 实现原理
- ref 与 reactive 的区别
- async 与 await 是如何转换成 es5 的代码的
- 常见的宏任务与微任务有哪些
- JavaScript 的事件循环
- map 与 weakMap 的区别
- 并行与并发的区别是什么
- JavaScript 中的垃圾回收算法
- ESM 模块与 CommonJS 模块的区别
- 手写代码:防抖
- 算法:给定一个数组与 k,求数组中出现频次前 k 高的数字
百度
base 深圳
一面
- 面试官介绍面试流程: 实习内容阐述、项目技术难点问答、基础技术知识、简单手写
- 自我介绍
- 实习经历深挖
- electron 唤起新窗口的实现(这里最开始没听懂想问什么, 后面意识到可以从窗口调度器的角度回答)
- 中台项目页面级别、组件级别、按钮级别的鉴权是怎么做的?
- 为什么服务端渲染可以提高首屏加载速度?
- 使用 WebWorker 解决了什么问题?具体的需求场景是怎样的?
- 如果不适用 WebWorker,如何避免繁重的数据切割操作阻塞主线程?
- (上问回答采用类似 fiber 的操作)如何获取浏览器在每一个渲染帧内的空余时间?
- 对于 monorepo 的理解,主要解决了什么问题?
- 实际工作中使用的是哪种 monorepo 工具?
- Vite 底层在开发环境与生成环境构建时有什么区别?
- Vue 中 nextTick 的最主要作用是什么,为什么要有这个 API?
- Vue2 与 Vue3 的区别有哪些?
- defineProperty 与 proxy 的区别是什么?为什么 Vue3 选择了 proxy?
- Vue2 中对数组进行操作时需要注意什么?
- 手写:发布订阅模式
二面
- 性能优化相关
- 服务端渲染能够提高首屏加载速度的原因
- 衡量首屏加载速度的指标
- 提高首屏加载速度的方案
- 构建工具分包具体怎么做?
- 一个项目中存在多个页面,如果只想打包某一个页面所用到的资源可以怎么做?
- 手写数组扁平化、去重、排序
- 扁平化/去重除了手写有没有现成的 api 能够直接调用?
- 常见的排序算法时空复杂度与适用场景
- 将上面代码封装为一个公共函数还需要注意哪些事情
- 对上述函数编写单元测试的流程是怎样的
- 对于某些存在随机因素的函数可以如何编写单测
- 如何将高版本的代码兼容低版本
- babel 的工作原理是怎样的
- 如何处理微前端项目之中可能存在的样式污染
- 微前端有哪些方案?
- 多个项目开发时如何使用同一套开发规范避免手动配置的繁琐?
- 脚手架有新版本时如何通知用户更新?
三面
- 介绍实习过程中最有成就感的一项工作
- 用三个点提炼一下这项工作的亮点
- 在与同事的合作中遇到过哪些问题,是如何解决的?为什么让你很有成就感?
- 不使用技术语言,用通俗易懂的话语描述一下这个项目做了什么事情
- 在这个项目中遇到了哪些技术难点,是如何解决的?
- 实习过程中接触到的需求都是来自于 mentor 还是说会有自己的想法?
- 后续的职业规划是怎样的?对于互联网对于国企对于各行各业的看法如何?
- 为什么想说做技术?在城市上的选择偏好是怎样的?
- 简历中的 Github 热力图是想要体现自己的什么特质?
- 平常在 Github 上会做些什么事情?
- 对于大模型的看法
- 在使用大模型过程中你觉得最有帮助的一个例子
- 共享屏幕展示平常如何使用大模型(提示词工程
- (此处介绍起了自己搭建 GPT 镜像网站的过程)
- 在互联网这个行业是否有偏好的公司或者说偏好的赛道
- 怎样看待互联网行业的工作强度, 在这方面有什么信心
- 反问环节
字节跳动
base 珠海 国际化电商
时间线:
一面
问答环节:
- 在腾讯实习期间个人硬实力和软实力获得了哪些提升:沟通能力与技术水平
- 对 electron 架构了解多少
- 实际开发过程中有没有发现 electron 某些能力其实是不具备的
- electron 的通信机制
- electron 窗口管理调度
- Vue3 迁移 Nuxt 过程中遇到需要注意的点
- Vue3 响应式原理
- 依赖收集过程中存储副作用函数的数据结构
- 某个需求中为什么使用 WebWorker
- 有没有考虑过 WebWorker 与主线程之间的通信传输数据量过大的问题
代码环节:
- 事件循环
js
async function async1() {
await async2();
console.log("async1");
}
async function async2() {
console.log("async2");
}
console.log("script start");
async1();
setTimeout(() => {
console.log("setTimeout");
}, 0);
// 追问, 此处添加 raf 并打印一个值会怎样 ( requestAnimationFrame )
new Promise((resolve) => {
console.log("promise1");
resolve();
}).then(() => {
console.log("promise2");
});
console.log("script end");
js
script start
async2
promise1
script end
async1
promise2
setTimeout
- 无重复字符的最长子串:分析自己所写算法的时空复杂度
二面
问答环节:
- 自我介绍:是否有读研的计划
- 说说你自己的长处或者优势,以及你觉得待改进的点有哪些
- 自己是如何学习前端的
- 为什么选择前端
- 对虚拟 DOM 的理解
- 频繁操作 DOM 会有什么问题
- 对重排重绘的理解
- 虚拟 DOM 为什么具有比较好的跨平台能力
- 客户端渲染迁移到服务端渲染的收益点有哪些
- 迁移过程中遇到的适配问题:例如服务端渲染无法拿到 window 对象
- 服务端渲染的过程中有没有遇到必须要客户端渲染的场景
- 为什么离职
- 客户端渲染迁移到服务端渲染大概的工作量
- 排行榜业务组件封装过程中的难点
- 如何说服同事使用你封装的组件
- 封装业务组件时,如何保证组件通用性和灵活性,你封装的这个组件核心功能和可配置项是什么
- 虚拟滚动实现原理
- 怎么监听某个元素是否进入可视区域:
IntersectionObserver
、getBoundingClientRect
- 如何使用 CSS 实现两边固定中间自适应布局:
flex / calc
代码环节:
- 事件循环(比一面的还简单)
- 实现一个类似模板字符串的功能
ts
/*
const person = {
name: 'Tom',
address: {
city: 'Shenzhen',
}
}
func('My name is ${name}, I live in ${address.city}', person)
// 打印结果:My name is Tom, I live in Shenzhen
*/
const func = (str: string, obj: Record<string, any>) => {};
三面
- 第一段实习难点介绍:除了这种解决方案还有其他更好的方案吗
- 什么时候开始学习前端的?如何学习前端的?为什么选择前端?
- 觉得自己的基础怎么样?有没有通过类似技术图谱的方式去检查自己在前端技术上缺少哪些知识?
- 第二段实习难点介绍:(解决了 ios 的某个适配问题)在未来的开发中如何避免其他人再次犯同样的错误
- 🚧 录音丢失...
- left join 与 right join 的区别
- 数据库中的索引有哪些,为什么要使用索引
- 进程与线程的区别
- 手写:发布订阅 & LeetCode 46.全排列
hr 面
- 为什么会对前端这个方向感兴趣
- 去年投递过字节的实习生岗位,你觉得自己这一年有哪些成长
- 除了字节还有投递过哪些公司
- 在工作城市上有什么偏好
- 会从哪些方面对比不同的 offer
- 简单介绍一下实习期间的工作
- 第二段实习与第一段实习相比有什么不同
- 对自己的评价,做的好的地方与需要改进的地方
- 能否提前来实习
- 介绍字节的工作强度问我看法
- 反问
网易雷火
基本信息:base 杭州 | 雷火事业群
时间线:
一面
- 行内元素与块级元素的区别?
- 页面头部的 meta 标签有什么作用、举例讲讲
- viewport 在移动端的一些应用
- description/keywords 用于搜索引擎优化
- label 标签的作用
- 垂直、水平居中布局的几种实现方式
- 介绍一下 BFC,如何创建 BFC
- CSS 动画与过渡,怎么去声明动画
- 防抖节流的区别与应用场景
- Vue 中计算属性与侦听器的区别
- Vue 中兄弟组件有哪些通信方式
- 移动端适配方案(或者说响应式布局)
- 我这里提到 less 搭配 vw
- 然后追问我 rem 了解过吗
- Git 常用指令有哪些
- 平常用到的图片格式有哪些,它们之间有什么区别?
- 图片懒加载实现逻辑
- 怎么判断 DOM 有没有进入可视区域内
- 前端性能优化有哪些常见方案
- 反问
二面
- 实习经历介绍
- 腾讯转正情况与个人意向
🎨 以下问题大多数是因为实习经历有所涉及
- 为什么从 CSR 迁移到 SSR,服务端渲染的好处有哪些?
- 除了 SSR 还有哪些方式可以去优化网站的 SEO
- 迁移过程中具体的难点
- 移动端适配方案
- meta 标签的 viewport 属性
- 怎么实现数据的上拉加载更多
- 如何保证大数据场景下页面的流畅性能(虚拟列表)
- ES6 对象与数组的解构赋值如何操作?如果我想要赋予默认值呢?
- 事件循环、宏任务微任务
- 第二段实习经历的难点与成长
- lint-stage 与 husky 具体工作流程
- webpack 打包构建整体流程
- npm run dev 这种命令是如何配置的
- 前端路由有哪些形式,具体实现原理是怎样的?
- canvas 有玩过吗?
- 平常用到的图片格式有哪些,它们之间有什么区别?
- Vue 中兄弟组件有哪些通信方式
- 手撕:https://www.nowcoder.com/share/jump/4084054291725441218495
美团
时间线:
- 09-04 一面
成都一面
- 实习经历难点与收获
- 对于实习中自己参与的某个项目怎么看
- Nuxt 框架最大的优势是什么
- Nuxt 约定式路由的实现原理
- 移动端适配方案(响应式布局)
- ios 安全底部的适配问题
- 其他移动端兼容适配问题:ios 输入聚焦时页面自动放大...
- 性能优化(开始吟唱)
- 青训营项目:npm 依赖分析工具是如何实现的
- 如何判断 package.json 中声明的依赖在项目中是否被使用
- 手写深拷贝
北京一面
- 移动端适配方案
- rem / em / vw 的含义与区别
- 使用 vw 时有没有考虑过兼容性问题
- watch 与 watchEffect 的区别
- Vue data 为什么要返回一个函数?不是函数会有什么问题
- setup 是如何实现类似选项式 API 的能力的?怎么访问到 props 和响应式数据与方法的
- provide 这个 api 的底层实现是怎样的
- useEffect 的用法 / 回调函数的执行时机 / 其返回的函数有什么作用?
- useEffect 与 useLayoutEffect 的区别
[1, 2] + [2, 1]
会输出什么.item2 ~ li
选择器的含义- 伪类与伪元素的区别
content-type
的含义与常见的几种类型- 响应头中与缓存相关的字段
- js 基本数据类型与引用数据类型在内存中的存储方式
- 手写寄生组合模式
- 变量提升与作用域
js
// 实现一个add方法, 使计算结果能够满足以下预期
add(1)(2)(3) = 6
add(1,2,3)(4) = 10
add(1)(2)(3)(4)(5) = 15
js
const promise = new Promise((resolve, reject) => {
console.log(1);
setTimeout(() => {
console.log("timerStart");
resolve("success");
console.log("timerEnd");
}, 0);
console.log(2);
});
promise.then((res) => {
console.log(res);
});
console.log(4);
js
foo();
bar();
function foo() {
console.log("foo");
}
var bar = function () {
console.log("bar");
};
Minimax
一面
- 服务端渲染的优势
- 服务端渲染迁移客户端渲染要做的一些适配
- 服务端渲染是否配置过什么错误监控的中间件
- Vue3 响应式原理
- Vue3 响应式与 Vue2 相比有哪些优势
- nextTick 作用与实现原理
- 事件循环:常见的宏任务与微任务有哪些 API
- Vue Router 实现的原理
- 使用 history 模式时需要做什么额外的配置
- 受控组件与非受控组件的区别
- interface 与 type 的区别
- 重复声明 interface 和 type 会怎样
- 如何使用 ts 中的工具函数 pick
- 为什么 vite 热更新速度更快
- 有没有自己手写过 loader 或者 plugin
- loader 与 plugin 的区别
- 浏览器缓存策略
- 调用 new 关键词实例化一个对象的过程
- 对 js bridge 的理解
- 手写:数组转树形结构
快手
一面
- 开发活动 H5 页面需要注意哪些事情
- 封装排行榜组件时做了哪些事
- 首屏渲染性能优化方案(开始吟唱!)
- 客户端渲染迁移到服务端渲染做了哪些适配
- style 标签与 script 标签的加载顺序
- 重排重绘的区别
- 常见 http 状态码
- http 与 https 的区别
- Vuex 与 Pinia 的区别
- Vue3 响应式原理
- 如何学习前端的
- 手撕:实现二进制字符串的加法
- 事件循环
js
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
return new Promise(() => {
console.log("async2 start");
// !此处没有 resolve 所以会阻塞后续代码执行
}).then(() => {
console.log("async2 end");
});
}
console.log("script start");
async1();
setTimeout(() => {
console.log("setTimeout");
}, 0);
console.log("script end");
猿辅导
一面
- 实习经历介绍
- 移动端适配方案
- 为什么选择 rollup 作为 npm 包的打包工具
- rollup / webpack / vite 的区别
- rollup 构建出的产物是什么形式的?别人使用时如何引入不同的模块
- 在开发 npm 包时内部是否有比较完整的规范,例如版本号的更新与 changelog 的维护
- CommonJS 与 ESM 的最本质区别
- webpack 使用的是 commonjs 还是 ESM
- webpack tree-shaking 的原理,如何判断一个模块是否被使用
- nexTick 的作用与原理
- nextTick 与 promise 的区别
- 同源策略与跨域解决方案
- 除了发送请求会触发跨域,还有哪些情况会触发跨域
- 加载字体文件时会触发跨域吗
position: fixed
偏移量是相对于谁的?如何改变这个偏移量的参照物- BFC 是什么,如何创建 BFC
- HTML 和 CSS 解析过程
- Promise A+ 规范
- 严格模式下的 this 指向问题
- 使用 bind 时需要注意什么问题
- 为什么很少使用 bind/apply/call 这些方法(因为箭头函数)
- 箭头函数的 this 指向
- js 中的 GC 算法,平常开发过程中如何避免内存泄漏
- 什么样的闭包会导致内存泄漏
- LeetCode 两两交换链表中的节点
Todo
Promise A+ 规范 事件循环例题
CSS flex 布局