webpack在面试中的频率还是挺高的,我有被问过以下问题:
webpack—>一切皆模块
webpack是一个前端项目自动化构建工具,也是一个静态模块打包器,当webpack处理应用程序时,会递归构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个bundle。
webpack 就像一条生产线,要经过一系列处理流程(loader)后才能将源文件转换成输出结果。 这条生产线上的每个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。
plugin就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源做处理。 webpack 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条生产线中,去改变生产线的运作。
概括地说,webpack
是一个打包/模块化的工具,可以通过loader
转换文件,通过plugin
扩展功能。
webpack的核心概念是:
es6
转换成es5
,scss
转换成css
从启动webpack构建到输出结果有以下过程:
webpack
配置参数,合并从shell
传入和webpack.config.js
文件里配置的参数,生产最后的配置结果;webpack
构建生命周期的事件节点,以做出对应的操作;entry
入口文件开始解析文件构建AST语法树
,找出每个文件所依赖的文件,递归下去;loader
配置找出合适的loader
用来对文件进行转换;entry
配置生成代码块chunk
;chunk
到文件系统;webpack的Code Splitting可以实现按需加载,它将文件分割成块(chunk),我们可以定义一些分割点(split point), 根据这些分割点对文件进行分块, 并实现按需加载。
作用:
webpack的Tree Shaking可以删除没有使用的代码,优化前端性能,提高构建速度。
tree-shaking是一种基于 ES Module 规范的 Dead Code Elimination 技术打包,在打包过程中检测工程中没有引用过的模块并进行标记,删除没有引用过的模块,提高构建速度,减少程序运行时间。
热更新可以理解为模块的热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用。
配置:
const webpack = require('webpack')
module.exports = {
// ...
devServer: {
// 开启 HMR 特性
hot: true
// hotOnly: true
}
}
HMR并不像 Webpack 的其他特性一样可以开箱即用,需要有一些额外的操作,我们需要去指定哪些模块发生更新时进行HRM,如下代码:
if(module.hot){
module.hot.accept('./util.js',()=>{
console.log("util.js更新了")
})
}
webpack
默认只会处理js
代码,但有时候我们也需要加载css
、图片,还需要将ES6
转成ES5
,将TypeScript
转成ES5
,将scss
、less
转成css
,将.jsx
、.vue
文件转成js
文件等等,而对于webpack
本身来说,它是不支持这些转化的,这时候就需要给webpack
扩展相应的loader
。
常用loader:
详细的讲解与配置,看这篇👉webpack中的loader
plugin:专注处理 webpack 在编译过程中的某个特定的任务的功能模块。
plugin 是一个扩展器,它丰富了 webpack 本身,针对 loader 结束后,webpack 打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听 webpack 打包过程中的某些节点,执行广泛的任务。
常用plugin:
更多plugin参考👉常用的18个webpack插件总结
插件(plugin)是 webpack 的支柱功能,用于扩展webpack的功能。当然loader也是变相的扩展了webpack ,但是它只专注于转化文件这一个领域。而plugin的功能更加的丰富,而不仅局限于资源的加载。一个插件就是一个类,可以在打包过程中的特定阶段执行。
从作用角度简单来讲:loader帮助我们加载文件资源,而plugins则是loader的延伸,并不限制于加载文件资源,同时也丰富了loader的功能。
webpack的其他常用功能/配置 参考👉webpack中常用loader及plugins(插件)
terser-webpack-plugin
optimize-css-assets-webpack-plugin
看了很多文章才总结的这篇博客,包括以下:
webpack 面试题整理
webpack打包原理
Webpack介绍-一切皆为模块
什么是webpack?
在查阅webpack相关资料的时候,我偶然间看到知乎上的一篇关于webpack的“吐槽”,虽然有些观点比较“极端”,但我觉得作者有些见解还是挺好的。
Webpack到底有什么用,2021年我们还需要Webpack和Babel吗?