如何使用ESlint禁止特定的命名函数

Sun*_*uni 8 javascript eslint seamless-immutable

情况

在我们当前的项目中,我们遇到了一些反复出现的问题,人们使用'asMutable'来实现无缝不可变,而实际上并不是必需的.这导致'search project for string"asMutable"'成为每个pull请求的一部分.为了加快速度,我们想在我们的队列中添加一条规则警告.但我还没弄明白怎么做.

问题

对我来说似乎是最好的解决方案,虽然我对建议持开放态度,这是一条允许我指定禁止的函数名称的规则.ESlint或插件是否具有这种功能?

补充说明

我看起来有点自己编写,但我被AST和创建第一条规则的启动困难所吓倒.如果我找不到更好的答案,我可能会冒险尝试,是的,我们在PR中得到足够的保证.这似乎比我更聪明的人已经解决了,所以我宁愿跟随他们的脚步然后建立我自己的脚步.

Eri*_*ton 13

当你将 ESLint 的no-restricted-syntax规则与selectors. 在您的情况下,您应该能够在不编写自己的插件的情况下实现所需的 linting。该规则类似于:

{
  rules: {
    'no-restricted-syntax': [
      'error',
      {
        message: "Please don't use asMutable. We don't like it!",
        selector:
          'MemberExpression > Identifier[name="asMutable"]'
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

研究文档页面selectors;它非常灵活!

  • 看起来比创建一个新插件要简单得多。我必须将选择器编写为“CallExpression[callee.name='asMutable']”才能使其正常工作。 (4认同)
  • 如果您不知道选择器是什么,可以使用[接受的答案](/sf/answers/2868573781/)中链接的[AST Explorer](http://astexplorer.net/) 2072165) 来了解一下 (3认同)
  • `MemberExpression[property.name='asMutable']` 应该适合你 (2认同)

Tha*_*guy 10

不久前我遇到了同样的问题所以我可以帮你编写自己的问题.

首先,让我们解释一些基本结构:

  1. ESLint插件,每个插件都有规则.
  2. ESLint使用AST作为语法树来查找代码中的特定部分.这有助于ESLint找到每个规则正在寻找的内容.

那么,让我们首先创建一个带有规则的插件:


1.使用ESLint Generator for Yeoman

这使事情变得容易多了.检查它在这里.

在安装yeomanyeoman eslint generator:

  • 进入要在其中创建项目的文件夹
  • 运行yo eslint:plugin以创建一个新ESLint插件
  • 创建插件后,yo eslint:rule在同一文件夹中运行

我用作suni插件名称和check-as-mutable规则名称.现在我们有了编写规则所需的所有初始文件.


2.了解使用AST Explorer需要查找的内容

AST资源管理器可以帮助我们找到什么类型,我们正在寻找的事情.这很重要,因此我们可以告诉ESLint代码中我们希望运行函数的内容.

将代码粘贴到AST Explorer中时,它会显示ESLint正在查看的内容.我们想要定位所有MemberExpressions:

something.asMutable();

在里面,我们想要Identifier node检查函数名称


3.编写插件本身

打开lib/rules/check-as-mutable.js并检查出来.您提供的所有数据Yeoman都用于填写此处的某些字段.

在规则内部,您有一个create属性.在这里,我们编写代码.这个函数应该返回一个对象,我们希望我们的规则作为属性运行.所以,在这种情况下,它看起来像这样:

create: function(context) {

    return {
      MemberExpression: function(node)...

    };
}
Run Code Online (Sandbox Code Playgroud)

在编写规则时,您应该使用以下内容检查所需的字段AST Explorer.

这是实施:

create: function(context) {
  var UNWANTED_FUNCTION_NAME = 'asMutable';
  return {
    MemberExpression: function reportUnwantedName(node) {
      var functionName = node.property.name;

      if (functionName === UNWANTED_FUNCTION_NAME) {
        context.report({
          node: node,
          message: [
            'Please don\'t use ',
            UNWANTED_FUNCTION_NAME,
            '. We don\'t like it!'].join('')
        });
      }
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

之后,您需要在项目中安装插件.为此,将其上传到GitHub,并使用npm安装它:

npm install --save-dev <user_name>/<repository_name>
Run Code Online (Sandbox Code Playgroud)

并在您的.eslintrc文件中包含规则:

{
    'plugins': ['suni'],
    'rules': {
      'suni/check-as-mutable': 1
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我给了它值1.这使得此规则显示为警告而不是错误

在此输入图像描述

请注意,警告突出显示了Immutable本身,因为这是node我们传递给的context.report.您可以调整它以突出显示id node.

这是我为这个答案创建的插件

祝好运!

  • 这非常有帮助,并且让我了解了很多方法。我即将开始遵循说明(先阅读它们),但我注意到您正在查看函数声明,我将寻找函数调用(asMutable 是一个无缝不可变的函数,它具有很小的利基应用程序)并被一些开发人员滥用)。我假设有一个像 FunctionDecleration 这样的 FunctionInvocation 变体,尽管我还在谷歌上搜索它。这种变化将有助于更完美地解决这个问题。 (2认同)

Sta*_*Noy 10

除了@Eric Simonton 的回答之外,从 ESLint 3.5.0 开始,我们有了专门构建的无限制属性

"no-restricted-properties": [ "error", {
    "object": "Immutable",
    "property": "asMutable",
    "message": "optional explanation to the recurring problems we've had"
}]
Run Code Online (Sandbox Code Playgroud)

如果有人来这里寻找阻止不是类方法的函数的方法,您也可以类似地使用no-restricted-globals