Compiler
模块是 webpack 的主要引擎,它通过 CLI 或者 Node API
传递的所有选项创建出一个 compilation 实例。
它扩展(extends)自 Tapable
类,用来注册和调用插件。
大多数面向用户的插件会首先在 Compiler
上注册。
在为 webpack 开发插件时,你可能需要知道每个钩子函数是在哪里调用的。想要了解这些内容,请在 webpack 源码中搜索 hooks.<hook name>.call
。
Compiler
支持可以监控文件系统的 监听(watching) 机制,并且在文件修改时重新编译。
当处于监听模式(watch mode)时,
compiler 会触发诸如 watchRun
, watchClose
和 invalid
等额外的事件。
通常在 开发环境 中使用,
也常常会在 webpack-dev-server
这些工具的底层调用,
由此开发人员无须每次都使用手动方式重新编译。
还可以通过 CLI 进入监听模式。
以下生命周期钩子函数,是由 compiler
暴露,
可以通过如下方式访问:
compiler.hooks.someHook.tap('MyPlugin', (params) => {
/* ... */
});
取决于不同的钩子类型,也可以在某些钩子上访问 tapAsync
和 tapPromise
。
关于钩子类型的描述,请查看 Tapable 文档.
SyncHook
在编译器准备环境时调用,时机就在配置文件中初始化插件之后。
SyncHook
当编译器环境设置完成后,在 environment
hook 后直接调用。
SyncBailHook
在 webpack 选项中的 entry
被处理过之后调用。
compiler.hooks.entryOption.tap('MyPlugin', (context, entry) => {
/* ... */
});
SyncHook
在初始化内部插件集合完成设置之后调用。
compiler
SyncHook
resolver 设置完成之后触发。
compiler
SyncHook
当编译器对象被初始化时调用。
AsyncSeriesHook
在开始执行一次构建之前调用,compiler.run 方法开始执行后立刻进行调用。
compiler
AsyncSeriesHook
在开始读取 records
之前调用。
compiler
AsyncSeriesHook
在监听模式下,一个新的 compilation 触发之后,但在 compilation 实际开始之前执行。
compiler
SyncHook
NormalModuleFactory 创建之后调用。
normalModuleFactory
SyncHook
ContextModuleFactory 创建之后调用。
contextModuleFactory
AsyncSeriesHook
在创建 compilation parameter 之后执行。
compilationParams
初始化 compilationParams
变量的示例如下:
compilationParams = {
normalModuleFactory,
contextModuleFactory,
};
此钩子可用于添加/修改 compilation parameter:
compiler.hooks.beforeCompile.tapAsync('MyPlugin', (params, callback) => {
params['MyPlugin - data'] = 'important stuff my plugin will use later';
callback();
});
SyncHook
beforeCompile
之后立即调用,但在一个新的 compilation 创建之前。这个钩子 不会 被复制到子编译器。
compilationParams
SyncHook
初始化 compilation 时调用,在触发 compilation
事件之前调用。这个钩子 不会 被复制到子编译器。
compilation
, compilationParams
SyncHook
compilation 创建之后执行。
compilation
, compilationParams
AsyncParallelHook
compilation 结束之前执行。这个钩子 不会 被复制到子编译器。
compilation
AsyncSeriesHook
compilation 结束和封印之后执行。
compilation
SyncBailHook
在输出 asset 之前调用。返回一个布尔值,告知是否输出。
compilation
compiler.hooks.shouldEmit.tap('MyPlugin', (compilation) => {
// 返回 true 以输出 output 结果,否则返回 false
return true;
});
AsyncSeriesHook
输出 asset 到 output 目录之前执行。这个钩子 不会 被复制到子编译器。
compilation
AsyncSeriesHook
输出 asset 到 output 目录之后执行。这个钩子 不会 被复制到子编译器。
compilation
AsyncSeriesHook
在 asset 被输出时执行。此钩子可以访问被输出的 asset 的相关信息,例如它的输出路径和字节内容。
file
, info
例如,可以通过 info.content
访问 asset 的内容 buffer:
compiler.hooks.assetEmitted.tap(
'MyPlugin',
(file, { content, source, outputPath, compilation, targetPath }) => {
console.log(content); // <Buffer 66 6f 6f 62 61 72>
}
);
AsyncSeriesHook
在 compilation 完成时执行。这个钩子 不会 被复制到子编译器。
stats
AsyncSeriesHook
This hook allows you to do a one more additional pass of the build.
SyncHook
在 compilation 失败时调用。
error
SyncHook
在一个观察中的 compilation 无效时执行。这个钩子 不会 被复制到子编译器。
fileName
, changeTime
SyncHook
在一个观察中的 compilation 停止时执行。
AsyncSeriesHook
当编译器关闭时调用。
SyncBailHook
在配置中启用 infrastructureLogging
选项 后,允许使用 infrastructure log(基础日志)。
name
, type
, args
SyncBailHook
启用后允许记录到 stats 对象,请参阅 stats.logging
, stats.loggingDebug
和 stats.loggingTrace
选项。
origin
, logEntry
Webpack 5 现已正式发布。请阅读我们的 发布公告。如还未准备升级,请阅读 webpack 4 文档。