验证器

一个插件类型:分析资源并发出警告和错误

验证器 API 是实验性的,因此可能会发生变化,即使在次要更新之间。

验证器是一种用于验证资源的插件类型,它在每个资源上被调用,可以抛出错误或记录带有诊断信息的警告以验证输入。这些可以是代码风格问题、类型问题或类似的问题。

验证器在构建完全完成后运行,这是为了确保不影响性能并首先关注更重要的编译错误。

当 Parcel 在监视模式下运行(parcel watchparcel serve)时,即使验证器抛出错误,我们仍然会提供/保存更新的捆绑包(在这种情况下,错误仅被记录)。

但是在运行 parcel build 时,Parcel 将以失败的状态码退出,以确保您不会部署不符合验证器设置的标准的代码。这确保开发者可以保持高效,并且在解决问题时不必担心每个小的类型或代码风格问题。

无状态验证器插件

#

如果验证器不存储关于应用程序的任何状态,可以使用标准的验证器插件接口,这一次给出一个资源,允许 Parcel 跨线程分散工作,提高性能。

这些验证器接收一个资源,如果资源以某种方式无效(例如类型错误或代码风格错误),则可以抛出错误或记录警告。

我们建议使用诊断来发出错误或警告。

下面是发出错误的简单示例:

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

export default new Validator({
async validate({ asset }) {
// ...
throw new ThrowableDiagnostic({
diagnostic: {
message: "意外的控制台语句",
filePath: asset.filePath,
language: asset.type,
stack: err.stack,
name: err.name,
codeFrame: {
code: await asset.getCode(),
codeHighlights: [
{
start: {
line: 1,
column: 5,
},
end: {
line: 2,
column: 3,
},
message: "不允许使用此控制台语句",
},
],
},
hints: ["删除 console.log(...)"],
},
});
},
});

有状态验证器插件

#

某些验证器(如 @parcel/validator-typescript)可能希望为提高效率而维护项目范围的状态/缓存。对于这些情况,适当的做法是使用不同的接口,Parcel 一次性将所有已更改的文件传递给验证器。

对于这种类型的验证器,Parcel 还确保始终在同一线程上调用此验证器(以便可以访问缓存状态)。这意味着您可以定义一个顶级变量,它将始终可用(并且在多次调用 validateAll 之间保留其值)。

这种类型的验证器通常比无状态验证器类型慢,因为它在单个线程上运行所有内容,而不是多个线程。只有在没有其他选择的情况下才使用它,通常对于需要访问整个项目的验证器(如类型验证器)来说是如此。

下面是这种验证器的示例。

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

// 您在顶级变量中保留状态
let state = {};

export default new Validator({
async validateAll({ assets, logger }) {
// ...
for (let asset of assets) {
// ...验证逻辑

if (hasWarning) {
logger.warn({
message: "验证警告",
filePath: asset.filePath,
language: asset.type,
});
}
}
},
});

相关 API

#

ResolveConfigFn parcel/packages/core/types/index.js:1002

Marked as experimental
Type
type ResolveConfigFn = (configNames: Array<FilePath>) => Promise<?FilePath>;
Referenced by:
MultiThreadValidator

ResolveConfigWithPathFn parcel/packages/core/types/index.js:1008

Marked as experimental
Type
type ResolveConfigWithPathFn = (configNames: Array<FilePath>, assetFilePath: string) => Promise<?FilePath>;
Referenced by:
DedicatedThreadValidator

ValidateResult parcel/packages/core/types/index.js:1017

Marked as experimental
type ValidateResult = {|
  warnings: Array<Diagnostic>,
  errors: Array<Diagnostic>,
|}
Referenced by:
DedicatedThreadValidator, MultiThreadValidator

DedicatedThreadValidator parcel/packages/core/types/index.js:1026

Marked as experimental
type DedicatedThreadValidator = {|
  validateAll: ({|
    assets: Asset[],
    resolveConfigWithPath: ResolveConfigWithPathFn,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<Array<?ValidateResult>>,
|}
Referenced by:
Validator

MultiThreadValidator parcel/packages/core/types/index.js:1039

Marked as experimental
type MultiThreadValidator = {|
  validate: ({|
    asset: Asset,
    config: ConfigResult | void,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<ValidateResult | void>,
  getConfig?: ({|
    asset: Asset,
    resolveConfig: ResolveConfigFn,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<ConfigResult | void>,
|}
Referenced by:
Validator