バリデーター

プラグインの種類:アセットを分析し、警告とエラーを出力します。

バリデーターAPIは実験的なものであり、マイナーアップデート間でも変更される可能性があります。

バリデーターはアセットを検証するために使用されるプラグインの種類であり、各アセットに対して呼び出され、エラーをスローしたり、診断を使用して警告をログに記録したりして、入力を検証できます。これらは、リンティングの問題、型の問題、または同様の問題である可能性があります。

バリデーターはビルドが完全に完了した後に実行されます。これは、パフォーマンスに影響を与えず、より重要なコンパイルエラーを優先するためです。

Parcelがウォッチモード(`parcel watch`または`parcel serve`)で実行されている場合でも、バリデーターがエラーをスローした場合でも(この場合、エラーは単にログに記録されます)、更新されたバンドルは引き続き提供/保存されます。

`parcel build`を実行する場合、Parcelは失敗ステータスコードで終了し、バリデーターによって設定された基準を満たしていないコードをデプロイしないようにします。これにより、開発者は生産性を維持し、問題の解決中に小さな型の問題やリンティングの問題を心配する必要がなくなります。

ステートレスバリデータープラグイン

#

バリデーターがアプリケーションに関する状態を保存しない場合、標準のバリデータープラグインインターフェースを使用できます。これにより、一度に1つのアセットが提供され、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>,
|}
参照元
DedicatedThreadValidatorMultiThreadValidator

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>,
|}
参照元
バリデーター