webpack 的 Compiler
模块是主引擎,它通过 webpack CLI 或 webpack
API 或 webpack 配置文件传递的所有选项,创建出一个 compilation 实例。
它通过 webpack
API 下 webpack.Compiler
的导出。
webpack 使用它来实例化 compiler,然后调用 run
方法。下面是一个可以使用 Compiler
简单示例。事实上,这与 webpack 自身是如何调用它非常接近。
// 可以从 webpack package 中 import 导入
import {Compiler} from 'webpack';
// 创建一个新的 compiler 实例
const compiler = new Compiler();
// 填充所有必备的 options 选项
compiler.options = {...};
// 创建一个插件
class LogPlugin {
apply (compiler) {
compiler.plugin('should-emit', compilation => {
console.log('should I emit?');
return true;
})
}
}
// 将 compiler 应用到插件中
new LogPlugin().apply(compiler);
/* 添加其他支持插件 */
// 运行结束后执行回调
const callback = (err, stats) => {
console.log('Compiler 已经完成执行。');
// 显示 stats……
};
// compiler 的 run 调用,并传入 callback
compiler.run(callback);
Compiler
也是我们所说的 Tapable
实例。通过这种实现机制,我们可以理解为,它混合(mix)了 Tapable
类,来使实例也具备注册和调用插件功能。大多数面向用户的插件,要首先在 Compiler
上注册。Compiler 运行机制可以被提取为以下要点
webpack
通过 WebpackOptionsDefaulter
和 WebpackOptionsApply
,来专门为 Compiler
提供所需的所有初始数据。Compiler
是一个执行最简功能,来保证生命周期运行的函数。它把所有的加载(loading)/打包(bundling)/写入(writing)工作委托给各种插件。new LogPlugin(args).apply(compiler)
将插件注册到 Compiler
生命周期中的任何特定钩子事件。Compiler
暴露 run
方法,它启动了 webpack
所有编译工作。在执行完成后,会调用传递给它的 callback
函数。记录 stats 和 errors 的所有末端工作,都在此回调函数中完成。Compiler
支持“观察模式(watch mode)”,可以监控文件系统并在文件更改时重新编译。在观察模式下,compiler 将触发额外的 "watch-run", "watch-close" 和 "invalid" 事件。这通常用于开发环境中,并且一般在 webpack-dev-server
等工具的底层触发,以使开发人员无须每次手动重新编译。
关于观察模式的更多细节,请查看 Node.js API 文档 或 CLI 的 watch 选项。
MultiCompiler 模块允许 webpack 在单个 compiler 中运行多个配置。
如果 webpack 的 NodeJS API 中的 options
参数,是一个由 options 构成的数组,则 webpack 会对其应用单个 compiler,并在所有 compiler 执行结束时,调用 callback
方法。
var webpack = require('webpack');
var config1 = {
entry: './index1.js',
output: {filename: 'bundle1.js'}
}
var config2 = {
entry: './index2.js',
output: {filename:'bundle2.js'}
}
webpack([config1, config2], (err, stats) => {
process.stdout.write(stats.toString() + "\n");
})
一个参考指南,列出 Compiler
暴露的所有事件钩子。
entry-option
after-plugins
compiler
after-resolvers
compiler
environment
after-environment
before-run
compiler.run()
开始
compiler
run
compiler
watch-run
compiler
normal-module-factory
NormalModuleFactory
之后
normalModuleFactory
context-module-factory
ContextModuleFactory
之后
contextModuleFactory
before-compile
compilationParams
compile
compilationParams
this-compilation
compilation
事件之前
compilation
compilation
compilation
make
compilation
after-compile
compilation
should-emit
compilation
need-additional-pass
emit
compilation
after-emit
compilation
done
stats
failed
error
invalid
fileName
, changeTime
watch-close
下面是一个异步的 emit
事件处理函数的示例:
compiler.plugin("emit", function(compilation, callback) {
// 执行一些异步……
setTimeout(function() {
console.log("异步运行完成……");
callback();
}, 1000);
});