提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、为什么使用webpack
前端在构建项目的过程中需要对项目进行模块化拆分(包含代码打包拆分和编写时的模块化编写),解决维护、文件过大等难题,变量的作用域问题等
二、webpack与其竞品
gulp
gulp的主要作用是自动化和优化工作流,例如编译less文件为css,编译es6和typescript等这种耗时的任务。
gulp擅长处理静态资源,对静态资源的处理创建任务即可完成自动化管理。gulp确实模块化管理的能力,对单页面应用的模块化支持不够,不能做到有效的模块整合
vite
三、webpack的loader与plugin
webpack中有两个很重要的部分是loader与plugin
loader主要是提供了文件转换的功能,类似于gulp的自动转换,比如less-loader less转css,babel-loader需要搭配@babel/core转换es代码等
plugin是功能强大的插件,例如html-webpack-plugin就可以提供生成html文件的功能。它可以在编译的过程中利用compiler对象获取webpack的完整环境,以及确认执行的时机等
四、webpack打包编译(compile)流程
根据配置的入口
traval() 遍历文件提取依赖
构建出一个依赖图(引用的关系存在上面,相当于有了每一个文件的位置,文件本身也能拿到)
bable等loader进行转换处理
根据入口切片 行成chunk(包含所有依赖合并的结果)
产出 bundle
挂载bundle(html)
plugin执行的时机是优于loader的,它是能够获取到整个webpack执行过程的所有内容的
next.js主要是为了react生产贴身打造,他需要做的一开始就是为了生产环境打造的单页面,每个页面都有文件自动生成路由,支持多种开发辅助工具,内置less、typescript等
五、webpack treeshaking如何剔除多余代码并且做minmax 处理
这个功能主要得以与import的静态分析功能,在编译时分析模块的使用情况,如果使用require在运行时确定就来不及确定模块的使用情况,参考js 模块化,AMD、CMD以及commonjs和es6模块化
六、webpack热更新原理
client与webpack通过websocket进行关联
一般使用webpack-dev-server打开开发环境,webpack监听文件内容变化,通过hash值判断进行热更新,如果没有配置当更新时会使用刷新
七、webpack模块联邦
利用webpack5的webpack/lib/container/ModuleFederationPlugin 提供的ModuleFederationPlugin 插件完成一个微前端(微前端现有的落地方案可以分为三类,自组织模式、基座模式以及模块加载模式)部署形式的项目
参考文章如何使用webpack5的模块联邦特性落地微前端
八、webpack优化
通用优化
- 减少loader使用次数,比如babel只编译src下的文件
- 减少loader/plugin的使用次数
- 减少需要解析的条目数modules等参数的条目数量
- 减少编译结果的大小 chunk大小
- 持久化缓存,使用cache选项
- dllplugin为不经常更改的代码生成单独的编译结果,但是这样会增加构建过程的复杂度
- thread-loader可以将非常消耗资源的loader单独执行一个worker pool(线程池)(基本用不上)
开发环境
- 修改webpack的watch配置
- devtool设置低质量的map来将对性能消耗 最佳 eval-module-source-map
- 避免dev环境使用生产环境的构建工具
生产环境不启用sourcemap
参考文章
知乎webpack面试题
webpack面试题
可以去b站搜webpack教程,学习免费课程