驗證器
一種外掛類型:分析資產並發出警告和錯誤
驗證器是一種用於驗證資產的外掛類型,它會在每個資產上呼叫,並可以拋出錯誤或記錄具有診斷的警告來驗證輸入。這些可能是程式碼檢查問題、輸入問題或類似問題。
驗證器會在建置完全完成後執行,這是為了確保我們不會影響效能,並優先處理更重要的編譯錯誤。
當 Parcel 在監控模式下執行(parcel watch
或 parcel 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>;
參考
MultiThreadValidatorResolveConfigWithPathFn parcel/packages/core/types/index.js:1008
類型
type ResolveConfigWithPathFn = (configNames: Array<FilePath>, assetFilePath: string) => Promise<?FilePath>;
參考
DedicatedThreadValidatorValidateResult parcel/packages/core/types/index.js:1017
type ValidateResult = {|
warnings: Array<Diagnostic>,
errors: Array<Diagnostic>,
|}
參考
DedicatedThreadValidator、MultiThreadValidatorDedicatedThreadValidator 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>,
|}
參考
驗證器Validator parcel/packages/core/types/index.js:1057
類型
type Validator = DedicatedThreadValidator | MultiThreadValidator;