这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
1.概念
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
2.作用
webpack 通过 loader 可以支持各种语言和预处理器编写模块(通过loader处理非JavaScript模块,并在bundle中引入依赖),模块可以通过以下方式来表达它们的依赖关系:
- ES2015 import 语句
- CommonJS require() 语句
- AMD define 和 require 语句
- css/sass/less 文件中的@import语句
- 样式(url(...))和HTML文件中的图片链接
3.本质
webpack可以理解为一种基于事件流的编程范例,一系列的插件运行,而实现这个插件机制的是Tapable。
- Tapable是什么?
Tapable公开了许多Hook类,可用于为插件创建钩子。 Tapable是一个类似于Node.js的EventEmitter的库,主要是控制钩子函数的发布与订阅,控制着Webpack的插件系统。
npm install --save tapable
谈谈webpack 的优势
其优势主要可以归类为如下几个:
-
webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。
-
能被模块化的不仅仅是 JS 了。
-
开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。
-
扩展性强,插件机制完善,特别是支持 React 热插拔的功能让人眼前一亮。
webpack 劣势
- 配置复杂
- 不分包bundele.js体积庞大
- 只能用于采用模块化开发的项目
- 打包慢
- ES模块除Module外全用babel转换,但是一部分ES2015 语法的 firefox 与 chrome 浏览器中能直接跑的代码,无法用 webpack 编译