前端高频面试题汇总
本文覆盖浏览器原理、性能优化、工程化、React/Vue、微前端、网络安全、Node 等核心知识点。
欢迎点赞收藏,共同进步!
🧠 一、基础原理与通识
1. SSR 链路渲染是什么?
SSR(Server Side Rendering)即服务端渲染,指 HTML 内容在服务器生成后直接返回给浏览器,减少首屏白屏时间,提升 SEO 效果。
2. 浏览器同源策略为什么 CDN 不会跨域?
CDN 请求静态资源时使用
3. cookie 可以实现不同域共享吗?
不可以。cookie 是按域隔离的,但可以通过设置 主域(Domain) 实现子域共享。
4. px 如何转 rem?
通过设置 html { font-size: 16px },然后 1rem = 16px,可通过 postcss-pxtorem 插件自动转换。
5. flex: 1 代表什么?
表示 flex-grow: 1; flex-shrink: 1; flex-basis: 0,元素会自动填充剩余空间。
⚙️ 二、工程化与构建
1. babel-runtime 是干什么的?
@babel/runtime 提供 Babel 转译后的辅助函数复用,避免每个文件重复注入 helper。
2. package.json 中 sideEffects 是干什么的?
告诉打包工具哪些文件有副作用,帮助 tree-shaking 删除未使用代码。
3. 为什么 Vite 比 Webpack 快?
因为 Vite 使用 ESBuild(Go 写的)来预构建依赖,并基于浏览器原生 ESM 动态导入,不需要全部打包。
4. hash 是如何生成的?
Webpack 根据文件内容计算 hash 值,内容改变 hash 就会变化,用于缓存更新控制。
🧩 三、React 专区
1. 为什么循环渲染不推荐用 index 做 key?
因为 key 影响 diff 过程,使用 index 会导致错误复用节点,引发 UI 不一致。
2. 如何避免 context 引起全量重新渲染?
通过 memo + useContext + useMemo 或 context selector 优化。
3. 如何实现路由变化监听?
可使用 useLocation() 或 history.listen() 实现。
4. React 如何做性能优化?
- 组件拆分 + React.memo
- 合理使用 useMemo / useCallback
- 懒加载组件
- 避免不必要的 re-render
🧱 四、Vue 专区
1. 为什么不要在同一元素上同时用 v-if 和 v-for?
因为 v-if 优先级高于 v-for,会导致循环逻辑混乱,建议外层包一层<template>。。
2. Scoped Styles 如何实现样式隔离?
Vue 在编译时为每个组件添加唯一的 data-attr(如 data-v-xxx),实现样式作用域隔离。
🪞 五、微前端与架构设计
1. 为什么不推荐 iframe 实现微前端?
iframe 虽然天然隔离,但通信困难、体验差、样式不一致,不利于集成。
2. Qiankun 如何实现 JS 隔离?
通过 Proxy + sandbox 模拟独立 window 作用域,实现运行时沙箱。
3. 前端权限设计思路:
- 登录后后端返回权限列表
- 前端根据权限生成路由表
- 页面内按钮/功能点权限控制
📊 六、性能优化与监控
1. 首屏加载慢 2 秒怎么排查?
-
检查资源体积(分析 bundle)
-
使用懒加载、代码分割
-
服务端开启 Gzip/Brotli
-
检查接口耗时和阻塞资源
2. 如何保证批量请求失败只弹一个 Toast?
使用统一请求封装,通过拦截器收集错误,在所有请求结束后统一弹出。
3. 如何统计全站请求耗时?
封装 axios,记录请求开始/结束时间,上报耗时数据。
4. 如何做前端监控?
可接入 Sentry、阿里 ARMS,或自建 SDK,上报错误、性能、用户行为。
🌐 七、网络与安全
1. 单点登录(SSO)原理
通过统一认证中心(CAS),各系统共享 token 或 session,实现一次登录多系统可用。
2. OAuth2.0 授权登录
客户端跳转授权服务器 → 用户授权 → 获取 code → 后端交换 access_token → 登录成功。
3. 跨域携带 Cookie 的配置
axios.defaults.withCredentials = true;
response.setHeader('Access-Control-Allow-Credentials', 'true');
### **💡 八、实用技巧与场景题**
1. 如何禁止别人移除网页水印?
使用 canvas 动态绘制 + MutationObserver 检测 DOM 删除并自动重绘。
2. 如何实现网页加载进度条?
使用 NProgress 或在 axios 拦截器中统计请求完成比例。
3. 如何一次性渲染十万条数据不卡顿?
虚拟列表(Virtual Scrolling),只渲染可视区域节点。
4. 如何实现大文件分片上传?
使用 Blob.slice() + 多线程上传 + MD5 校验 + 断点续传。
5. 页面白屏排查思路:
- 检查 JS 报错(console)
- 网络资源加载失败
- SSR 返回空内容
- CDN 缓存错误
🧮 九、Node 与工具链
1. Node 如何利用多核?
使用 cluster 模块创建多个进程共享端口。
2. 如何写命令行工具统计代码行数?
使用 fs.readdir + readline 递归统计行数,可封装为 CLI。
3. git pull 与 fetch 区别?
- fetch 只拉取更新,不合并
- pull = fetch + merge
🧭 十、总结与延伸
前端的学习与面试,本质上是一个不断积累与反思的过程。
无论是从基础的 HTML、CSS、JavaScript,到进阶的工程化、性能优化、监控体系,再到微前端与架构设计,
每一个知识点都不是孤立存在的,而是相互关联、共同支撑起前端工程的完整体系。
你不需要一次性掌握所有内容,
更重要的是——知道问题出现时该往哪里查、如何快速定位、如何解决。****
保持好奇、持续学习、深入理解原理,
才能在项目复杂度和技术更新的浪潮中,始终保持清晰的判断力。