簡體   English   中英

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

[英]How to forbid a specific named function with ESlint

情況

在我們當前的項目中,我們遇到了一些反復出現的問題,人們在無縫不可變的情況下使用“asMutable”,但實際上並不需要。 這導致“字符串“asMutable”的搜索項目”成為每個拉取請求的一部分。 為了加快速度,我們想在我們的 eslint 中添加一個規則警告。 但我還沒想好怎么做。

問題

盡管我願意接受建議,但現在對我來說似乎最好的解決方案是允許我指定要禁止的函數名稱的規則。 ESlint 或插件是否具有這種功能?

附加說明

我曾考慮過編寫自己的規則,但我被AST和編寫我的第一條規則的啟動困難嚇倒了。 如果我找不到更好的答案,我可能會冒險嘗試,是的,我們在 PR 中得到了足夠的信息來保證它。 這似乎是比我更聰明的人已經解決的問題,所以我寧願追隨他們的腳步,然后建立自己的。

不久前我遇到了同樣的問題,所以我可以幫助您編寫自己的。

所以,首先,讓我們解釋一些基本結構:

  1. ESLint插件,每個插件都有規則
  2. ESLint使用AST語法樹來查找代碼中的特定部分。 這有助於 ESLint 找到每個規則正在尋找的內容。

因此,讓我們首先創建一個帶有規則的插件:


1. 為 Yeoman 使用 ESLint 生成器

這讓事情變得容易多了。 在這里查看

安裝yeomanyeoman eslint generator

  • 進入您要在其中創建項目的文件夾
  • 運行yo eslint:plugin創建一個新的ESLint插件
  • 創建插件后,在同一文件夾中運行yo eslint:rule

我使用suni作為插件名稱,並使用check-as-mutable作為規則名稱。 現在我們有了編寫規則所需的所有初始文件。


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

AST Explorer可以幫助我們找到我們正在尋找的東西類型 這很重要,因此我們可以告訴ESLint我們希望函數在代碼中運行的內容。

當您將代碼粘貼到AST Explorer 中時,它會向您顯示ESLint所看到的內容。 我們要針對所有MemberExpression

something. asMutable ();

在里面,我們希望Identifier node檢查函數名稱


3. 編寫插件本身

打開lib/rules/check-as-mutable.js並檢查它。 您為Yeoman提供的所有數據都用於填寫此處的某些字段。

在規則內部,您有一個create屬性。 在這里,我們編寫我們的代碼。 這個函數應該返回一個對象,我們希望我們的規則作為屬性運行。 所以,在這種情況下,它看起來像這樣:

create: function(context) {

    return {
      MemberExpression: function(node)...

    };
}

在編寫規則時,您應該使用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('')
        });
      }
    }
  };
}

之后,您需要在項目中安裝插件。 為此,請將其上傳到 GitHub,並使用 npm 進行安裝:

npm install --save-dev <user_name>/<repository_name>

並將規則也包含在您的.eslintrc文件中:

{
    'plugins': ['suni'],
    'rules': {
      'suni/check-as-mutable': 1
    }
}

請注意,我給了它值1 這使得此規則顯示為警告而不是錯誤

在此處輸入圖片說明

請注意,警告突出顯示了 Immutable 本身,因為它是我們傳遞給context.reportnode 您可以調整它以突出顯示id node

這是我為此答案創建的插件

祝你好運!

當你將 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"]'
      }
    ]
  }
}

研究selectors的文檔頁面; 它非常靈活!

@Eric Simonton 的回答之上,從 ESLint 3.5.0 開始,我們有專門構建的無限制屬性

"no-restricted-properties": [ "error", {
    "object": "Immutable",
    "property": "asMutable",
    "message": "optional explanation to the recurring problems we've had"
}]

如果有人來這里尋找阻止不是類方法的函數的方法,您可以類似地使用no-restricted-globals

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM