学习笔记-5年工作经验前端开发面试10问(含答案)

内容分享2天前发布
0 2 0

一、面试问题及参考答案

1. 问题:React 的虚拟 DOM 原理是什么?实际项目中如何优化虚拟 DOM 渲染性能?

答案

虚拟 DOM 是 React 对真实 DOM 的抽象描述(JS 对象),核心流程为:① 组件状态更新生成新虚拟 DOM;② 通过 Diff 算法对比新旧虚拟 DOM 差异;③ 仅将差异部分映射到真实 DOM 进行更新。

项目优化手段:

• 合理使用 React.memo(组件级缓存)、useMemo(计算结果缓存)、useCallback(函数缓存),避免不必要的重渲染;

• 列表渲染时绑定唯一稳定的 key,避免 Diff 算法误判节点移动;

• 拆分大型组件为细粒度组件,减少每次 Diff 的范围;

• 使用 React.lazy + Suspense 实现组件懒加载,减少初始渲染压力。

2. 问题:前端工程化中,Webpack 的构建流程是什么?如何优化 Webpack 构建速度和打包体积?

答案

Webpack 构建流程:① 初始化参数(合并配置文件、CLI 参数);② 初始化 Compiler 实例;③ 加载插件;④ 确定入口文件;⑤ 递归解析模块依赖(AST 分析);⑥ 模块转换(Loader 处理);⑦ 生成 Chunk;⑧ Chunk 输出为 Bundle 文件。

优化方案:

• 构建速度:

◦ 配置 exclude/include 缩小 Loader 处理范围;

◦ 使用 cache-loader 或 webpack 5 内置缓存,缓存已处理模块;

◦ 多线程构建(thread-loader);

◦ 拆分 node_modules 为独立 Chunk(splitChunks),避免重复打包。

• 打包体积:

◦ 代码压缩(terser-webpack-plugin 压缩 JS,
css-minimizer-webpack-plugin 压缩 CSS);

◦ Tree-shaking 移除未使用代码(需 ES6 模块化、mode 为 production);

◦ 图片优化(url-loader 转 base64 小图,image-webpack-loader 压缩图片);

◦ 引入第三方库时使用 CDN 或按需加载(如 Lodash 用 lodash-es + Tree-shaking)。

3. 问题:前端性能优化的核心指标有哪些?从网络、渲染、代码层面分别说说优化手段。

答案

核心指标(参考 Core Web Vitals):① LCP(最大内容绘制,<2.5s 为佳);② FID(首次输入延迟,<100ms 为佳);③ CLS(累积布局偏移,<0.1 为佳)。

优化手段:

• 网络层面:

◦ 资源压缩(Gzip/Brotli);

◦ 资源缓存(HTTP 缓存、Service Worker 离线缓存);

◦ 懒加载(图片、组件、路由);

◦ CDN 分发静态资源;

◦ HTTP/2 多路复用减少连接开销。

• 渲染层面:

◦ 避免阻塞渲染(CSS 放头部并内联关键样式,JS 放尾部或加 defer/async);

◦ 减少回流重绘(批量操作 DOM、使用 will-change 预渲染、避免 table 布局);

◦ 使用 CSS3 硬件加速(transform/opacity);

◦ 优化关键渲染路径(减少关键资源数量、缩短关键资源大小)。

• 代码层面:

◦ 减少代码体积(Tree-shaking、按需加载);

◦ 优化循环和条件判断,避免冗余计算;

◦ 合理使用闭包、避免内存泄漏;

◦ 大型应用采用微前端或按需加载框架(如 Vue 3 按需引入组件)。

4. 问题:说说你对前端安全的理解,常见的安全漏洞有哪些?如何防范?

答案

前端安全核心是防范恶意攻击,保护用户数据和页面完整性,常见漏洞及防范:

• XSS(跨站脚本攻击):

◦ 原理:注入恶意脚本到页面执行,窃取 Cookie、篡改页面;

◦ 防范:输入输出过滤(转义特殊字符)、使用 textContent 替代 innerHTML、设置 CSP(内容安全策略)、Cookie 设 HttpOnly/Secure 标志。

• CSRF(跨站请求伪造):

◦ 原理:利用用户已登录状态,诱导用户发送恶意请求;

◦ 防范:请求加 CSRF Token、验证 Referer/Origin、使用 SameSite Cookie(SameSite=Lax/Strict)、关键操作需二次验证。

• 点击劫持:

◦ 原理:通过 iframe 嵌套页面,诱导用户点击隐藏按钮;

◦ 防范:设置 X-Frame-Options: DENY、使用 framebusting 脚本。

• 其他:

◦ 敏感数据泄露:传输加密(HTTPS)、前端脱敏展示(如手机号中间四位打码);

◦ 依赖包漏洞:定期更新依赖(npm audit 检测)、使用 npm ci 锁定版本。

5. 问题:Vue 3 相比 Vue 2 有哪些核心改善?Composition API 相比 Options API 的优势是什么?

答案

Vue 3 核心改善:

• 响应式系统重构:用 Proxy 替代 Object.defineProperty,支持数组索引、对象新增属性的响应式,且性能更优;

• Composition API(组合式 API):替代 Options API,更灵活的代码组织方式;

• 更好的 TypeScript 支持:源码用 TS 重写,类型定义更完善;

• 编译优化:静态提升、PatchFlags 标记动态节点、hoistStatic 提升静态节点,减少运行时开销;

• 体积更小:Tree-shaking 支持更好,按需引入核心 API(如 createApp)。

Composition API 优势:

• 逻辑复用更灵活:无需依赖 mixin(避免命名冲突、逻辑来源模糊),可通过自定义 Hook 抽离复用逻辑;

• 代码组织更清晰:相关逻辑聚焦管理,大型组件中便于维护(如将请求、状态、方法按功能拆分);

• 更好的 TypeScript 集成:类型推导更自然,减少类型声明冗余;

• 按需使用 API:减少不必要的性能开销,仅引入所需的响应式 API(如 ref/reactive)。

6. 问题:前端跨域的缘由是什么?常见的跨域解决方案有哪些?各自的适用场景是什么?

答案

跨域缘由:浏览器的同源策略限制(协议、域名、端口三者不一致即为跨域),目的是防止恶意网站窃取数据。

常见解决方案及适用场景:

• CORS(跨域资源共享):

◦ 原理:服务端设置响应头(
Access-Control-Allow-Origin 等)允许跨域;

◦ 适用场景:前后端分离项目,服务端可修改配置(推荐首选)。

• 代理转发(Webpack Dev Server 代理、Nginx 代理):

◦ 原理:利用代理服务器规避浏览器同源策略,代理服务器转发请求到目标服务器;

◦ 适用场景:开发环境(Webpack 代理)、生产环境(Nginx 代理),服务端无法修改配置时。

• JSONP:

◦ 原理:利用 <script> 标签不受同源策略限制,通过回调函数获取跨域数据;

◦ 适用场景:仅支持 GET 请求,老旧浏览器兼容场景(不推荐首选)。

• 其他:

◦ postMessage:适用窗口间跨域通信(如 iframe 与父页面);

◦ document.domain:适用主域名一样、子域名不同的场景(如 a.test.com 和 b.test.com)。

7. 问题:说说你在项目中如何进行前端状态管理?Redux、Vuex/Pinia 的核心原理是什么?如何选择状态管理库?

答案

前端状态管理核心是统一管理组件共享状态,避免 props 层级传递冗余,项目中实践:

• 简单场景:使用 React Context + useReducer、Vue 2 Provide/Inject,无需引入复杂库;

• 中大型场景:React 项目用 Redux(配合 Redux Toolkit 简化配置),Vue 项目用 Pinia(Vuex 继任者,更轻量、支持 TS)。

核心原理:

• Redux:基于 Flux 架构,遵循三大原则(单一数据源、状态只读、纯函数修改),通过 Action(描述行为)、Reducer(纯函数修改状态)、Store(存储状态)实现状态流转,中间件(如 Redux-Thunk、Redux-Saga)处理异步逻辑。

• Pinia:简化 Vuex 架构,无 Mutations 层,直接通过 Actions 修改状态(支持异步),内置模块划分(无需 Modules 嵌套),天然支持 TS,体积更小、API 更简洁。

选择依据:

• 项目规模:小型项目用原生 API,中大型项目用专业库;

• 技术栈:React 生态优先 Redux Toolkit,Vue 生态优先 Pinia;

• 团队熟悉度:优先选择团队成员更熟悉的库,降低学习成本;

• 功能需求:需复杂异步逻辑(如并发请求、撤销请求)选 Redux + Redux-Saga,简单异步需求选 Pinia 或 Redux-Thunk。

8. 问题:前端模块化发展历程(IIFE、AMD、CMD、CommonJS、ES6 Module),它们的区别是什么?

答案

前端模块化是为了解决命名冲突、代码复用、依赖管理问题,发展历程及区别:

• IIFE(立即执行函数表达式):

◦ 原理:通过函数作用域隔离变量,避免全局污染;

◦ 特点:无官方规范,依赖手动引入脚本,无法自动管理依赖;

◦ 示例:(function() { … })()。

• AMD(异步模块定义,如 RequireJS):

◦ 原理:异步加载模块,依赖前置(提前声明所有依赖);

◦ 特点:适合浏览器环境,支持异步加载,语法繁琐;

◦ 示例:define(['dep1', 'dep2'], function(dep1, dep2) { return module; })。

• CMD(通用模块定义,如 SeaJS):

◦ 原理:异步加载模块,依赖就近(用到时再声明依赖);

◦ 特点:语法更贴近 CommonJS,适合浏览器环境,现已逐渐淘汰;

◦ 示例:define(function(require, exports, module) { var dep1 = require('dep1'); })。

• CommonJS(如 Node.js):

◦ 原理:同步加载模块,运行时加载;

◦ 特点:适合 Node.js 服务器环境(文件读取同步无阻塞),模块输出是值拷贝(修改不影响原模块);

◦ 示例:const dep = require('dep'); module.exports = { … }。

• ES6 Module:

◦ 原理:静态加载(编译时解析依赖),模块输出是值引用;

◦ 特点:浏览器和 Node.js 均支持,支持 Tree-shaking,语法简洁(import/export);

◦ 示例:import dep from 'dep'; export default { … }。

核心区别:

• 加载方式:AMD/CMD 异步,CommonJS 同步,ES6 Module 静态同步(编译时确定依赖);

• 适用环境:IIFE/AMD/CMD 浏览器,CommonJS Node.js,ES6 Module 双环境;

• 依赖管理:ES6 Module 支持静态分析(Tree-shaking),其他不支持。

9. 问题:说说你对微前端的理解,它的核心价值是什么?实际项目中如何落地微前端架构?

答案

微前端是一种架构模式,将大型前端应用拆分为多个独立部署、技术栈无关的小型应用(子应用),通过基座应用(主应用)整合,实现子应用间的协同工作。

核心价值:

• 技术栈无关:子应用可自由选择 React、Vue、Angular 等框架,解决历史项目技术栈迁移难题;

• 独立部署:子应用单独开发、测试、部署,不影响其他子应用,提升迭代效率;

• 隔离性:子应用间的 JS 作用域、CSS 样式、DOM 结构相互隔离,避免冲突;

• 增量迁移:逐步替换老旧系统,无需一次性重构,降低风险。

落地方案:

• 基座应用选型:使用 Single-SPA(通用微前端框架)或 qiankun(基于 Single-SPA,简化配置,支持样式隔离、JS 沙箱);

• 子应用改造:

◦ 暴露生命周期钩子(bootstrap、mount、unmount);

◦ 处理路由(子应用路由添加基础路径,避免与主应用冲突);

◦ 样式隔离(子应用添加 CSS 前缀、使用 CSS Modules 或 qiankun 自动隔离);

◦ JS 隔离(qiankun 内置沙箱,避免全局变量污染);

• 通信方案:

◦ 简单场景:通过 URL 参数、LocalStorage 共享数据;

◦ 复杂场景:主应用提供全局事件总线(如 mitt)或状态管理库(如 Redux),子应用通过注入 API 通信;

• 部署方案:子应用独立部署到 CDN,主应用部署到服务器,通过配置中心管理子应用入口地址。

10. 问题:描述一个你主导的前端复杂项目,遇到的最大技术挑战是什么?如何解决的?从中获得了哪些经验?

答案

(注:此为开放性问题,以下为参考回答框架,实际需结合候选人项目经历判断)

参考案例:

• 项目背景:主导某电商平台前端重构(日活 10 万 +),技术栈从 Vue 2 迁移到 Vue 3 + Vite + Pinia,需保证重构期间业务不中断,性能提升 30%。

• 最大挑战:① 旧系统历史代码冗余,依赖复杂,迁移过程中兼容性问题频发;② 重构后首屏加载速度需达标(目标 <3s);③ 多团队协作开发,需保证代码规范和开发效率。

• 解决方案:

a. 分阶段迁移:将系统拆分为首页、商品详情、下单流程等模块,优先迁移非核心模块,核心模块灰度发布,逐步替换旧系统;

b. 兼容性处理:编写适配层(Adapter)兼容旧系统 API,使用 Vue 2 到 Vue 3 的迁移工具(vue-migration-helper)检测问题,自定义 Loader 处理旧语法;

c. 性能优化:采用 Vite 替代 Webpack 提升构建速度,使用 Pinia 简化状态管理,路由懒加载 + 组件按需加载,图片使用 WebP 格式 + CDN 分发,首屏关键样式内联;

d. 团队协作:制定统一的代码规范(ESLint + Prettier),使用 Git Flow 管理分支,搭建组件库和工具函数库复用代码,定期开展技术分享同步进度。

• 获得经验:① 大型项目重构需循序渐进,重点关注兼容性和灰度发布,降低风险;② 技术选型需结合项目场景和团队能力,而非盲目追求新技术;③ 良好的工程化规范(代码规范、构建流程、部署流程)是提升团队效率的关键;④ 性能优化需针对性解决核心指标(如 LCP、FID),而非盲目优化。

(注:文档部分内容由 AI 生成)

© 版权声明

相关文章

2 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    百万壹贰 投稿者

    无界那一个微服务框架怎么样

    无记录
  • 头像
    巫婆梅 读者

    感觉都大差不差

    无记录