「前端」字节前端一面

这已经是复活面了,之前一面完直接秒挂,这次至少目前还活着。

先是个人介绍,这个面试官比较直接,在我介绍到第一个项目的时候就开始问问题了,后面就直接开始拷打项目了,没让我接着往下讲。不得不说,这个面试官的风格就是极具侵略性,会对着你的一个失误猛攻,有些人可能会慌,我的经验就是平常心对待,反正我就是个正常人,我又不是超人,犯错是很正常的事情罢了。

  1. Vue-Router的几种路由方式
    1. hash模式和history模式
  2. SPA是什么,和MPA的区别,有什么缺点?怎么优化?
    1. 单页面应用/切功能不需要跳页面/首屏速度慢/SSR
  3. 为什么SSR可以优化,别的不可以吗?
    1. SPA慢是因为渲染需要js参与,SSR通过服务器直接渲染拿到html,从而加速了访问
    2. SSR是针对SPA做的优化,别的当然也可以,比如CDN/减少静态资源大小/雪碧图/减少CSS和JS对DOM构建的阻塞
  4. 还有什么优化的释放,比如我首屏不需要的东西可以不可以异步加载?
    1. 懒加载,Vue-Router 直接在component后面写箭头回调import;React直接用一个lazy包一个import回调
  5. 你提到了尽可能减少对DOM的阻塞,什么会阻塞DOM构建?
    1. CSS 和没有 defer/async 标签的 JS
  6. 向后端发请求的时候,经常会遇到先选一个选项发请求,这个请求可能有一段时间才能相应,然后又选了另一个选项,你怎么保证我的数据是正确的?
    1. 请求是可以打断的,比如fetch可以通过AbortController中断请求,然后去发最新的请求就行了
  7. 有了解过他是怎么实现的吗?
    1. 就是跟拿到timeoutId去clearTiemout类似,拿到一个句柄,就可以给他发信号让他切断
    2. "AbortController 的工作原理是通过创建一个控制器和信号 (AbortSignal) 来实现。你可以将这个信号传递给 fetch 请求或其他支持中断的异步操作。当你调用 AbortController.abort() 时,传递的 AbortSignal 会触发中断信号,导致异步操作立即停止,并通常会抛出一个 AbortError 异常。"
  8. 如果不用 axios,只让你用HTTP Request,你如何实现?
    1. 用 Promise 封装一下,http request正常返回的时候就resolve,然后有异常就reject
  9. 看到你移动端布局使用了tailwindCSS,为什么要用这个?
    1. 写起来比较简单,不用想类名,然后写起来读起来都比较清晰,开发效率会更高
  10. 没有缺点吗?
    1. 从性能上,他最坏不会坏过原生的 CSS,加上他本身是一个 css 的预处理器,可以获得很多预处理器带来的性能提升,比如自动移除未使用的类,打包后更小的css文件体积等
    2. 从人为因素上来讲,tailwindCSS 可能会间接地让部分开发者写很长的classname,从而降低代码的可读性
  11. 你的布局里用了flex和grid,为什么用这些?
    1. grid 主要用来实现一些异形卡片布局,比如我可能要12,21,2*2的卡片,这样的布局用grid写起来会非常方便
    2. flex 作为现代的弹性布局方式,在对齐、多列布局方面非常方便
    3. 配合css的媒体查询去做移动端的响应式布局
  12. 有没有了解过其他的响应式布局方式?
    1. 还可以通过UA来判断用户设备,然后返回不同的布局
  13. 那这个布局是如何转换的?
    1. 聊了一些vw、vh、rem之类的方式
  14. 下面是无聊的八股部分
    1. css如何局中一个元素
    2. 定位/浮动/BFC
  15. 为什么从今年的1月份到现在做了这么多项目?
    1. 因为要学习,要找工作😅
  16. CDN解决什么问题?
    1. 静态资源加载缓慢
  17. 浏览器渲染网页的过程
    1. 八股复读
  18. js的代码输出题,常规的宏任务/微任务事件循环考察
  19. async await 背后的具体实现有了解过吗?
    1. 就是Promise的语法糖,可以等价的转化为Promise.then之类的,但是面试官对这个答案不是很满意,说你这个是用法,不是原理
    2. 我猜他想听:async 函数是返回一个 Promise 的函数。即使函数内部没有显式地返回 Promise,也会自动将返回值包装成 Promiseawait 会暂停 async 函数的执行,直到 Promise 被解析(即变为成功或失败),然后恢复函数的执行,并返回 Promise 的结果。如果 Promise 被拒绝,await 表达式会抛出异常,这可以通过 try/catch 块来捕获。
  20. 手撕:最长公共前缀
  21. 继续八股:
    1. 常见的数据结构/特性/用法/场景
    2. js里的数据类型/复杂类型和简单类型的区别
    3. 值传递和引用传递的区别
    4. 事件冒泡/可以用这个机制实现什么?(事件代理)
  22. 看你这里手写了一个进度条,如果需要你将其封装成一个通用的组件,你怎么写?
    1. 一开始说了自定义hooks,后来聊下来发现其实介绍一个prop作为百分比然后更新就行了
  23. 然后面试官就开始拷打,说你为什么一上来就说自定义hooks?
    1. 我就花了不到3s思考这个问题,难免有不周到的地方,实际开发过程中肯定有更充足的思考时间(这个面试官问的非常有侵略性,但我还是努力在反驳,我觉得几秒钟的考虑时间有点失误也很正常吧)
  24. 继续延伸,如果你想让这个组件支持自定义样式,你该如何实现?
    1. 拿一个属性去接受className就行了
  25. 然后又开始跟我纠结为什么不是style而是className,我怎么知道用户一定就用tailwindCSS?
    1. 反正你拿两个属性都接受不就完了吗,支持tailwindCSS是个额外的feature,大不了你不用呗
  26. 当你封装一个组件的时候,最重要的是什么?
    1. 高内聚,低耦合(面试官觉得太虚了,让我细说)根据Vue官方文档的推荐,你的组件应该提供详细的props的类型定义甚至validator,因为你的props的定义其实就是你的组件的使用文档
  27. 你的项目上提了一些性能指标,都是什么意思,什么问题会导致某个指标高,如何优化?
    1. 八股复读
  28. 那这些优化你有实现过吗?
    1. 我写的这些网页都比较简单,所以没有做过具体的性能优化
  29. 那你为什么要写这个性能指标?
    1. 因为我care性能
  30. 你care性能为什么不去优化他,那你关心他干嘛?
    1. 因为我不去优化是因为我认为他足够好,而不是我不知道性能可以优化
  31. 你如何做性能分析?
    1. lighthouse/performace
  32. JS 里捕获异常的方式有哪些呢?
    1. try/catch Promise.catch之类的
  33. 你说的都是局部的,我不可能每个地方都try/catch吧
    1. 我一开始说的高阶组件,面试官又问说那我不用框架呢
    2. 那你最上层try/catch呗
    3. 可以用一些全局异常捕获的api,比如window.onerror, window.onunhandledrejection
  34. 推荐了《高级程序设计》这本书
#字节求职进展汇总##前端##秋招#
全部评论
性能分析那块给我看笑了哈哈哈
9 回复 分享
发布于 2024-08-25 18:29 浙江
看面经就感觉压力大😓 async await原理应该是generator yield吧
2 回复 分享
发布于 2024-08-26 10:42 辽宁
广告业务组么,我被问了一个半小时
1 回复 分享
发布于 2024-08-31 08:57 上海
好贴
1 回复 分享
发布于 2024-08-26 09:33 北京
楼主是面的哪个部门
点赞 回复 分享
发布于 2024-08-29 20:01 四川
一面完多久通知呀
点赞 回复 分享
发布于 2024-08-28 14:04 浙江
优质面经
点赞 回复 分享
发布于 2024-08-27 12:01 广东
css解析不会阻塞dom构建
点赞 回复 分享
发布于 2024-08-27 01:43 北京
第一次听AbortController,不过好在其他的都常规八股
点赞 回复 分享
发布于 2024-08-26 17:11 北京
async await的底层原理要答到Generator吧
点赞 回复 分享
发布于 2024-08-26 16:40 上海
太强了佬
点赞 回复 分享
发布于 2024-08-26 14:58 重庆
“可以用一些全局异常捕获的api,比如window.onerror, window.onunhandledrejection”,大佬,这个会细问吗
点赞 回复 分享
发布于 2024-08-26 14:03 浙江
我的妈呀 问了好多
点赞 回复 分享
发布于 2024-08-26 13:04 浙江
关注了 爱看
点赞 回复 分享
发布于 2024-08-25 23:59 上海
async原理是生成器函数
点赞 回复 分享
发布于 2024-08-25 22:55 江苏
太***了,说实话,大佬
点赞 回复 分享
发布于 2024-08-25 21:18 山西
学到了好多
点赞 回复 分享
发布于 2024-08-25 19:46 北京
你每次都录音吗佬,感觉你每一篇都回忆的好细
点赞 回复 分享
发布于 2024-08-25 19:08 四川

相关推荐

让ai总结了一下问题和回答,心累了,面试官一直问优化相关的问题,多少也回答了一些出来,最后反问的时候,问有什么能加强的,说是觉得项目没什么亮点,一、代码问题的主动发现与预防主动发现方式静态代码分析:使用 ESLint、TSLint 等工具在编码阶段检测语法错误、代码规范问题、潜在逻辑漏洞(如未处理的空值、死循环)。自动化测试:通过单元测试(Jest)、集成测试(Cypress)覆盖核心逻辑,结合 CI/CD 流程在提交 / 部署前触发测试,提前暴露问题。代码审查:制定 Code Review 规范,重点检查边界条件、性能风险、安全性(如 XSS、CSRF)。监控告警:线上通过 Sentry 等工具捕获运行时错误(如 TypeError、Promise 未捕获异常),结合日志分析高频异常点。预防措施制定开发规范:明确命名规则、代码结构、错误处理方式(如统一使用 try/catch 或全局异常捕获)。技术选型管控:避免引入低维护性依赖,优先选择成熟库并控制版本。定期重构:针对耦合度高、可维护性差的代码进行重构,降低后续迭代风险。二、To C 项目的监控设计To C 项目需重点关注用户体验与稳定性,监控设计可从以下层面展开:前端性能监控核心指标:首屏加载时间(FCP)、交互响应时间(TTI)、白屏时间,通过 Performance API 或第三方工具(如 Lighthouse、阿里云 ARMS)采集。资源加载:监控 JS/CSS 加载耗时、图片加载失败率,设置阈值告警(如某资源加载超时 >3s)。用户行为与异常监控错误监控:捕获 JS 运行时错误、接口错误(4xx/5xx)、资源加载失败,关联用户 ID、设备信息便于定位。行为轨迹:记录用户点击、滑动等操作,分析卡顿、崩溃场景的触发路径(如某按钮点击后高频报错)。业务指标监控核心流程转化:如注册、支付步骤的成功率,异常中断时触发告警。设备兼容性:统计不同浏览器 / 机型的报错率,优先修复高占比问题。实现方式埋点系统:通过 SDK 主动上报监控数据,后端存储后用 Grafana 等工具可视化。实时告警:配置短信 / 钉钉通知,针对严重错误(如大面积白屏、支付失败)即时响应。三、虚拟列表优化实现虚拟列表核心是只渲染可视区域内的 DOM 元素,减少渲染压力,实现思路:核心原理计算可视区域高度、单个 item 高度,确定可见项数量(如可视区高度 500px,item 高 50px → 可见 10 项)。监听滚动事件,动态计算滚动偏移量,确定当前需渲染的 item 起始索引。通过容器内的 “占位元素” 撑起列表总高度,避免滚动条异常,可视区项通过绝对定位展示。关键优化缓存已渲染项:避免滚动时频繁销毁 / 创建 DOM,仅更新位置和内容。预渲染缓冲区:在可视区上下额外渲染 1-2 项,减少快速滚动时的空白闪烁。动态高度支持:若 item 高度不固定,可通过预估高度 + 滚动时修正位置解决。库选型:优先使用成熟库(如 react-virtualized、vue-virtual-scroller),减少自研成本。四、列表滑动卡顿的排查与优化排查方向性能分析:用 Chrome DevTools 的 Performance 面板录制滑动过程,查看是否有长任务(>50ms)、频繁重排(Layout)/ 重绘(Paint)。DOM 数量:检查列表是否渲染了过多 DOM(如未做虚拟列表),导致渲染线程阻塞。事件处理:滑动时是否绑定了高频事件(如 scroll、touchmove)且未做节流 / 防抖,导致 JS 线程繁忙。样式问题:是否使用复杂样式(如阴影、渐变)或强制同步布局(如频繁读取 offsetHeight 后修改样式)。优化措施实现虚拟列表:减少 DOM 数量(见上文)。优化事件:对 scroll/touchmove 事件节流(如 100ms 触发一次),避免高频执行。减少重排 / 重绘:将固定样式抽离为 CSS 类,避免 inline 样式;使用 will-change: transform 让浏览器单独分层渲染。数据处理:若滑动时需加载数据,提前预加载并缓存,避免同步阻塞。五、白屏的检测与解决检测方式前端埋点:在页面关键节点(如 DOMContentLoaded、首屏元素渲染完成)设置时间戳,若超过阈值(如 5s 未渲染)则上报白屏事件。图片监控:在页面顶部放一个 1x1 像素的 “探针图片”,若加载成功则证明页面正常,否则判定为白屏。错误关联:结合 JS 错误日志(如关键脚本加载失败、语法错误)定位白屏原因。解决思路加载问题:优化资源加载(如 CDN 加速、代码分割、懒加载),处理脚本加载失败(如重试机制、备用 CDN)。渲染阻塞:避免 JS 阻塞 HTML 解析(如用 defer/async),减少首屏不必要的 CSS/JS。数据依赖:若白屏因接口延迟,增加骨架屏、加载动画,避免用户感知空白;接口失败时显示错误提示并提供重试。兼容性:修复特定浏览器的渲染 bug(如 CSS 前缀缺失、ES6+ 语法未转译)。六、ECharts 性能问题及优化常见性能问题大数据量渲染卡顿(如万级以上数据点)。频繁更新(如实时数据)导致内存泄漏或 CPU 占用过高。图表容器大小频繁变化时重绘异常。折线图(多日期筛选)的优化与后端方案前端优化:数据采样:根据日期范围动态调整精度(如日级展示 24 点,周级展示 24*7 点,月级按天采样而非小时,避免数据量过大)。节流重绘:筛选日期时,通过防抖(如 300ms 延迟)避免频繁调用 setOption。销毁旧实例:切换筛选条件前,调用 dispose () 销毁旧图表,释放内存。懒加载:非首屏图表延迟初始化,避免阻塞首屏渲染。与后端沟通方案:动态返回精度:后端根据筛选的时间范围(天 / 周 / 月)返回对应粒度的数据(如周级返回按小时聚合的平均值,而非每小时原始数据)。分页 / 分段加载:若需保留细粒度,后端支持按时间段分段返回,前端滚动时再加载后续数据。数据压缩:后端用二进制或精简格式(如仅返回 [x,y] 数组而非完整对象)减少传输量。ECharts 适配方案响应式容器:监听窗口 resize 事件,调用 resize () 方法调整图表大小,结合 CSS 媒体查询适配不同屏幕。移动端优化:简化图表样式(如隐藏次要网格线、缩小字体),触摸交互适配(如支持双击放大、手势缩放)。七、图片优化方向资源优化格式选择:优先使用 WebP/AVIF(比 JPEG 小 30%+),降级兼容旧浏览器;简单图形用 SVG 替代位图。压缩处理:通过工具(如 TinyPNG)或后端服务(如七牛云)压缩图片,平衡质量与体积。合理尺寸:根据展示容器大小提供多分辨率图片(如 srcset 属性),避免大图小用。加载优化懒加载:使用 IntersectionObserver 监听图片进入视口后再加载,减少首屏请求。预加载:对首屏或即将展示的图片(如轮播图下一张)用 link [rel="preload"] 预加载。缓存策略:设置合理的 Cache-Control 头,复用缓存减少重复请求。体验优化占位符:加载前显示低分辨率缩略图或纯色占位,减少布局偏移(CLS)。错误处理:图片加载失败时显示默认图,避免破图影响体验。八、图片加载时间的检测前端检测监听事件:通过 img.onload 记录加载完成时间,减去 img.src 赋值时间,得到加载耗时。Performance API:使用 performance.getEntriesByType ('resource') 获取图片资源的加载详情(如 startTime、responseEnd),计算耗时 = responseEnd - startTime。埋点上报:将检测到的耗时结合图片 URL、用户设备信息上报,分析慢加载图片。工具辅助浏览器 DevTools:Network 面板筛选 img 类型资源,查看各阶段耗时(如 DNS、TCP、下载)。第三方监控:通过 Lighthouse 或监控平台(如 Datadog)批量分析页面图片加载性能。
查看8道真题和解析
点赞 评论 收藏
分享
1.挑一个项目介绍2.设计百度搜索结果页的前端架构,需支持高并发访问、个性化推荐(如根据用户历史调整结果排序)、多终端适配,简述核心技术选型与架构分层。3.V8 引擎的垃圾回收机制中,新生代与老生代的回收算法有何差异?百度贴吧的长帖详情页(含大量图片、评论)如何排查并解决内存泄漏问题?4.Webpack 的代码分割(Code Splitting)有哪些实现方式?百度地图Web 端如何通过代码分割优化首屏加载体积,减少初始化时间?5.百度直播的实时弹幕功能,如何基于 WebSocket 设计一套可靠的消息推送方案,确保高并发下消息不丢失、不重复,且延迟低于100ms?6.React18 的 Concurrent Mode 与 Suspense 如何配合使用?百度智能云的数据分析看板(含大量图表渲染)如何利用这两个特性优化用户交互体验?7.浏览器的回流(Reflow)与重绘(Repaint)有何区别?百度搜索结躍为之页的“无限滚动加载”功能,如何避免频繁操作导致的回流问戾能运年?8.百度翻译的“实时翻译”功能(输入文字实时显示译文),如何设计前端状态管理方案,支持多语言切换、翻译历史记录、离线翻译缓存?9.HTTPS 的握手过程中,证书验证的具体流程是什么?百度金融的支付页面为何必须使用 HTTPS,且禁用 HTTP 降级?前端如何检测当前页面是否为 HTTPS 环境?10.百度百科的 “目录跳转”与“锚点定位”功能,如何实现平滑滚动且精准定位到对应章节?若页面存在固定导航栏,如何避免定位偏移?
深情的鳄鱼不放弃:这些面试题虽然不常规,但是有意义多了
查看10道真题和解析
点赞 评论 收藏
分享
评论
35
124
分享

创作者周榜

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