当前位置: 首页 > news >正文

ESLint 自定义规则开发

ESLint 自定义规则开发

规则结构(Rule Structure)

每个自定义规则都是一个 JavaScript 模块,需导出一个包含以下必要属性的对象:

meta 元数据

  • type:规则类型
    • "problem":代码中存在可能导致错误的高优先级问题
    • "suggestion":代码风格优化建议,不影响功能
    • "layout":与格式相关的空格、换行等问题
  • docs:文档信息
    • description:规则用途说明
    • url(可选):详细说明链接
  • fixable(可选):是否支持自动修复
    • "code":代码级修复
    • "whitespace":空白字符修复
  • schema:规则配置项的验证方案(基于 JSON Schema)

create(context) 核心方法
返回包含访问者方法的对象,用于遍历 AST 节点:

module.exports = {meta: { ... },create(context) {return {Identifier(node) { ... },"FunctionDeclaration:exit"(node) { ... }};}
};

Context 对象

create 方法接收的 context 参数提供以下关键功能:

属性

属性/方法说明
context.id规则名称
context.filename当前文件路径
context.cwd工作目录
context.options用户配置参数
context.sourceCode源代码操作对象
context.settings共享配置
context.languageOptions语言解析选项

方法

  • context.report(descriptor):核心问题报告方法
  • context.getSourceCode()(已废弃,推荐使用 context.sourceCode

报告问题(Reporting Problems)

使用 context.report() 报告问题时,可配置以下参数:

  • node/loc:问题位置
  • message/messageId:错误信息
    • 推荐使用 messageId 配合 meta.messages 管理多语言消息
  • data:消息模板的填充数据
  • fix(fixer):自动修复函数
  • suggest:建议修正方案

自动修复注意事项

  • 必须在 meta 中声明 fixable 属性
  • 常用修复方法:
    • replaceText()
    • insertTextAfter()
    • removeRange()
  • 修复限制:
    • 同一位置不可重叠修改
    • 最多进行 10 轮修复迭代

占位符与 Message IDs

meta.messages(可选):定义消息模板对象,其中包含多个 messageId 对应不同错误类型

在 context.report 中通过 messageId + data 引用模板
使用 {{xxx}} 占位符在消息中插入动态内容

选项(Options)与 Schema

可配置规则需满足以下要求:

  1. 在 meta.schema 中定义配置参数结构(使用 JSON Schema)
  2. 通过 context.options 获取用户配置值
  3. 可选提供 defaultOptions 作为未配置项的默认值
  4. Schema 验证失败会在配置阶段报错,避免运行时异常

源代码访问(Source Code & Comments 等)

通过 context.sourceCode 可进行以下操作:

  1. 获取源代码:
    • 获取完整文本或指定 AST 节点子树 (getText)
  2. 获取注释信息(注释不在默认 AST 节点中):
    • 获取节点前后注释 (getCommentsBefore/After)
    • 获取所有注释 (getAllComments)
    • 获取节点内部注释 (getCommentsInside)
  3. 获取代码结构细节:
    • 获取 Token/节点间的空白和注释
    • 获取 AST 父节点链 (getAncestors)

作用域(Scopes)与变量追踪

  1. 使用 sourceCode.getScope(node) 获取节点作用域
  2. 通过 scope 的 variables 和 references 跟踪变量声明和使用
  3. 使用 sourceCode.markVariableAsUsed(name, refNode) 标记变量使用
    • 避免 no-unused-vars 等规则误报

其他重要事项

  1. 命名规范:建议遵循核心规则命名风格,保持一致性
  2. 单元测试:
    • 使用 RuleTester 测试
    • 包含 valid/invalid 用例
    • 验证修复行为
  3. 运行时规则:
    • 支持动态加载规则
    • 使用 --rulesdir 指定规则目录

性能分析

  1. 支持规则性能追踪
  2. 设置环境变量 TIMING=1 启用性能报告
    • 显示最耗时规则及其执行时间占比
  3. 识别性能瓶颈并进行优化

ESLint 自定义规则的单元测试例子

const rule = require('../../rules/no-js-in-ts-project');
const { RuleTester } = require('eslint');const ruleTester = new RuleTester();
ruleTester.run('no-js-in-ts-project', rule, {valid: [{filename: 'index.ts',code: '',},{filename: '.stylelintrc.js',code: '',},{filename: 'home.ts',code: '',},],invalid: [{filename: 'home.js',code: '',errors: [{message: 'The "home.js" is not recommended in TS project',},],},],
});

测试包含两部分:

✅ 合法用例(valid)

  • index.ts:允许的 TypeScript 文件
  • .stylelintrc.js:允许的配置文件(如 ESLint/Stylelint 配置通常使用 .js 格式)
  • home.ts:允许的 TypeScript 文件

❌ 非法用例(invalid)

  • home.js:在 TypeScript 项目中使用 JavaScript 文件将触发错误

错误信息:

The "home.js" is not recommended in TS project

文档参考:ESLint 官方文档中关于自定义规则的部分,详见 ESLint 自定义规则指南


文章转载自:

http://q9iTZYgC.xdwcg.cn
http://sLQqvHWo.xdwcg.cn
http://CokrBfPh.xdwcg.cn
http://se5rvDTi.xdwcg.cn
http://GC8QihtM.xdwcg.cn
http://2dKsuLm8.xdwcg.cn
http://YTey2S7K.xdwcg.cn
http://HdE4cHw5.xdwcg.cn
http://k0I7R8mk.xdwcg.cn
http://vM9DMOnR.xdwcg.cn
http://CFbQnTkJ.xdwcg.cn
http://HWuQlmcV.xdwcg.cn
http://Sw9VIm5b.xdwcg.cn
http://ChuAqaia.xdwcg.cn
http://STJYuKrf.xdwcg.cn
http://uoqC9LX2.xdwcg.cn
http://RDZgCsC2.xdwcg.cn
http://kCCNKgJG.xdwcg.cn
http://t2eXV98C.xdwcg.cn
http://k1dgGWlu.xdwcg.cn
http://SSo3Slfk.xdwcg.cn
http://KskkKaLW.xdwcg.cn
http://X9bTVMJ8.xdwcg.cn
http://zolyR0C1.xdwcg.cn
http://f09U7Kk7.xdwcg.cn
http://T8Mtmpdh.xdwcg.cn
http://qmk4PFip.xdwcg.cn
http://qkOJRcN0.xdwcg.cn
http://wXlWeqxO.xdwcg.cn
http://rLX9VqjN.xdwcg.cn
http://www.dtcms.com/a/384589.html

相关文章:

  • 三维地震数据体:形态、处理流程与勘探应用笔记
  • HTTP标头全解析:保护你的Web应用!
  • 机器人控制器开发(定位——cartographer ros2 使用2)
  • 元学习原理与实验实战:让机器学会快速学习
  • [Cesium] 基于Cesium的二次开发的库
  • 红外IR的运用
  • 基于51单片机可燃气体报警、风扇、继电器断闸
  • Ubuntu下搭建vllm+modelscope+deepseek qwen3
  • 【 SQLMap】GET型注入
  • Actix-webRust Web框架入门教程
  • Docker Grafana 忘了密码修改方法
  • 移动端触摸事件与鼠标事件的触发机制详解
  • Go语言深度解析:从入门到精通的完整指南
  • CKS-CN 考试知识点分享(6) 日志审计
  • CentOS 7 环境下 PHP 7.3 与 PHP-FPM 完整安装指南(外网 yum / 内网源码双方案)
  • ubuntu24.04下让终端显示当前git分支的最简单的方法
  • 快速安装WIN10
  • 【bert微调+微博数据集】-实现微博热点话题预测与文本的情感分析
  • Java 黑马程序员学习笔记(进阶篇9)
  • 认知语义学中的隐喻理论对人工智能自然语言处理深层语义分析的启示与影响研究
  • 03-htmlcss
  • 【PSINS工具箱下的例程】用于生成平面上8字型飞行轨迹,高度和飞行速度等值可自定义|包括AVP(姿态、速度、位置)和IMU数据(加速度计与陀螺仪)
  • SSB-Based Signal Processing for Passive Radar Using a 5G Network
  • SQLAlchemy使用笔记(一)
  • 【C#】.net core 8.0 MVC在一次偶然间发现控制器方法整个Model实体类对象值为null,猛然发现原来是
  • 【小白笔记】 Linux 命令及其含义
  • vue ElementUI textarea在光标位置插入指定变量及校验
  • 边缘人工智能计算机
  • 亚远景侯亚文老师受邀出席PTC中国数字化转型精英汇,分享汽车研发破局“三擎”之道
  • K8S结合Istio深度实操