目录
1、什么是 webpack(必会)
2、webpack 的优点是什么?(必会)
3、webpack 的构建流程是什么?从读取配置到输出文件这 个过程尽量说全(必会)
4、webpack 与 grunt、gulp 的不同?(必会)
1、三者之间的区别
2、构建思路的区别
3、 从知识背景区别
5、有哪些常见的 Loader?他们是解决什么问题的?(必会)
6、Loader 和 Plugin 的不同?(必会)
1、不同的作用
2、不同的用法
7、webpack3 和 webpack4 的区别(必会)
9、是否写过 Loader 和 Plugin?描述一下编写 loader 或 plugin 的思路?(高薪常问)
1、基本定义
2、 编写思路
3、 编写注意事项
11、source map 是什么?生产环境怎么用?(高薪常问)
1、基本定义
2、具体使用
12、请详细说明一下 Babel 编译的原理是什么?(高薪常问)
1、解析:将代码转换成 AST
2、词法分析:将代码(字符串)分割为 token 流,即语法单元成的数组
3、语法分析:分析 token 流(上面生成的数组)并生成 AST,转换:访问 AST 的节点进行变换操作生产新的 AST,taro 就是利用 babel 完成的小程序语法转换,生成:以新的 AST 为基
13、在生产环境下如何提升 webpack 优化构建速度(高薪 常问)
14、什么是长缓存?在 webpack 中如何做到长缓存优化? (高薪常问)
1、什么是长缓存
2、具体实现
15、如何提高 webpack 的构建速度?(高薪常问)
16、怎么实现 webpack 的按需加载?什么是神奇注释?(高
薪常问)
1、按需加载
2、神奇注释
webpack
1、基本定义
wbpack 是一个打包模块化 javascript 的工具,在 webpack 里一切文件皆模块,通过 loader 转换文件,通过 plugin 注入钩子,最后输出由多个模块组合成的文件,webpack 专注构建模块化项目,webpack 可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript 模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript 等),并将其打包为合适的格式以供浏览器使用
1、专注于处理模块化的项目,能做到开箱即用,一步到位
2、通过 plugin 扩展,完整好用又不失灵活
3、使用场景不局限于 web 开发
4、社区庞大活跃,经常引入紧跟时代发展的新特性,能为大多数场景找到已有的开源扩展
5、提供了更好的开发体验
webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:
1、初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数
2、开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,执行对象的 run 方法开始执行编译
3、确定入口:根据配置中的 entry 找出所有的入口文件
4、编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理
5、完成模块编译:在经过第 4 步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系
6、输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk, 再把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会
7、输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统,在以上过程中,webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 webpack 提供的 API 改变 webpack的运行结果
三者都是前端构建工具,grunt 和 gulp 在早期比较流行,现在 webpack 相对来说比较主流,不过一些轻量化的任务还是会用 gulp 来处理,比如单独打包 CSS 文件等
1,1)grunt 和 gulp 是基于任务和流(Task、Stream)的。类似 jQuery,找到一个(或 一类)文件,对其做一系列链式操作,更新流上的数据, 整条链式操作构成了一个任务,多个任务就构成了整个 web 的构建流程。
1,2)webpack 是基于入口的。webpack 会自动地递归解析入口所需要加载的所有资 源文件,然后用不同的 Loader 来处理不同的文件,用 Plugin 来扩展 webpack 功能。
2,1)gulp 和 grunt 需要开发者将整个前端构建过程拆分成多个`Task`,并合理控制所 有`Task`的调用关系
2,2)webpack 需要开发者找到入口,并需要清楚对于不同的资源应该使用什么Loader 做何种解析和加工
3,1)gulp 更像后端开发者的思路,需要对于整个流程了如指掌
3,2)webpack 更倾向于前端开发者的思路
1、file-loader:把文件输出到一个文件夹中,在代码中通过相对 URL 去引用输出的文件
2、url-loader:和 file-loader 类似,但是能在文件很小的情况下以 base64 的方式把文件内容注入到代码中去
3、source-map-loader:加载额外的 Source Map 文件,以方便断点调试
4、image-loader:加载并且压缩图片文件
5、babel-loader:把 ES6 转换成 ES5
6、css-loader:加载 CSS,支持模块化、压缩、文件导入等特性
7、style-loader:把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSS