面试题 之 webpack

1.说说你对webpack理解?解决什么问题?

Webpack 是实现前端项目的模块化,用于现代 JavaScript 应用程序的静态模块打包工具,被webpack 直接引用的资源打包进 bunde.js的资源,当webpack 处理应用程序时,它会在内部构建一个依赖图,依赖图对应映射到项目所需的每个模块 ,并生成一个或多个 bundle

解决问题:

1️⃣编译代码能力,提高效率,解决浏览器兼容问题

2️⃣模块整合能力,提高性能,可维护性,解决浏览器频繁请求文件的问题

3️⃣模块能力,项目维护性增强,支持不同种类的前端模块类型,统一的模块化方案,所有资源文件的加载都可以通过代码控制

2.说说webpack的热更新是如何做到的?原理是什么?

模块热更新指在应用程序运行过程中,替换、添加、删除模块、而无需重新刷新整个应用。

webpack中配置开启热模块

更改之后css可以直接更新,js需要额外操作指定模块来热更新

原理总结:

通过webpack-dev-server创建两个服务器: 提供静态资源的服务express和Socket服务

express server 负责直接提供静态资源的服务(打包后的资源直接被浏览器请求和解析)

socket server 是一个 websocket 的长连接双方可以通信当socket server 监听到对应的模块发生变化时,会生成两个文件.json和.js文件

通过长连接socket server 可以直接将这两个文件主动发送给客户端(浏览器)

浏览器拿到两个新的文件后,通过HMR runtime机制,加载这两个文件,并且针对修改的模块进行更新

3.说说webpack的构建流程?

1️⃣初始化流程:

从配置文件和 Shell 语句中读取与合并参数,并初始化需要使用的插件和配置插件等执行环境所需要的参数:

2️⃣编译构建流程

从 Entry 发出,针对每个 Module 串行调用对应的 Loader 去翻译文件内容,再找到该 Module 依赖的 Module,递归地进行编译处理

3️⃣输出流程:

对编译后的 Module 组合成 Chunk,把 Chunk 转换成文件,输出到文件系统

4.说说webpack proxy工作原理?为什么能解决跨域?

webpack proxy基本行为就是接收客户端发送的请求后转发给其他服务器解决在开发模式下跨域问题。通过webpack-dev-server来实现代理服务,将自动编译和自动刷新浏览器等集成在一起。webpack配置deServer属性里的proxy实现代理。

工作原理:

proxy 工作原理是利用 http-proxy-middleware 这个http 代理中间件,实现请求转发给其他服器。

解决跨域:在开发阶段, webpack-dev-server 会启动一个本地开发服务器,而后端服务又是运行在另外一个地址上所以在开发阶段中,由于浏览器同源策略的原因,当本地访问后端就会出现跨域请求的问题,通过设置 webpack proxy 实现代理请求后,在代理服务器传递数据给本地浏览器的过程中,两者同源,并不存在跨域行为,浏览器就能正常接收数据。

注意:服务器与服务器之间请求数据并不会存在跨域行为,跨域行为是浏览器安全策略限制。

5.说说webpack中常见的loader?解决了什么问题?

loader用于对模块的源代码进行转换,在import或加载模块时预处理文件。

webpack分析各个模块的依赖关系,然后形成资源列表,最终打包生成到指定的文件中。

6.说说webpack中常见的plugin?解决了什么问题?

htmlWepackPlugin

打包后自动生成一个html文文件,并把打包生成的js模块引入到该html中

clean-webpack-plugin

删除构建目录

mini-css-extract-plugin

提取css到一个单独的文件中

7.说说loader和Plugin的区别?

区别:

loader 是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中

plugin 赋予了 webpack 各种灵活的功能,例如打包优化、资源管理、环境变量注入等,目的是解决loader 无法实现的其他事

8.如何提高webpack的构建速度?

优化loader 配置

合理使用resolve.extensions

优化 resolve.modules

优化resolve.alias

使用 DLLPlugin 插件

使用 cache-loader

terser 启动多线程

合理使用sourceMap

9.如何借助webpack优化前端性能?

通过webpack 优化前端的手段有:

JS代码压缩

CSS代码压缩

Html文件代码压缩

文件大小压缩

图片压缩

Tree Shaking

代码分离

内联 chunk

分包

减少http请求次数

10.与webpack类似的工具还有哪些?区别?

Rollup

默认支持tree-shaking,代码效率更简洁效率更高

Parcel

跟webpack dev server一样也支持模块热替换,但用法更简单

Snowpack

会为应用程序每个文件构建一次,就可以永久缓存,文件更改时,snowpack会重新构建该单个文件

vite

直接启动开发服务器,不需要进行打包操作,也就是不需要分析模块的依赖,不需要编译,因此启动速度快

11.webpack的优势?

智能解析:对 CommonJS 、AMD、ES6 的语法做了兼容

万物模块:对 js、css、图片等资源文件都支持打包

开箱即用:HRM、Tree-shaking等功能

代码分割: 可以将代码切割成不同的 chunk,实现按需加载,降低了初始化时间

插件系统,具有强大的 Plugin 接口,具有更好的灵活性和扩展性

易于调试:支持SourceUrls 和SourceMaps。

快速运行:webpack 使用异步10 并具有多级缓存,这使得 webpack 很快且在增量编译上更加快

生态环境好:社区更丰富,出现的问题更容易解决

相关推荐
优雅永不过时·17 分钟前
Three.js 原生 实现 react-three-fiber drei 的 磨砂反射的效果
前端·javascript·react.js·webgl·threejs·three
神夜大侠3 小时前
VUE 实现公告无缝循环滚动
前端·javascript·vue.js
明辉光焱3 小时前
【Electron】Electron Forge如何支持Element plus?
前端·javascript·vue.js·electron·node.js
柯南二号3 小时前
HarmonyOS ArkTS 下拉列表组件
前端·javascript·数据库·harmonyos·arkts
wyy72933 小时前
v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条
前端·ui·html
前端郭德纲4 小时前
ES6的Iterator 和 for...of 循环
前端·ecmascript·es6
王解4 小时前
【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)
前端·webpack·es6
欲游山河十万里4 小时前
(02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数
前端·ecmascript·es6
明辉光焱4 小时前
【ES6】ES6中,如何实现桥接模式?
前端·javascript·es6·桥接模式
PyAIGCMaster4 小时前
python环境中,敏感数据的存储与读取问题解决方案
服务器·前端·python