报告器

报告器插件在构建过程中接收 Parcel 的事件。例如,报告器可以将状态信息写入标准输出、运行开发服务器,或在构建结束时生成打包分析报告。

示例

#

此示例在构建成功时将打包数量和构建时间写入标准输出。

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "buildSuccess") {
let bundles = event.bundleGraph.getBundles();
process.stdout.write(
`✨ Built ${bundles.length} bundles in ${event.buildTime}ms!\n`
);
}
},
});

note:不要在报告器插件中使用 console.log。Parcel 重写了 console 方法并将消息路由到报告器插件。这可能在您的报告器中创建无限循环。如果您打算写入标准输出/标准错误,请改用 process.stdout/process.stderr。如果另一个报告器将处理日志事件,请使用提供的 logger。有关更多详细信息,请参见日志记录

构建开始

#

当构建开始时,会发出 buildStart 事件。在监视模式下,每次重新构建时都会发出此事件。

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "buildStart") {
process.stdout.write("Started build!\n");
}
},
});

构建进度

#

buildProgress 事件在整个构建过程中发出。它包括一个 phase 属性,指示正在发生的构建阶段,事件包括特定于该阶段的其他信息。例如,transforming 阶段的事件包括正在转换的资源的 filePath 属性。请参见 BuildProgressEvent

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "buildProgress") {
switch (event.phase) {
case "transforming":
process.stdout.write(`Transforming ${event.filePath}...\n`);
break;
case "resolving":
process.stdout.write(`Resolving ${event.dependency.specifier}...\n`);
break;
case "bundling":
process.stdout.write("Bundling...\n");
break;
case "packaging":
process.stdout.write(`Packaging ${event.bundle.displayName}...\n`);
break;
case "optimizing":
process.stdout.write(`Optimizing ${event.bundle.displayName}...\n`);
break;
}
}
},
});

构建成功

#

当构建成功完成时,会发出 buildSuccess 事件。它包括已构建的完整 bundleGraphbuildTimechangedAssets 列表。

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "buildSuccess") {
process.stdout.write(
`✨ Rebuilt ${event.changedAssets.size} assets in ${event.buildTime}ms!\n`
);
}
},
});

构建失败

#

当构建以错误完成时,会发出 buildFailure 事件。它包括描述错误的 Diagnostic 对象列表。有关详细信息,请参见诊断

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "buildFailure") {
process.stdout.write(
`🚨 Build failed with ${event.diagnostics.length} errors.\n`
);
}
},
});

日志记录

#

Parcel 中的所有日志都通过报告器插件路由。level 属性指示每个 log 事件的类型。infowarnerrorverbose 日志级别包括一个 Diagnostic 对象,该对象提供日志上下文的详细信息。其他日志级别仅包括 message 属性。

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "log") {
switch (event.level) {
case "info":
case "verbose":
process.stdout.write(`ℹ️ ${event.diagnostic.message}\n`);
break;
case "warn":
process.stdout.write(`⚠️ ${event.diagnostic.message}\n`);
break;
case "error":
process.stdout.write(`🚨 ${event.diagnostic.message}\n`);
break;
}
}
},
});

note:不要在报告器插件中使用 console.log,尤其是在处理 log 事件时。Parcel 重写了 console 方法并将消息路由到报告器插件。这将在您的报告器中创建无限循环。请改用 process.stdout/process.stderr

监视器事件

#

当监视模式开始和结束时,会发出 watchStartwatchEnd 事件。与 buildStartbuildSuccess/buildFailure 不同,监视器事件只触发一次,而不是对每个构建都触发。

import { Reporter } from "@parcel/plugin";

export default new Reporter({
report({ event }) {
if (event.type === "watchStart") {
process.stdout.write(`Watching started\n`);
} else if (event.type === "watchEnd") {
process.stdout.write(`Watching ended\n`);
}
},
});

相关 API

#

ProgressLogEvent parcel/packages/core/types/index.js:1742

type ProgressLogEvent = {|
  +type: 'log',
  +level: 'progress',
  +phase?: string,
  +message: string,
|}
Referenced by:
LogEvent

DiagnosticLogEvent parcel/packages/core/types/index.js:1753

A log event with a rich diagnostic

type DiagnosticLogEvent = {|
  +type: 'log',
  +level: 'error' | 'warn' | 'info' | 'verbose',
  +diagnostics: Array<Diagnostic>,
|}
Referenced by:
LogEvent

TextLogEvent parcel/packages/core/types/index.js:1762

type TextLogEvent = {|
  +type: 'log',
  +level: 'success',
  +message: string,
|}
Referenced by:
LogEvent

BuildStartEvent parcel/packages/core/types/index.js:1777

The build just started.

type BuildStartEvent = {|
  +type: 'buildStart',
|}
Referenced by:
ReporterEvent

WatchStartEvent parcel/packages/core/types/index.js:1785

The build just started in watch mode.

type WatchStartEvent = {|
  +type: 'watchStart',
|}
Referenced by:
ReporterEvent

WatchEndEvent parcel/packages/core/types/index.js:1793

The build just ended in watch mode.

type WatchEndEvent = {|
  +type: 'watchEnd',
|}
Referenced by:
ReporterEvent

ResolvingProgressEvent parcel/packages/core/types/index.js:1801

A new Dependency is being resolved.

type ResolvingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'resolving',
  +dependency: Dependency,
|}
Referenced by:
BuildProgressEvent

TransformingProgressEvent parcel/packages/core/types/index.js:1811

A new Asset is being transformed.

type TransformingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'transforming',
  +filePath: FilePath,
|}
Referenced by:
BuildProgressEvent

BundlingProgressEvent parcel/packages/core/types/index.js:1821

The BundleGraph is generated.

type BundlingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'bundling',
|}
Referenced by:
BuildProgressEvent

PackagingProgressEvent parcel/packages/core/types/index.js:1837

A new Bundle is being packaged.

type PackagingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'packaging',
  +bundle: NamedBundle,
|}
Referenced by:
BuildProgressEvent

OptimizingProgressEvent parcel/packages/core/types/index.js:1847

A new Bundle is being optimized.

type OptimizingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'optimizing',
  +bundle: NamedBundle,
|}
Referenced by:
BuildProgressEvent

BuildSuccessEvent parcel/packages/core/types/index.js:1868

The build was successful.

type BuildSuccessEvent = {|
  +type: 'buildSuccess',
  +bundleGraph: BundleGraph<PackagedBundle>,
  +buildTime: number,
  +changedAssets: Map<string, Asset>,
  +requestBundle: (bundle: NamedBundle) => Promise<BuildSuccessEvent>,
|}
Referenced by:
BuildEvent, ReporterEvent

BuildFailureEvent parcel/packages/core/types/index.js:1880

The build failed.

type BuildFailureEvent = {|
  +type: 'buildFailure',
  +diagnostics: Array<Diagnostic>,
|}
Referenced by:
BuildEvent, ReporterEvent

ValidationEvent parcel/packages/core/types/index.js:1894

A new file is being validated.

type ValidationEvent = {|
  +type: 'validation',
  +filePath: FilePath,
|}
Referenced by:
ReporterEvent

Reporter parcel/packages/core/types/index.js:1915

type Reporter = {|
  report({|
    event: ReporterEvent,
    options: PluginOptions,
    logger: PluginLogger,
  |}): Async<void>,
|}