验证器

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

验证器 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: "Unexpected console statement",
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: "This console statement is not allowed",
},
],
},
hints: ["Remove the console.log(...)"],
},
});
},
});

有状态验证器插件

#

一些验证器(例如 @parcel/validator-typescript)可能希望为了效率而维护项目范围的状态/缓存。对于这些情况,使用不同的接口是合适的,在该接口中,Parcel 会同时将所有更改的文件传递给验证器。

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

这种类型的验证器通常比无状态验证器类型慢,因为它在单个线程上运行所有内容,而不是多个线程。只有在别无选择的情况下才使用它,就像通常需要访问整个项目的验证器(例如类型验证器)一样。

下面是一个此类验证器的示例。

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

// You keep the state in a top-level variable
let state = {};

export default new Validator({
async validateAll({ assets, logger }) {
// ...
for (let asset of assets) {
// ...validation logic

if (hasWarning) {
logger.warn({
message: "A validation warning",
filePath: asset.filePath,
language: asset.type,
});
}
}
},
});

相关 API

#

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

标记为实验性
类型
type ResolveConfigFn = (configNames: Array<FilePath>) => Promise<?FilePath>;
被引用
MultiThreadValidator

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

标记为实验性
类型
type ResolveConfigWithPathFn = (configNames: Array<FilePath>, assetFilePath: string) => Promise<?FilePath>;
被引用
DedicatedThreadValidator

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

标记为实验性
type ValidateResult = {|
  warnings: Array<Diagnostic>,
  errors: Array<Diagnostic>,
|}
被引用
DedicatedThreadValidator, MultiThreadValidator

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

标记为实验性
type DedicatedThreadValidator = {|
  validateAll: ({|
    assets: Asset[],
    resolveConfigWithPath: ResolveConfigWithPathFn,
    options: PluginOptions,
    logger: PluginLogger,
  |}) => Async<Array<?ValidateResult>>,
|}
被引用
验证器

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

标记为实验性
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>,
|}
被引用
验证器