webpack工做原理及loader和plugin的区别

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战webpack


目录

webpack 原理

webpack 配置

webpack核心概念

entry

Output

Module

Chunk

loader

plugin

loader和plugin的区别

webpack 构建流程


webpack 原理

image.png

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle。经过代码分割成单元片断并按需加载。web

webpack 不只可让咱们编写模块,并且还支持任何模块格式(至少在咱们到达 ESM 以前),而且能够同时处理资源和资产,这也是 webpack 存在的缘由。markdown

webpack 配置

如下是webpack.config.js的基本配置,更多配置请移步webpack配置oop

const path = require('path');

module.exports = {
  mode: 'development',
  entry: './foo.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'foo.bundle.js',
  },
};
复制代码

webpack核心概念

entry

入口起点(entry point)指示 webpack 应该使用哪一个模块,来做为构建其内部依赖图的开始。post

进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。优化

每一个依赖项随即被处理,最后输出到称之为 bundles 的文件中。ui

Output

output 属性告诉 webpack 在哪里输出它所建立的 bundles,以及如何命名这些文件,默认值为 ./dist。url

基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。spa

Module

模块,在 Webpack 里一切皆模块,一个模块对应着一个文件。Webpack 会从配置的 Entry 开始递归找出全部依赖的模块。插件

Chunk

代码块,一个 Chunk 由多个模块组合而成,用于代码合并与分割。

loader

loader是文件转换器,能够将全部类型的文件转换为 webpack 可以处理的有效模块。

本质上,webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 可以去处理其余类型的文件,并将它们转换为应用程序的依赖图(和最终的 bundle)能够直接引用的模块。

webpack 就像一条生产线,要通过一系列处理流程后才能将源文件转换成输出结果。 这条生产线上的每一个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成当前处理后才能交给下一个流程去处理。 插件就像是一个插入到生产线中的一个功能,在特定的时机对生产线上的资源作处理。

  1. 处理一个文件能够使用多个loader,loader的执行顺序和配置中的顺序是相反的,即最后一个loader最早执行,第一个loader最后执行

  2. 第一个执行的loader接收源文件内容做为参数,其它loader接收前一个执行的loader的返回值做为参数,最后执行的loader会返回此模块的JavaScript源码

plugin

loader 用于转换某些类型的模块,而插件则能够用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。

在webpack运行的生命周期中会广播出许多事件,plugin能够监听这些事件,在合适的时机经过webpack提供的API改变输出结果。

webpack 经过 Tapable 来组织这条复杂的生产线。 webpack 在运行过程当中会广播事件,插件只须要监听它所关心的事件,就能加入到这条生产线中,去改变生产线的运做。 webpack 的事件流机制保证了插件的有序性,使得整个系统扩展性很好。

loader和plugin的区别

对于loader,它是一个转换器,单纯的文件转换过程

plugin是一个扩展器,它丰富了webpack自己,针对是loader结束后,webpack打包的整个过程,它并不直接操做文件,而是基于事件机制工做,会监听webpack打包过程当中的某些节点,执行普遍的任务

webpack 构建流程

Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行如下流程 :

  • 初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数。
  • 开始编译:用上一步获得的参数初始化 Compiler 对象,加载全部配置的插件,执行对象的 run 方法开始执行编译。
  • 肯定入口:根据配置中的 entry 找出全部的入口文件。
  • 编译模块:从入口文件出发,调用全部配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到全部入口依赖的文件都通过了本步骤的处理。
  • 完成模块编译:在通过第 4 步使用 Loader 翻译完全部模块后,获得了每一个模块被翻译后的最终内容以及它们之间的依赖关系。
  • 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再把每一个 Chunk 转换成一个单独的文件加入到输出列表,这步是能够修改输出内容的最后机会。
  • 输出完成:在肯定好输出内容后,根据配置肯定输出的路径和文件名,把文件内容写入到文件系统。

在以上过程当中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,而且插件能够调用 Webpack 提供的 API 改变 Webpack 的运行结果。


若是这篇文章帮到了你,记得点赞👍收藏加关注哦😊,但愿点赞多多多多...

文中若有错误,欢迎在评论区指正

相关文章
相关标签/搜索