返回介绍

Plugin API

发布于 2019-05-27 04:54:17 字数 7667 浏览 1084 评论 0 收藏 0

插件是 webpack 生态系统的重要组成部分,为社区用户提供了一种强大方式来直接触及 webpack 的编译过程(compilation process)。插件能够 钩入(hook) 到在每个编译(compilation)中触发的所有关键事件。在编译的每一步,插件都具备完全访问 compiler 对象的能力,如果情况合适,还可以访问当前 compilation 对象。

T> 对于编写插件的高度概括,请从编写一个插件开始。

我们首先回顾 /doc/webpack-api-tapable 工具,它提供了 webpack 插件接口的支柱。

Tapable

/doc/webpack-api-tapable 这个小型 library 是 webpack 的一个核心工具,但也可用于其他地方,以提供类似的插件接口。webpack 中许多对象扩展自 Tapable 类。这个类暴露 tap, tapAsynctapPromise 方法,可以使用这些方法,注入自定义的构建步骤,这些步骤将在整个编译过程中不同时机触发。

请查看 文档 了解更多信息。理解三种 tap 方法以及提供这些方法的钩子至关重要。要注意到,扩展自 Tapable 的对象(例如 compiler 对象)、它们提供的钩子和每个钩子的类型(例如 SyncHook)。

插件类型(plugin types)

根据所使用的 钩子(hook) 和 tap 方法,插件可以以多种不同的方式运行。这个工作方式与 Tapable 提供的 hooks 密切相关。compiler hooks 分别记录了 Tapable 内在的钩子,指出哪些 tap 方法可用。

因此,根据你触发到 tap 事件,插件可能会以不同的方式运行。例如,当钩入 compile 阶段时,只能使用同步的 tap 方法:

compiler.hooks.compile.tap('MyPlugin', params => {
  console.log('以同步方式触及 compile 钩子。')
})

然而,对于能够使用了 AsyncHook(异步钩子)run,我们可以使用 tapAsynctapPromise(以及 tap):

compiler.hooks.run.tapAsync('MyPlugin', (compiler, callback) => {
  console.log('以异步方式触及 run 钩子。')
  callback()
})

compiler.hooks.run.tapPromise('MyPlugin', compiler => {
  return new Promise(resolve => setTimeout(resolve, 1000)).then(() => {
    console.log('以具有延迟的异步方式触及 run 钩子')
  })
})

这些需求(story)的含义在于,可以有多种方式将 hook 钩入到 compiler 中,可以让各种插件都以合适的方式去运行。

自定义的钩子函数(custom hooks)

为了给其他插件的编译添加一个新的钩子,来 tap(触及) 到这些插件的内部,直接从 /doc/webpack-api-tapablerequire 所需的钩子类(hook class),然后创建:

const SyncHook = require('/doc/webpack-api-tapable').SyncHook;

// 具有 `apply` 方法……
if (compiler.hooks.myCustomHook) throw new Error('Already in use');
compiler.hooks.myCustomHook = new SyncHook(['a', 'b', 'c'])

// 在你想要触发钩子的位置/时机下调用……
compiler.hooks.myCustomHook.call(a, b, c);

再次声明,查看 /doc/webpack-api-tapable 文档 来,了解更多不同的钩子类(hook class),以及它们是如何工作的。

下一步

查看 compiler hooks 部分,了解所有可用的 compiler 钩子和其所需的参数的详细列表。

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文