它通过
webpack
API 下
webpack.Compiler
的导出。
webpack 使用它来实例化 compiler,然后调用
run
方法。下面是一个可以使用
Compiler
简单示例。事实上,这与 webpack 自身是如何调用它非常接近。
compiler-example
import {Compiler} from 'webpack';
const compiler = new Compiler();
compiler.options = {...};
class LogPlugin {
apply (compiler) {
compiler.plugin('should-emit', compilation => {
console.log('should I emit?');
return true;
new LogPlugin().apply(compiler);
const callback = (err, stats) => {
console.log('Compiler 已经完成执行。');
compiler.run(callback);
Compiler 也是我们所说的 Tapable 实例。通过这种实现机制,我们可以理解为,它混合(mix)了 Tapable 类,来使实例也具备注册和调用插件功能。大多数面向用户的插件,要首先在 Compiler 上注册。Compiler 运行机制可以被提取为以下要点
通常有一个 Compiler 的主实例。可以创建子 compilers 来委托特定任务。
创建 compiler 的多数复杂度,在于为它填充所有相关的 options 选项。
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 暴露的所有事件钩子。
下面是一个异步的 emit 事件处理函数的示例:
compiler.plugin("emit", function(compilation, callback) {
setTimeout(function() {
console.log("异步运行完成……");
callback();
}, 1000);
});
原文:https://webpack.js.org/api/compiler/