Webpack plugin 简单介绍和使用

发布于 2023-09-07 20:21:48 字数 1675 浏览 25 评论 0

Webpack 事件流

Webpack 就像一条生产线,要经过一系列处理流程后才能将源文件转换成输出结果,插件就像是一个插入到生产线中的一个功能,在特地的时机对生产线上的资源进行处理。Webpack 通过 Tapable 来组织这条生产线。Webpack 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到生产线中,去改变生产线的运作。Webpack 的核心功能,是抽离成很多个内部插件来实现的

插件

那么怎么样的一个东西可以称之为 webpack 插件呢?一个完整的 webpack 插件需要满足以下几点规则和特征:

  • 一个具名 JavaScript 函数。
  • 是一个独立的模块。
  • 模块对外暴露一个 js 函数。
  • 函数的原型 (prototype) 上定义了一个注入 compiler 对象的 apply 方法。
  • apply 函数中需要有通过 compiler 对象挂载的 webpack 事件钩子,钩子的回调中能拿到当前编译的 compilation 对象,如果是异步编译插件的话可以拿到回调 callback。
    完成自定义子编译流程并处理 complition 对象的内部数据。
    如果异步编译插件的话,数据处理完成后执行 callback 回调。

在开发 Plugin 时最常用的两个对象就是 Complier 和 Compilation,它们是 Plugin 和 Webpack 之间的桥梁

Compiler

Compiler 对象包含了 Webpack 环境所有的配置信息,包含 options,loaders,plugins 这些信息,这个对象在 Webpack 启动时候被实例化,它是全局唯一的,可以简单地把它理解为 Webpack 实例。

Compilation

Compilation 对象包含了当前的模块资源,编译生成资源,变化的文件等。当 Webpack 以开发模式运行时,每当检测到一个文件变化,一次新的 Compilation 将被创建。Compilation 也提供了很多事件回调供插件拓展,通过 Compilation 也能读取到 Compiler 对象。

  • modules 记录了所有解析后的模块
  • chunks 记录了所有 chunk
  • assets 记录了所有要生成的文件

Compiler 和 Compilation 的区别在于:Compiler 代表了整个 Webpack 从启动到关闭的生命周期,而 Compilation 只是代表了一次新的编译。

Tapable

Webpack 中最核心的负责编译的 Compiler 和负责创建 bundles 的 Compilation 都是 Tapable 的实例。 Tapable 包暴露出很多钩子函数。
核心代码

class SyncHook{
    constructor(){
       this.hooks = [];
     }
    tap(name,fn){
        this.hooks.push(fn);
    }
    call() {
        this.hooks.forEach(hook => hook(...arguments));
    }
}

在 Webpack hook 上的所有钩子都是 Tapable 的示例,所以我们可以通过 tap 方法监听事件,使用 call 方法广播事件。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

甜`诱少女

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文