Webpack 定义解析| 青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

1.概念

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

2.作用

webpack 通过 loader 可以支持各种语言和预处理器编写模块(通过loader处理非JavaScript模块,并在bundle中引入依赖),模块可以通过以下方式来表达它们的依赖关系:

  1. ES2015 import 语句
  2. CommonJS require() 语句
  3. AMD define 和 require 语句
  4. css/sass/less 文件中的@import语句
  5. 样式(url(...))和HTML文件中的图片链接

3.本质

webpack可以理解为一种基于事件流的编程范例,一系列的插件运行,而实现这个插件机制的是Tapable。
  1. Tapable是什么?

Tapable公开了许多Hook类,可用于为插件创建钩子。 Tapable是一个类似于Node.js的EventEmitter的库,主要是控制钩子函数的发布与订阅,控制着Webpack的插件系统。

npm install --save tapable

谈谈webpack 的优势

其优势主要可以归类为如下几个:

  1. webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。

  2. 能被模块化的不仅仅是 JS 了。

  3. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。

  4. 扩展性强,插件机制完善,特别是支持 React 热插拔的功能让人眼前一亮。

webpack 劣势

  • 配置复杂
  • 不分包bundele.js体积庞大
  • 只能用于采用模块化开发的项目
  • 打包慢
  • ES模块除Module外全用babel转换,但是一部分ES2015 语法的 firefox 与 chrome 浏览器中能直接跑的代码,无法用 webpack 编译