去年前端面试的通关率跌到17%,一个印度开发者的应对策略是:让作品集自己说话。Viram Choksi没做传统网页,直接在浏览器里搭了一套完整操作系统——开机画面、登录界面、可拖拽窗口、任务栏、13个交互应用、6个能玩的游戏,还有一个能用的终端。
这不是概念图,是真实跑在Next.js+React上的产品。招聘经理打开链接后,看到的不是滚动页面,而是一个需要等待15秒开机的"桌面"。
Choksi的动机很直接:95%的开发者作品集长得一样,hero大图、项目卡片、联系表单三件套。他想要的是让面试官"停止滚动"的东西。
技术选型:为什么不用Canvas
窗口管理器是整套系统的核心。Choksi考虑过用Canvas实现,像Figma那样。最终选了DOM方案,原因很简单:Canvas在50个并发窗口时性能更好,但一个作品集永远不会同时打开超过5个窗口。
DOM方案带来了额外收益——原生可访问性支持。ARIA标签、键盘导航、屏幕阅读器兼容,这些在Canvas里需要从零造轮子。
动画系统选了Framer Motion,代价是45KB的gzip体积。Choksi的权衡逻辑是:CSS做不了AnimatePresence,无法处理元素离开DOM时的退场动画。而开机序列、窗口过渡、桌面特效都需要编排好的弹簧物理效果和手势拖拽。
状态管理用了Context+useCallback/useMemo,没用Redux。整个OS状态(打开窗口、设置、主题)跨组件共享,但更新频率极低——用户点击触发,而非实时数据流。Redux会额外增加约12KB体积,而一次会话里状态变化可能只有5次。
Windows 11的磁吸逻辑,12像素判定
Choksi复刻了Windows 11的窗口磁吸功能:拖到左边缘占半屏,右边缘同理,顶部最大化。实现代码极简——
const getSnapZone = (clientX, clientY) => { const vw = window.innerWidth; if (clientY <= 12) return "top"; if (clientX <= 12) return "left"; if (clientX >= vw - 12) return "right"; return null; }
12像素的边缘判定区,拖动时显示半透明预览层。已磁吸的窗口拖出后自动恢复原尺寸。这个细节在真实操作系统里存在感极强,但在网页模拟中几乎没人做。
设置持久化用了localStorage,但Next.js的服务端渲染(SSR)带来了经典陷阱:服务端无法读取localStorage,直接读会导致hydration不匹配。Choksi的解法是先给默认值,mount后用useEffect从localStorage恢复。
SEO和可访问性:两个看似矛盾的坚持
首页完全由JavaScript渲染,这对搜索引擎不友好。Google能爬动态内容,但需要额外时间。Choksi的应对分三层:预渲染关键元数据到HTML、用JSON-LD结构化数据标记、提交动态渲染的站点地图。
更意外的是可访问性投入。OS模拟本身带有视觉复杂性,听起来和WCAG标准冲突。Choksi把日常工作中合规率从40%拉到95%的经验搬了过来——焦点陷阱管理、键盘快捷键、高对比度模式、减少动画偏好设置。
结果是:Lighthouse可访问性评分95,性能评分90+,首屏加载1.2秒。
性能数据背后有个反直觉的选择:为了动画效果牺牲45KB,为了简化API放弃Redux。Choksi的决策框架不是"选最快的",而是"选足够快且最省心智负担的"。
为什么招聘经理会记住这个
Choksi在自述里提到一个观察:OS隐喻强迫你解决真实问题——窗口z-index层级管理、焦点陷阱、状态持久化、窗口内不同"屏幕尺寸"的响应式布局。这些正是生产级应用面临的同款难题。
滚动页面太简单了。一个带重叠窗口的交互桌面,约束条件会逼出创造性解决方案。
这套作品集的代码结构也被设计为可扩展:新增一个应用只需创建组件、注册到app registry、添加图标和元数据。13个应用共享同一套窗口外壳,但内部完全自治。
6个可玩游戏包括扫雷、数独、2048等经典款,终端支持基础命令行交互。Choksi没做假的演示视频,每个功能都能点击、拖拽、关闭、崩溃(如果代码有bug的话)。
一个细节:开机序列的进度条不是装饰,是真实的资源加载进度。Choksi甚至做了BIOS风格的POST自检文字滚动——纯粹为了仪式感,但仪式感本身就是产品记忆点。
Choksi目前的状态是"积极看机会"。他的作品集日均访问量从改造前的个位数涨到现在稳定三位数,LinkedIn私信里出现频率最高的词是"impressive"。
但有个问题他没回答:当面试官真的打开这个OS开始玩扫雷,面试还剩多少时间聊技术?
热门跟贴