验证器
一个插件类型:分析资源并发出警告和错误
验证器是一种用于验证资源的插件类型,它在每个资源上被调用,可以抛出错误或记录带有诊断信息的警告以验证输入。这些可以是代码风格问题、类型问题或类似的问题。
验证器在构建完全完成后运行,这是为了确保不影响性能并首先关注更重要的编译错误。
当 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: "意外的控制台语句",
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
Type
type ResolveConfigFn = (configNames: Array<FilePath>) => Promise<?FilePath>;
Referenced by:
MultiThreadValidatorResolveConfigWithPathFn parcel/packages/core/types/index.js:1008
Type
type ResolveConfigWithPathFn = (configNames: Array<FilePath>, assetFilePath: string) => Promise<?FilePath>;
Referenced by:
DedicatedThreadValidatorValidateResult parcel/packages/core/types/index.js:1017
type ValidateResult = {|
warnings: Array<Diagnostic>,
errors: Array<Diagnostic>,
|}
Referenced by:
DedicatedThreadValidator, MultiThreadValidatorDedicatedThreadValidator parcel/packages/core/types/index.js:1026
type DedicatedThreadValidator = {|
validateAll: ({|
assets: Asset[],
resolveConfigWithPath: ResolveConfigWithPathFn,
options: PluginOptions,
logger: PluginLogger,
|}) => Async<Array<?ValidateResult>>,
|}
Referenced by:
ValidatorMultiThreadValidator 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>,
|}
Referenced by:
ValidatorValidator parcel/packages/core/types/index.js:1057
Type
type Validator = DedicatedThreadValidator | MultiThreadValidator;