起源
面试官:"你对 webpack
的了解怎么样,简单地说说。"
没错,这是我最近面试中遇到过的频率较高的一道面试题。从七月到九月疯狂投递简历,但是收到的面试却不是很多,所以我会珍惜每次面试机会,记录好每次的面试题目,以便回顾哪些地方答得不好,哪些地方需要改进,后续我会将我在面试中出现频率高的面试题单独拎出来和大家讲一讲。
对于这个关于 webpack
的题目,请原谅我是一名刚毕业的学生,对 webpack
的了解并不多,可能只知道它可以打包。虽然有过一小段实习机会,但是接触到 webpack
的机会少之又少。
于是乎,我便利用投简历和面试的空隙时间,来学习了解一下 webpack
,每天给自己的今日计划中,webpack
必不可少。
webpack的作用和打包流程
这里我们来讲一下它的作用和打包的流程。
作用
我首先看了官方的解释,但是我觉得官方的解释太官方了,我觉得可以将它通俗化一点。webpack
是一个打包工具,它可以将项目进行模块化打包,在进行打包过程的时候会触发 Loader
和 Plugin
(后面会介绍),使得打包后的项目质量更高、速度更快等。
如果要细分作用的话,webpack
还能解决在开发阶段的跨域问题、压缩代码文件等等。
打包流程
关于打包流程我也用相对通俗易懂的话说一遍吧。
webpack
中最核心的就是入口和出口,需要配置好 Loader
加载器和 Plugin
插件。我们可以把 webpack
看做是一个模块打包机,它做的事情是分析项目结构,找到 js
模块以及其他的一些浏览器不能直接运行的语言,比如 TS
,SCSS
等,通过 Loader
加载器可以将其转换为合适的格式供浏览器使用。最后就转换成相应文件输出到文件系统中即可。
lua
output: {
// bundle生成位置
path: path.resolve(__dirname, "dist"),
// bundle文件名
filename: "main.js",
clean: true,
},
由于 webpack
只能识别 js
和 json
文件,因此需要 Laoder
加载器来转换其他类型的模块。
webpack的Loader和Plugin
这里我们来讲一下它里面的 Loader
加载器和 Plugin
插件。
Loader
Loader
被称作加载器,主要主要是翻译浏览器不能直接运行的语言,比如 TS
、SCSS
。当碰到识别不了的模块时,就会通过 Loader
来进行解析。
下面举个简单的小例子。
perl
rules: [
{
test: /.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"],
},
{
test: /\.(js|jsx)$/,
exclude: /(node_modules)/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env", "@babel/preset-react"],
plugins: [
["@babel/plugin-transform-runtime"],
],
},
},
},
],
这里用到了 css-loader ,less-loader 和 babel-loader。
css-loader
可以将 CSS
文件通过 require
的方式引入,并返回 CSS
代码;less-loader
顾名思义,就是用来处理 Less
,与之相同的还有 sass-loader
等;babel-loader
就是用 babel
来转换文件的。
Plugin
Plugin
被称作插件,负责 webpack
扩展功能,来解决 Loader
无法实现的其他事情,像打包优化、资源管理等都是通过 Plugin
来实现的。
下面举个简单的小例子。
arduino
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html",
filename: "index.html",
inject: "body",
}),
new MiniCssExtractPlugin({
filename: "./styles/[contenthash].css",
}),
new CssMinimizerWebpackPlugin(),
],
这里应用到了 HtmlWebpackPlugin ,MiniCssExtractPlugin 和CssMinimizerWebpackPlugin。
HtmlWebpackPlugin
用来创建 HTML
文件;MiniCssExtractPlugin
可以将 CSS
代码从 JavaScript
中分离出来,生成单独的 CSS
文件;CssMinimizerWebpackPlugin
这个是关于 CSS
优化的插件,就不过多介绍了。
总结
以上就是关于我对 webpack
的初理解了,对于 webpack
的学习并没有结束,这只是一个开始。
就我目前而言,我使用过 webpack
创建项目,也使用过它里面的插件进行代码优化,不过对于 webpack
的用法还仅仅是浮于表面。
如果有我理解不好的地方或者大伙有更好的理解方式欢迎各位在评论区里指出,另外各位也可以在评论区里讨论一些关于 webpack
的疑难问题~