驗證器

一種外掛類型:分析資產並發出警告和錯誤

Validator 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>,
|}
參考
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>,
|}
參考
驗證器