自定义eslint规则

我要自定义我的个人的eslint规则

示例:不让团队成员使用 aaa 这几个字来作为变量名

-rule定义:针对这个规范的需求,编写一个 rule,原理是通过 ast,通过 ast 节点处理来完成

-plugin插件定义:将rule 进行插件化,提供给外部使用

-use使用:将插件引入到 eslint 配置文件中,使用插件

\myeslint

\myeslint\plugins\eslint-plugin-whh.js

\myeslint\rules\no-whh-vars.js

javascript 复制代码
// \myeslint\plugins\eslint-plugin-whh.js
​
​
// 插件的本质是对象,符合插件的基础协议
import { noWhhVars } from "../rules/no-whh-vars.js";
​
export const eslintWhhPlugin = {
  rules: {
    "no-whh-vars": noWhhVars,
  },
};

eslintConfig 中导入

javascript 复制代码
import { eslintWhhPlugin } from "./myeslint/plugins/eslint-plugin-whh.js";
export default defineConfig(
     {
        plugins: {
          js,
          whh: eslintWhhPlugin, // 插件定义好之后,插件的名称就是规则的作用域,rules 中使用自定义规则要在前面带名称
        },
        extends: ["js/recommended"],
      },
      {
        rules: {
          "whh/no-whh-vars": "error", // 自定义规则,不能使用 whh 作为变量名;   rules 中使用自定义规则要在前面带名称
        },
      },
])

astexplore 主要是看节点的便利顺序,生成对应的 ast 树

scss 复制代码
// \myeslint\rules\no-whh-vars.js
​
// 规则的本质是一个对象
// 在插件化规则里,这个对象的属性约束就是我们所说的插件化协议
​
// eslint的插件必须长的像一个约定好的对象
// 必须要有如下属性, meta 和 creat 方法
​
export const noWhhVars = {
  meta: {}, // 插件元信息
  create(context) {
    //插件的入口,插件的上下文
    return {
      // 这是一个访问者模式,访问到某一个节 ast 节点,就进行处理
      VariableDeclaration(node) {
        console.log("VariableDeclaration --->", node);
      },
      VariableDeclarator(node) {
        console.log("VariableDeclarator --->", node);
      },
      Identifier(node) {
        console.log("Identifier --->", node);
      },
      Literal(node) {
        console.log("Literal --->", node);
      },
    };
  },
};

控制规则主要走这个方法( Identifier(node)做文章

javascript 复制代码
// 规则的本质是一个对象
// 在插件化规则里,这个对象的属性约束就是我们所说的插件化协议
​
// eslint的插件必须长的像一个约定好的对象
// 必须要有如下属性, meta 和 creat 方法
​
export const noWhhVars = {
  meta: {
    messages: {
      noWhhVars: "不允许使用 whh 变量",
    },
  }, // 插件元信息
  create(context) {
    //插件的入口,插件的上下文
    return {
      // 控制规则主要走这个方法做文章
      Identifier(node) {
        // console.log("Identifier --->", node);
        if (node.name === "whh") {
          // 上报错误
          context.report({
            node,
            messageId: "noWhhVars", // 上报的 messageId 和元信息的 messages 一致
            data: {
              name: node.name,
            },
          });
        }
      },
    };
  },
};
相关推荐
weixin_382395238 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__8 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.9 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~10 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华10 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子13 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅13 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni13 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学14 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端