webpack面试大白话回答

205 阅读4分钟

什么是webpack?

Webpack 是一个基于模块化打包的工具,自动化处理模块,webpack处理应用程序的时候,会递归一个依赖关系图,包含应用需要的所有模块,然后把这些模块打包成一个或多个包

常见的Loader

Loader的顺序是从右向左执行的,因为webpack使用了compose这样的函数是编程方式

image-loader:加载并且压缩图片文件

bable-loader:把es6转换成es5

Css-loader:加载css,支持代码化,压缩,文件导入等特性

style-loader:把css代码注入到js中,通过DOM操作去加载css

eslint-loader:通过ESLint检查js代码的规范

Webpack有哪些常用的Plugin

define-plugin:定义环境变量

html-webpack-plugin:简化html文件的创建

uglifyjs-webpack-plugin:通过uglifyJS来压缩js代码

webpack-parallel-uglify-plugin:多核压缩,提高压缩的速度

webpack-bundle-analyzer:可视化的webpack输出的体积

mini-css-extract-plugin:把css单独提取出来,支持按需加载

Loader和Plugin的不同?

作用不同:

Loader就是加载器的意思,webpack原生只能解析js文件,想要打包其他文件就要安装响应的插件,简单来说就是loader让webpack有了加载和解析非js文件的能力;

Plugin就是插件的意思,拓展webpack的功能;

用法不同:

Loader在moudle.rules里面配置,类型为数组,每一项都是一个object对象,像test文件类型的匹配,以及loader是对loader类型的选择,还有options参数

Plugin在plugin中单独配置,类型是数组,每一项都是一个plugin实例,参数都通过构造函数传入

webpack的构建流程?

根据配置,识别入口文件。从entry出发,针对每个模块串行调用对应的loader,在找到这个模块依赖的模块,进行递归编译处理,编译后的模块组合成了chunk,把chunk转换成文件,通过output输出文件

如何提高webpack的打包速度?

优化loader:首先想到的就是bable,他可以吧es6的语法转译为es5的语法,配置的时候可以通过test进行匹配文件的配置,以及可以通过include设置去查的路径,和exclude设置不去查的路径。

HappyPack:因为打包的时候是单线程的,所以打包下去会一个一个等待上一个任务完成之后再进行下一个,可以通过HappyPack把同步进行的打包转换为并行执行,这样就会加快打包速度

DllPlugin:可以将特定的类库提前打包引入,节约打包时间

代码压缩:UglifyJS来压缩代码,但这是单线程运行的,可以使用webpack-parallel-uglify-plugin来并行执行UglifyJS,从而提高效率

Module.noParse:确定一个文件下没有对应的依赖,就可以使用该属性让webpack不扫描该文件

如何减少webpack打包体积?

按需加载:按需加载,每个路由单独打包一个文件,不单单路由可以,像loadash这样的大型库同样可以使用这个功能

Scope Hoisting:会分析出模版之间的依赖关系,尽可能的把代码合并到一起

Tree ShaKing:可以实现删除项目中未使用的代码

如何用webpack来优化前端性能?

压缩代码:UglifyJS进行代码的压缩,使用css-loader压缩css代码

CND加速:将静态的资源用cdn加速的方式引入

Tree ShaKing:可以实现删除项目中未使用的代码

Code Splitting:将代码按照路由或组件分块,做到按需加载

提取第三方公共组件库:splitchunksplugin来进行公共模块的抽取

如何提高webpack的构建速度?

1.多入口情况下,使用commonsChunkPlugin来提取公共代码

2.通过externals配置来提取常用库

3.DllPlugin:可以将特定的类库提前打包引入,节约打包时间

4.HappyPack:通过HappyPack把单线程改成多个任务并行执行,加快编译速度

5.用webpack-parallel-uglify-plugin来并行执行UglifyJS

6.使用Tree ShaKing和Code Splitting来进行无用代码的删除