代码示例:
- 面试与总结——30 道高频面试题精讲,学习路线图回顾 & 社区贡献指南
(接上文《26. 从 0 到 1 的 CI/CD:GitHub Actions 全链路自动化实战》)
27.1 30 道高频面试题精讲
题目顺序 = 出现频次 × 考察深度,答案控制在 120 字内,可直接背诵,也可作为“追问式”面试的提词器。
| # | 题目 | 120 秒速答 | 追问陷阱提示 |
|---|---|---|---|
| 1 | 解释 React 中 setState 是同步还是异步? | 在 React18 合成事件与生命周期里是“异步批量”,在原生事件、setTimeout、flushSync 里是同步。追问:批量更新的底层数据结构是?(答:React 维护一个 updateQueue 环形链表) | |
| 2 | Fiber 架构解决了什么问题? | 把不可中断的递归 diff 变成可中断的链表遍历,实现时间切片与并发渲染。追问:workInProgress 树和 current 树如何双缓冲? | |
| 3 | useEffect 与 useLayoutEffect 差异? | 前者在浏览器绘制后异步执行,后者在绘制前同步执行;后者会阻塞视觉更新。追问:如何不依赖 ESLint 保证依赖数组正确? | |
| 4 | 如何避免 React 组件“僵尸子节点”? | 给列表项加稳定 key;避免使用 index;异步加载时保证 Suspense fallback 与 key 同步。 | |
| 5 | React.memo 一定提升性能吗? | 当 props 是“新引用但深层相等”时反而浪费一次浅比较;可自定义第二个参数做深比较或 useDeepMemo。 | |
| 6 | 什么是“状态提升”与“逆向数据流”? | 把共享状态放到最近公共父级,子组件通过回调通知修改;逆向数据流指子→父→兄弟。追问:Redux 是否违背单向数据流? | |
| 7 | Redux 中间件执行顺序? | 从右到左洋葱模型:applyMiddleware(thunk, logger) → dispatch = logger(thunk(dispatch))。 | |
| 8 | 为什么 useSelector 会频繁重渲染? | 默认使用 === 比较返回值;可用 shallowEqual 或 reselect。追问:React-Redux v8 的 useSyncExternalStore 作用? | |
| 9 | Zustand 比 Redux 快在哪里? | 无 Provider、无 Context、直接订阅 selector,跳过 React 渲染层。追问:如何做到时间旅行调试?(答:通过 redux-devtools 的 compose 插件) | |
| 10 | 如何测试自定义 Hook? | 使用 @testing-library/react-hooks 渲染到临时组件,act 触发更新;React18 用 renderHook。 | |
| 11 | React 18 的 Automatic Batching 例子? | 同一 click 句柄里 setA+setB 只会触发 1 次渲染;flushSync 可强制同步。 | |
| 12 | Concurrent Features 对业务代码侵入点? | startTransition、useDeferredValue、Suspense for Data;旧代码不改造也能跑,但想“并发”需标记低优。 | |
| 13 | 什么是“ hydration mismatch”? | 服务端与客户端 HTML 不一致导致注水失败;根因:随机数、时间、i18n、window 不可用。追问:Next.js 13 的 errorBoundary 如何捕获? | |
| 14 | Next.js 中 getServerSideProps 与 API Route 区别? | 前者在渲染前运行,返回 props;后者是独立后端接口,可返回 JSON。追问:Edge Runtime 限制有哪些?(答:无 Node.js API、最大 50 MB 内存) | |
| 15 | 如何做到“零加载骨架屏”? | 使用 Next.js 13 Streaming SSR,把 <Suspense> 边界放在布局,服务端先流式输出壳,再填数据。 | |
| 16 | 图片优化 Cumulative Layout Shift 指标? | 用 next/image 自动填宽高比,生成 blurDataURL;配合 CSS aspect-ratio。追问:Core Web Vitals 权重?(LCP 25%,FID 0%,CLS 15%,2024 起 INP 替代 FID) | |
| 17 | Webpack 与 Vite 热更新原理差异? | Webpack 基于 WebSocket + 模块热替换运行时;Vite 利用 ESM 原生插拔,仅重新请求变动模块。追问:Vite 为什么对 SSR 热更新慢? | |
| 18 | 如何分析包体积? | webpack-bundle-analyzer、source-map-explorer、next-bundle-analyzer;重点观察 duplicate、lodash、moment。 | |
| 19 | Tree-shaking 失效常见原因? | 引入 CommonJS、sideEffects:false 漏配、动态属性访问、babel 转译后无法静态分析。 | |
| 20 | 如何写一个 Babel 插件? | 访问者模式:export default function(){return{visitor:{Identifier(path){}}}}};用 @babel/types 构造 AST。 | |
| 21 | ESLint 规则“no-restricted-syntax”实战? | 禁止 await in loop、禁止 innerHTML;可自定义错误提示并给出修复实例。 | |
| 22 | Monorepo 如何约束子包依赖版本? | pnpm workspace + .pnpmfile.cjs + changeset;在 root package.json 设 peerDependencyRules。 | |
| 23 | CI 阶段如何并发跑测试与类型检查? | GitHub Actions matrix + job 级别并发;测试用 jest --shard,类型用 tsc --incremental。 | |
| 24 | 如何防止“测试用例通过但线上崩溃”? | 引入 Cypress 组件测试 + 生产 SourceMap 回滚 + Sentry 异常告警;灰度 5% 流量。 | |
| 25 | 前端错误监控采样策略? | Sentry 默认 1%,对 SyntaxError 全采,对 ChunkLoadError 按版本聚合。 | |
| 26 | 如何设计“可回溯”日志系统? | 每条日志带 traceId、userId、version、releaseTime;接入 ELK 或 Grafana Loki;保留 30 天热数据。 | |
| 27 | 如何防御 XSS 在 React 项目中? | 绝不使用 dangerouslySetInnerHTML;对用户富文本用 DOMPurify;CSP: default-src ‘self’。 | |
| 28 | 如何防御 CSRF? | SameSite=Strict + Token 双重校验;对 GraphQL 可在 Header 加 apollo-require-preflight。 | |
| 29 | 如何防御依赖投毒? | lockfile 维护、pnpm 自动 hoist=false、GitHub Dependabot 自动 PR、SNYK 扫描、私库代理 npm。 | |
| 30 | 低代码平台如何保障 DSL 版本兼容? | 用 json-schema 做快照 + migration 函数;发布时把 schema 版本写入 url;回滚时按版本路由。 |
27.2 学习路线图回顾
把 26 篇文章浓缩成一张 A4 纸,横向是时间维度(0-6 个月),纵向是能力维度(源码-工程-架构-业务)。建议在 Notion 建立「Roadmap 数据库」,每条知识点打标签:#源码 #性能 #工程化 #面试。
- 0-1 月:
HTML5 语义化 → CSS3 布局(Flex/Grid)→ ES2023 语法糖 → Git 工作流 → VSCode 快捷键 - 1-2 月:
React 官方教程通关 → Hooks 思维导图 → React-Router v6 → Axios 封装 → 第一个 Vite 项目 - 2-3 月:
读 React 源码(jsx → createElement → Fiber 初次渲染)→ 手写简易 Redux → 单元测试 Jest → 配置 ESLint + Prettier - 3-4 月:
性能优化(memo、useMemo、懒加载、骨架屏)→ Webpack 基础配置 → 首屏指标采集 → 写组件库 Storybook - 4-5 月:
Next.js 全栈 → SSR/SSG 差异 → API Route → 数据库 ORM(Prisma)→ 部署 Vercel & Docker - 5-6 月:
Monorepo + CI/CD → 错误监控 → 安全加固 → 微前端(Module Federation)→ 低代码平台方案调研
每完成一个节点,在 GitHub 开 Issue 记录“用时 + 产出 + 踩坑”,三个月后回来看就是最佳简历素材。
27.3 社区贡献指南
把“学会”变成“教懂”,是面试加分项,也是个人品牌复利。
- 选题
优先补全中文技术空白:React18 并发官方文档未翻译章节、Next.js 13 新特性示例、Webpack5 微前端案例。 - 输出形式
- 博客:优快云/掘金/知乎专栏,标题带版本号,如《React 18.3 源码调试笔记》。
- 代码:GitHub Repo 带 live demo(Vercel 一键部署)与 CI badge。
- 视频:B 站 10 分钟“动图+源码”短视频,封面统一风格,结尾放 GitHub 链接。
- 度量指标
- 文章:阅读量 >1 万、点赞 >200、收藏 >500,可写进简历“社区影响力”。
- 代码:Star >100、Issue 响应 <24h、PR 合并率 >90%,可附在 GitHub Profile README。
- 进阶玩法
- 翻译组:加入 reactjs/zh-hans.react.dev,提 PR 即可出现在官方贡献者名单。
- 插件生态:给 Vite/Webpack 写插件,提交到 awesome-vite/awesome-webpack 列表。
- 会议分享:从公司技术沙龙起步,投 360 前端大会、GMTC、React Conf China,CFP 模板:背景→痛点→方案→数据→复盘。
- 时间切片
每周固定 2 小时“社区时段”,用番茄工作法:25 分钟写作 + 5 分钟推流社交媒体;坚持 3 个月,Google 能搜到你,面试官也能。
27.4 结语
至此,从“浏览器回车”到“CI 绿灯”,从“Hello World”到“30 道面试题”,我们完成了一条完整的现代前端链路。把系列文章打印出来,就是一份自带目录的“纸质知识库”;把 GitHub 仓库星标起来,就是一把随时可以拔出的“瑞士军刀”。
技术成长没有终点,只有分叉口:你可以继续深耕框架源码,也可以往全栈、架构、产品甚至开源商业进发。无论选择哪条路,保持“写代码、写文字、写人生”的节奏,下一次面试,坐在对面的考官其实也在等你分享——“原来这个问题还能这样解”。祝各位读者都能把 Offer 收入囊中,把兴趣写进星辰大海。
更多技术文章见公众号: 大城市小农民
279

被折叠的 条评论
为什么被折叠?



