报告器

报告器插件在整个构建过程中从 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`);
}
}
});

注意:不要在报告器插件中使用 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;
}
}
}
});

注意:不要在报告器插件中使用 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,
|}
被引用
LogEvent

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

包含丰富诊断信息的日志事件

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

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

type TextLogEvent = {|
  +type: 'log',
  +level: 'success',
  +message: string,
|}
被引用
LogEvent

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

构建刚刚开始。

type BuildStartEvent = {|
  +type: 'buildStart',
|}
被引用
ReporterEvent

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

构建刚刚在监视模式下开始。

type WatchStartEvent = {|
  +type: 'watchStart',
|}
被引用
ReporterEvent

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

构建刚刚在监视模式下结束。

type WatchEndEvent = {|
  +type: 'watchEnd',
|}
被引用
ReporterEvent

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

正在解析新的 依赖项

type ResolvingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'resolving',
  +dependency: Dependency,
|}
被引用
BuildProgressEvent

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

正在转换新的 资产

type TransformingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'transforming',
  +filePath: FilePath,
|}
被引用
BuildProgressEvent

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

生成 BundleGraph

type BundlingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'bundling',
|}
被引用
BuildProgressEvent

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

正在打包新的

type PackagingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'packaging',
  +bundle: NamedBundle,
|}
被引用
BuildProgressEvent

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

正在优化新的

type OptimizingProgressEvent = {|
  +type: 'buildProgress',
  +phase: 'optimizing',
  +bundle: NamedBundle,
|}
被引用
BuildProgressEvent

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

构建成功。

type BuildSuccessEvent = {|
  +type: 'buildSuccess',
  +bundleGraph: BundleGraph<PackagedBundle>,
  +buildTime: number,
  +changedAssets: Map<string, Asset>,
  +requestBundle: (bundle: NamedBundle) => Promise<BuildSuccessEvent>,
|}
被引用
BuildEventReporterEvent

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

构建失败。

type BuildFailureEvent = {|
  +type: 'buildFailure',
  +diagnostics: Array<Diagnostic>,
|}
被引用
BuildEventReporterEvent

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

正在验证新文件。

type ValidationEvent = {|
  +type: 'validation',
  +filePath: FilePath,
|}
被引用
ReporterEvent

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

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