从本质上讲,webpack 只是一个文件捆绑器。考虑到一个非常简单的场景(没有代码拆分),这可能只意味着以下操作(在高层次上):
- 找到入口文件并将其内容加载到内存中
- 匹配内容中的某些文本并评估这些文本(例如@import)
- 根据之前的评估找到依赖关系并对它们做同样的事情
- 在内存中将它们全部拼接成一个包
- 将结果写入文件系统
当您仔细检查上述步骤时,这与 Java 编译器(或任何编译器)的工作产生了共鸣。当然存在差异,但这些对于理解加载器和插件并不重要。
装载机:
出现在这里是因为 webpack 承诺将任何文件类型捆绑在一起。
由于 webpack 的核心仅能够打包 js 文件,因此这一承诺意味着 webpack 核心团队必须合并构建流程,允许外部代码以 webpack 可以使用的方式转换特定文件类型。
这些外部代码称为加载程序,它们通常在上述第 1 步和第 3 步期间运行。因此,由于这些加载器需要运行的阶段是显而易见的,它们不需要钩子,也不会影响构建过程(因为构建或捆绑只发生在第 4 步)。
因此,加载器为编译做好了准备,它们在某种程度上扩展了 webpack 编译器的灵活性。
插件:
出现在这里是因为即使 webpack 不直接承诺变量输出,世界都需要它并且 webpack 确实允许它。
由于 webpack 的核心只是一个打包器,但在此过程中需要经过几个步骤和子步骤,因此可以利用这些步骤来构建额外的功能。
生产构建过程(压缩并写入文件系统),这是 webpack 编译器的原生能力,例如,可以被视为其核心能力的扩展(只是捆绑),可以被视为本机插件。如果他们不提供,其他人就会这样做。
看上面的原生插件,看起来好像webpack打包或编译可以分解成核心打包过程,加上很多我们可以关闭或自定义或扩展的原生插件过程。这意味着允许外部代码在可以选择的特定点(称为钩子)加入捆绑过程。
因此,插件会影响 webpack 编译器的输出和扩展能力。