2024前端面试题-工程化篇

1.webpack(模块打包工具)五大核心

Entry入口,Output定义输出路径和命名规则,Loader模块转换器,Plugin扩展插件,Mode模式(Webpack使用相应模式的配置)

2.谈一谈你对Loader和Plugin的理解,使用过哪些?

loader:模块转换器,用于把模块原内容按照需求转换成新内容
通过使用不同的Loader,Webpack可以要把不同的文件都转成JS文件,比如CSS、ES6/7、JSX等

plugin:扩展插件
在 Webpack 构建流程中的特定时机注入扩展逻辑来改变构建结果或做你想要的事情
一个插件是含有apply方法的一个对象,通过这个方法可以参与到整个webpack打包的各个流程
IgnorePlugin
不打包匹配文件   
PrefetchPlugin
预加载的插件,提高性能

loader是用来对模块的源代码进行转换,而插件目的在于解决 loader 无法实现的其他事
因为plugin可以在任何阶段调用,能够跨Loader进一步加工Loader的输出
常用的:babel-loader(对js代码进行兼容性编译) file-loader(将webpack将所需的对象作为文件发送,并返回其公共URL.) url-loader less-loader, sass-loader

3.webpack热更新原理

Webpack的热更新,在不刷新页面的前提下,将新代码替换掉旧代码。

HRM的原理实际上是 webpack-dev-server(WDS)和浏览器之间维护了一个websocket服务。当本地资源发生变化后,webpack会先将打包生成新的模块代码放入内存中,然后WDS向浏览器推送更新,并附带上构建时的hash,让客户端和上一次资源进行对比.

4.什么是Code Splitting

Code Splitting代码分割,是一种优化技术。它允许将一个大的chunk拆分成多个小的chunk,从而实现按需加载,减少初始加载时间,并提高应用程序的性能 。

在Webpack中通过optimization.splitChunks配置项来开启代码分割

5.Webpack的Source Map是什么?如何配置生成Source Map?

Source Map是一种文件,它建立了构建后的代码与原始源代码之间的映射关系。通常在开发阶段开启,用来调试代码,帮助找到代码问题所在。

在Webpack配置文件中的devtool选项中指定devtool: 'source-map'来开启

6.如何减小打包体积

  • 按需加载:路由懒加载,动态组件按需加载
  • 代码压缩:使用uglifyjs-webpack-plugin插件压缩代码
  • 开启Tree Shaking摇树机制:optimization: {   usedExports: true,   concatenateModules: true,   minimize: true, }
  • 图片压缩:image-webpack-plugin
  • CDN引入
  • 使用Gzip压缩:在服务端(例如Nginx)配置启用Gzip
  • 移除不必要的插件和依赖
  • 代码分割(Code Splitting):将应用程序的代码划分为多个代码块,按需加载

7.webpack和vite的区别

编译方式:webpack在编译过程中,将文件打包成bundle.js文件,然后再运行这个文件
vite在开发模式下不会打包文件,他会利用浏览器的es module import属性,在需要时编译文件,在生产模式下,使用rollup打包,提供更好的tree-shaking,代码压缩和性能优化。
开发效率:webpack热更新是全量更新,修改一个文件会更新全部,会导致编译速度变慢。
vite是增量更新,只更新修改的文件,在大型应用中也可以保持较快的编译速度。
扩展性:webpack插件比vite丰富
应用场景不同:webpack适合大型复杂的项目,因为插件丰富,vite适合中小型快速开发的项目。

8.前端优化策略

  • 尽量减少http请求个数
  • 避免空的src和href
  • 使用CDN
  • 图片懒加载
  • 路由懒加载
  • 减少页面中的冗余代码
  • 杜绝404

9.为什么pnpm比npm快

  • Pnpm 使用基于内容寻址的文件系统来存储磁盘上的所有文件,这意味着它不会在磁盘中重复存储相同的依赖包,即使这些依赖包被不同的项目所依赖。这种存储方式使得Pnpm在安装依赖时能够更高效地利用磁盘空间,同时也减少了下载和安装的时间。
  • Pnpm 在下载和安装依赖时采用了并行下载的能力,这进一步提高了安装速度。
  • Pnpm 还具有一些其他特性,例如节省空间的硬链接和符号链接的使用,这些都有助于提高其性能。

10.说一下你对Monorepo的理解

Monorepo是一种将多个项目代码存储在一个仓库的代码管理方式,将不同的项目代码放在一个仓库中,优缺点如下: 优点:

  • 更好的实现代码复用,方便代码管理
  • 可以复用项目基础设施,不需要每个项目都建立一遍
  • 更好的CR
  • 子项目模块之间的关系更加透明,可以实现一次命令完成所有部署。
  • 管理依赖变得更加简单,可以在一个统一的环境中处理依赖库的版本和更新。
  • 一种开放,透明,共享的组织文化,这有利于开发者成长,代码质量的提升

缺点:

  • 代码权限管理变得很复杂
  • 项目上手学习成本高,需要了解子项目之间的依赖关系
  • 项目基础建设、依赖管理、代码搜索、分支模型等技术要求会很高
  • 所以代码放在一次,会导致项目仓库体积过大,clone等操作会变很慢
<think>好的,用户想要获取2024前端开发的最新面试题汇总。首先,我需要回顾一下现有的引用内容,看看有没有直接相关的资料。引用[1]提到了2024年的前端学习资料,但主要是自学用的,可能包含部分面试题。引用[2]指出面试官会根据简历提问,但技术基础需要自己分类准备,形成知识体系,并列举了一些题。引用[3]和[4]是关于JavaScript数组方法和异步操作的,这些都是面试常见的问题。 接下来,用户的需求明确是2024年的前端面试题,所以需要结合最新趋势和技术发展。当前端领域的热点包括Vue3、React 18、TypeScript、Webpack 5、Vite、性能优化、跨端开发等。此外,框架原理、工程化前端安全、算法等也是常考内容。 需要确保回答结构清晰,分门别类,覆盖基础、框架、工程化、网络、安全、算法等方面。同时,引用中提到的异步处理、数组方法等可以作为例子加入。还要注意引用标记的正确使用,例如引用[2]提到技术基础分类,引用[3]和[4]涉及具体问题。 可能还需要补充一些最新的面试趋势,如微前端、低代码、Serverless等,但引用中没有相关信息,可能需要根据现有知识添加,但需标明没有引用来源。要确保回答真实可靠,避免猜测不确定的内容。 最后,生成相关问题时要围绕用户需求,可能涉及如何准备面试、各知识点的深入问题、实际应用场景等。确保问题有针对性,帮助用户进一步学习。</think>### 2024前端开发面试题最新汇总 #### 一、JavaScript核心知识 1. **异步编程** - 解释事件循环机制,对比`Promise`、`async/await`、`Generator`的实现差异[^4] - 手写代码:实现带并发限制的异步任务调度器 $$代码示例:\text{class AsyncScheduler \{ ... \}}$$ 2. **ES6+新特性** - `Proxy`与`Reflect`的应用场景 - 如何用`WeakMap`实现私有属性? 3. **数组与对象操作** - 对比`map()`与`forEach()`的内存处理差异[^3] - 实现数组扁平化并去重(要求时间复杂度最优) #### 二、框架与原理 1. **React** - 解释Fiber架构如何优化渲染性能 - 使用Hooks时如何避免不必要的渲染?(举例`useMemo`与`useCallback`) 2. **Vue** - Vue3的`Composition API`与Options API的设计哲学差异 - 手写简易响应式系统(基于`Proxy`) 3. **跨框架问题** - 虚拟DOM的Diff算法优化策略 - 前端路由实现原理(Hash vs History) #### 三、工程化与性能优化 1. **构建工具** - Webpack Tree Shaking实现条件及局限性 - Vite为何比Webpack快?对比ES Module与Bundle机制的差异 2. **性能监控** - 如何通过Performance API分析首屏加载时间? - 描述LCP、FID、CLS指标的计算方式及优化手段[^1] #### 四、网络与安全 1. **HTTP协议** - 解释HTTP/3的QUIC协议如何解决队头阻塞问题 - 预请求(Preflight)在CORS中的触发条件 2. **前端安全** - 实现CSRF Token的生成与校验逻辑 - 如何防御XSS攻击?(结合Content Security Policy说明) #### 五、算法与数据结构 1. **高频手写题** - 实现`Promise.allSettled`的Polyfill - 二叉树层序遍历(要求输出Zigzag格式) 2. **场景题** - 设计一个实时协作的在线文档冲突解决算法(类似OT算法) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值