我的第一次前端跳槽面试实录:一个普通小前端的真实体验

224 阅读6分钟

今天终于去面试了,离开上一家干了2年的公司后第一次正式面技术岗。说实话,挺紧张的,感觉这两年都是在业务里打转,真到检验水平的时候心里特别没底。

面试前:准备了一堆,感觉啥也没记住

  • 简历反复改: 昨晚熬到1点改简历,把项目经历里的“参与”全改成了“负责”,但心里清楚有些模块我就是个写页面的。
  • 八股文背了忘: 什么Event Loop、Vue响应式原理、Webpack优化,看了好几遍,早上地铁上还在看,进公司大门前脑子里只剩浆糊了。
  • 白衬衫灾难: 想显得正式点穿了件白衬衫,结果吃早饭蹭了点油,只能把外套扣子扣上遮一遮,有点狼狈。

技术面:被问得手心冒汗

面试官是位挺和善的大哥(后来知道是技术负责人),但问题一点不含糊。

  1. CSS上来就卡壳:

    • 题目: “写个九宫格布局,格子间距10px,要自适应,鼠标放上去边框变红。”
    • 我的代码:
      .container {
        display: grid;
        grid-template-columns: repeat(3, 1fr); /* 这里脑子一抽差点写成 1px! */
        gap: 10px;
      }
      .item:hover {
        border: 1px solid red; /* 写完才想起来没加transition */
      }
      
    • 追问: “如果要求第三列在某些条件下隐藏,怎么改布局?”
    • 我的反应: 懵了。平时都是 .item:nth-child(3n) 隐藏单个项,没想到直接改 grid-template-columns 结构。支支吾吾说了句“可能用JS动态改类名?”,面试官笑了笑说“用 repeat(2, 1fr) 0fr 试试”,感觉瞬间被碾压了。
  2. Vue原理背出来了,手写就凉了:

    • 题目: “Vue3为什么用Proxy代替defineProperty?”
    • 我的回答: 这个我背熟了!流畅答出能监听新增/删除属性、数组变化等等。
    • 紧接的暴击: “好,那你手写个简化版的响应式核心,实现依赖收集和触发更新吧。”
    • 我的现场: 汗一下子就下来了。知道大概思路是 track 收集依赖,trigger 触发更新,但用WeakMap存依赖关系卡住了,effect函数怎么写也含糊。面试官看我实在憋不出来,给了点提示,才勉强写了个大概框架,感觉非常丢脸。
  3. 项目难点:实话实说反而好点?

    • 题目: “讲讲你在项目中遇到的最有挑战的技术问题,怎么解决的?”
    • 我的回答: 说了个生产环境内存泄漏的问题。花了好久用Chrome Performance监控,最后发现是页面里一个WebSocket实例没关,挂到window上了,切页面还在后台连着呢。后来在 beforeUnmount 钩子里加了关闭逻辑。
    • 追问: “想过用WeakRef来解决这类问题吗?为什么这里不合适?”
    • 我的内心: WeakRef?知道概念但没实际用过啊!硬着头皮说:“额…感觉WebSocket这种需要主动断开连接,光靠GC回收可能不及时也不确定?” 面试官点点头说“对,主要是GC时机不可控,不适合这种需要确定性关闭的资源”,松了口气,感觉蒙对了一半。
  4. 场景设计:急中生智想到AI思路

    • 题目: “现在需要你快速实现一个大文件分片上传,包括断点续传功能,设计下前后端思路,重点讲前端。”
    • 我的思路:
      • 前端:File.slice() 切分文件,用SparkMD5之类算分片hash(提了下名字,怕说错)。
      • 上传:控制并发数(提了下 p-limit 库),传分片和hash。
      • 断点续传:怎么记录哪些传过了?
      • 卡壳点: 断点续传的状态存哪?localStorage?IndexedDB?用户清缓存怎么办?脑子短路了。
    • 灵光一现: 突然想起之前用腾讯云AI助手(类似Copilot)时,它解释过类似逻辑。赶紧说:“可以先用 localStorage 存已上传成功的分片索引列表(比如hash或序号)。刷新页面后,先请求服务端看看哪些分片已经传过了,然后对比本地存的列表,只传剩下的。服务端负责记录最终哪些分片完整以及合并文件。” 面试官“嗯”了一声,感觉这关勉强过了。

HR面:问了个感觉还行的问题

  • 聊了期望薪资、离职原因(老实说想接触更大项目,技术成长)。
  • 经典问题: “你还有什么想问我们的吗?”
  • 我的提问: “请问咱们团队目前面临比较大的技术挑战或者技术债是什么?如果我加入,能在哪些方面尽快帮上忙?” (这是真想知道,也显得主动点)。
  • HR姐姐挺认真地回答了,提到老项目Vue2升级和单元测试覆盖不足的问题,感觉这个问题问对了。

意外的小惊喜

走的时候在电梯口碰到技术面试官,他主动跟我说:“你简历里写的那个用MutationObserver做DOM变化埋点的工具,思路挺有意思的,下周有空的话来二面详细聊聊这个?” 我当时愣了一下才反应过来赶紧说“好的好的!”。真是没想到,那个我自认为有点“玩具”性质、写在简历最末尾的项目,反而引起了注意。

回家后的总结(菜鸟的自我修养)

面完感觉像打了一场仗,累但收获很大。赶紧记下要补的课:

  1. 基础不牢,地动山摇: CSS Grid/布局题居然翻车!API不能光知道,得真理解灵活运用。手写原理更是硬伤,准备把Vue3响应式、虚拟DOM Diff这些核心手写题练熟。
  2. 项目复盘要深入: 解决过的问题不能只停留在“解决了”,得把背后的原理、为什么选这个方案、其他方案的优缺点都想清楚。像WeakRef这种概念,得补课。
  3. 场景题靠积累: 文件上传、性能优化、复杂状态管理这些常见场景,得自己多总结套路和最佳实践。AI助手能启发思路,但自己的理解才是根本。
  4. 小项目也有价值: 以后不能小看自己折腾的小工具、小实验,认真总结亮点,面试官可能更看重解决问题的思路和热情。
  5. 心态放平: 紧张真的影响发挥。下次提前到,深呼吸,不会的别硬编,坦诚说“这个我了解不深/需要查一下”,比乱说强。

写在最后

第一次面试,感觉自己离“大牛”还很远很远,就是个在成长中的普通前端。被问倒的地方不少,但也知道了努力的方向。不管这次二面结果如何,光是知道自己哪里不足,这趟就值了。

接下来?打开VSCode,先把手写响应式系统练十遍!


希望这个更朴实、细节更聚焦技术本身的版本符合你的要求!加油!