@@ -29,6 +29,26 @@ interface BuildScriptSettings {
29
29
readonly finalize: (babelConfig : TransformOptions , env : BuildEntry ) => TransformOptions ;
30
30
}
31
31
32
+ type Severity = ' off' | ' print' | ' warn' | ' error' ;
33
+
34
+ // 产物检查的规则配置,为数组的时候,第2个元素是具体的配置
35
+ type RuleConfig <T > = ' off' | ' print' | [Severity , T ];
36
+
37
+ interface BuildInspectInitialResource {
38
+ // 初始加载资源数量,配置值为最大允许数量
39
+ readonly count: RuleConfig <number >;
40
+ // 初始加载的资源总大小,配置值为最大允许的体积,以字节为单位
41
+ readonly totalSize: RuleConfig <number >;
42
+ // 初始加载的各资源之间的体积差异,配置值为体积的标准差,超过该值即报告
43
+ readonly sizeDeviation: RuleConfig <number >;
44
+ // 禁止在初始加载资源中包含某些第三方依赖,配置值为依赖名称的数组
45
+ readonly disallowImports: RuleConfig <string []>;
46
+ }
47
+
48
+ interface BuildInspectSettings {
49
+ initialResources: BuildInspectInitialResource ;
50
+ }
51
+
32
52
interface BuildSettings {
33
53
// 产出的资源路径前缀
34
54
readonly publicPath? : string ;
@@ -50,6 +70,8 @@ interface BuildSettings {
50
70
readonly script: BuildScriptSettings ;
51
71
// 最终手动处理webpack配置
52
72
readonly finalize: (webpackConfig : WebpackConfiguration , env : BuildEntry ) => WebpackConfiguration ;
73
+ // 配置对最终产出的检查规则
74
+ readonly inspect: BuildInspectSettings ;
53
75
}
54
76
```
55
77
@@ -368,3 +390,46 @@ exports.build = {
368
390
},
369
391
};
370
392
```
393
+
394
+ ## 检查最终构建产物
395
+
396
+ 在要求比较严格的项目中,有需要对最终产物的组成进行检查,并应用一些自动化的规则,确保如资源数量、大小等符合预期。
397
+
398
+ 你可以使用` reskript.config.js ` 中的` exports.build.inspect ` 来配置构建产物的检查规则,具体的配置结构参考上文。
399
+
400
+ ### 规则配置
401
+
402
+ 在产物检查的配置中,大部分检查项都可以配置为以下形式:
403
+
404
+ - ` "off" ` :指关闭该项的检查。
405
+ - ` "print" ` :指仅打印该检查项的结果,但不做任何的阈值判断和拦截。
406
+ - ` [severity, config] ` :配置该项的报告类型,以及指定规则检查的阈值。
407
+
408
+ 不同规则的` config ` 阈值不同,比如` initialResources.count ` 用来检查初始加载的资源数量,那么它的阈值就是个数字,资源数量超过该值时报警。
409
+
410
+ 当` severity ` 设为` "warn" ` 时,会在构建日志中报告,但构建仍然成功。如果值为` "error" ` 时,则除了日志报告外,还会使构建进程异常退出。
411
+
412
+ ### 示例
413
+
414
+ #### 初始资源检查
415
+
416
+ 假设你的产品并没有使用HTTP/2,考虑到浏览器的单域名并发能力和用户的普遍网速,你的要求如下:
417
+
418
+ > 产品打开时,初始加载的资源不能超过6个,总大小不能超过2MB,各资源的体积尽量平均以最大限度利用并发能力。同时产品初始资源不包含任何和图表(` echarts ` )有关的模块,不包含和编辑器(` monaco-editor ` 和` codemirror ` )有关的模块。
419
+
420
+ 为了严格控制产品性能,你要求一但违反上面的规则,构建应当失败,开发者需要修复相关问题。则配置如下所示:
421
+
422
+ ``` js
423
+ exports .build = {
424
+ inspect: {
425
+ initialResources: {
426
+ count: [' error' , 6 ],
427
+ totalSize: [' error' , 2 * 1024 * 1024 ],
428
+ sizeDeviation: [' error' , 0.2 ],
429
+ disallowImports: [' error' , [' echarts' , ' monaco-editor' , ' codemirror' ]],
430
+ },
431
+ },
432
+ };
433
+ ```
434
+
435
+ ** 注意:当前还不支持` sizeDeviation ` 的检查,同时并不支持` count ` 和` totalSize ` 的阈值检查。**
0 commit comments