webpack面试题

914 阅读4分钟

根据其他博主的webpack面试题进行整理

什么是webpack

webpack是一个打包模块化javascript的工具,在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化项目。 WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式以供浏览器使用。

webpack 和 gulp 的区别?

webpack是一个模块打包器,强调的是一个前端模块化方案,更侧重模块打包,可以把开发中的所有资源都看成是模块,通过loader和plugin对资源进行处理。

gulp是一个前端自动化构建工具,强调的是前端开发的工作流程,通过配置一系列的task(如代码压缩,合并,编译以及浏览器实时更新等),然后定义这些执行顺序,来让glup执行这些task,从而构建项目的整个开发流程。

webpack打包原理

把所有依赖打包成一个 bundle.js 文件,通过代码分割成单元片段并按需加载。

webpack构建过程 

Webpack在启动后,会从Entry开始,递归解析Entry依赖的所有Module,每找到一个Module
,就会根据Module.rules里配置的Loader规则进行相应的转换处理,对Module进行转换后,
再解析出当前Module依赖的Module,这些Module会以Entry为单位进行分组,即为一个Chunk
。因此一个Chunk,就是一个Entry及其所有依赖的Module合并的结果。最后Webpack会将所
有的Chunk转换成文件输出Output。在整个构建流程中,Webpack会在恰当的时机执行Plugin
里定义的逻辑,从而完成Plugin插件的优化任务

什么是loader,什么是plugin

loader用于加载某些资源文件。因为webpack本身只能打包common.js规范的js文件,对于其他资源如css,img等,是没有办法加载的,这时就需要对应的loader将资源转化,从而进行加载。

plugin用于扩展webpack的功能。不同于loader,plugin的功能更加丰富,比如压缩打包,优化,不只局限于资源的加载。

几个常见的plugin和常见的loader

plugin:
html-webpack-plugin 打包结束后,在dist目录中自动生成一个html文件,并把打包生成的js自动引入到这个html文件中
clean-webpack-plugin 删除打包文件
webapck-dev-server 实现自动打包编译功能(将dist文件托管到内存中),并开启热更新功能

loader:
css-loader 加载 CSS,支持模块化、压缩、文件导入等特性
style-loader 把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSS
url-loader:在文件很小的情况下以 base64 的方式把文件内容注入到代码中去
babel-loader 把 ES6 转换成 ES5
source-map-loader 加载额外的 Source Map 文件,以方便断点调试
eslint-loader:通过 ESLint 检查 JavaScript 代码

什么是bundle,什么是chunk,什么是module

bundle:是由webpack打包出来的文件

chunk:是指webpack在进行模块依赖分析的时候,代码分割出来的代码块

module:是开发中的单个模块

什么是模热更新?有什么优点?

模块热更新是webpack的一个功能,它可以使得代码修改之后,不用刷新浏览器就可以更新。

优点:只更新变更内容,以节省宝贵的开发时间。调整样式更加快速,几乎相当于在浏览器中更改样式

webpack-dev-server 和 http服务器的区别

webpack-dev-server使用内存来存储webpack开发环境下的打包文件,并且可以使用模块热更新,比传统的http服务对开发更加有效。

什么是长缓存?在webpack中如何做到长缓存优化?

浏览器在用户访问页面的时候,为了加快加载速度,对用户请求的静态资源都会进行存储,但是每次代码更新或者升级的时候,我们都需要浏览器去加载新的代码。最方便的方法就是引入新的文件名称,只下载新的代码块,不加载旧的代码块,这就是长缓存。

在webpack中,在output输出的文件制定chunkhash,并且分离经常更新的代码和框架代码,通过NameModulesPlugin或者HashedModulesPlugin使再次打包文件名不变。

什么是Tree-sharking?

tree-sharking 是指在打包中去除那些引入了,但是在代码中没有被用到的那些死代码。它依赖静态的es6模块化语法,例如通过import和export default导入导出,css中使用Tree-shaking需要引入Purify-CSS