编译诊断规则

构建诊断规则是类似于 ESLint 的 lint 工具,但是与其不同之处在于,ESLint 是在静态情况下进行代码扫描和构建流程无关。而这里的代码诊断是和 Rspack 或 Webpack 的构建流程紧密相关的,其中会加入许许多多构建中产生的内部参数用于辅助判断,比如 ModuleGraph,比如 Webpack 对每个模块的内部标记,比如代码经过转换之后加入的 runtime 等等……

在构建过程中发现了问题,会在 CLI 和最后弹出的诊断汇总网页中看到,如下图:

如何使用

诊断规则的使用很简单,它配置在整个插件的linter选项下,如下用例:

import { RsdoctorWebpackPlugin } from '@rsdoctor/webpack-plugin';

export default {
  plugin: [
    new RsdoctorWebpackPlugin({
      linter: {
        level: 'Error',
        extends: [],
        rules: {
          'default-import-check': 'off',
          'duplicate-package': [
            'Error',
            {
              checkVersion: 'minor',
              ignore: ['chalk', '@babel/runtime'],
            },
          ],
        },
      },
    }),
  ],
};

linter字段的类型为:

/** 校验器选项 */
interface Options {
  rules?: RulesMap;
  level?: SeverityString;
  extends?: ExtendRuleData[];
}

/**
 * 校验等级
 *   - `'Warn'`时只运行类别为`'Warn'`的规则
 *   - `'Error'`时运行全部规则
 */
type SeverityString = 'Warn' | 'Error';

/** 规则等级 */
type SeverityInput = SeverityString | 'off' | 'on';

/** 规则配置 */
type RulesMap = Record<string, RuleConfigItem>;

/** 单规则配置 */
type RuleConfigItem =
  // 仅有报错等级,此等级优先级高于规则自身配置
  | SeverityInput
  // 数组情况下,第一项为报错等级,后一项是规则配置
  | [SeverityInput, unknown];

内部已有规则

在现有的诊断器中已经包含了三个规则,它们分别是:

  1. [E1001] Duplicate Packages
  2. [E1002] Default Import Check
  3. [E1003] Loader Performance Optimization
  4. [E1004] ECMA Version Check