[英]How to forbid a specific named function with ESlint
在我們當前的項目中,我們遇到了一些反復出現的問題,人們在無縫不可變的情況下使用“asMutable”,但實際上並不需要。 這導致“字符串“asMutable”的搜索項目”成為每個拉取請求的一部分。 為了加快速度,我們想在我們的 eslint 中添加一個規則警告。 但我還沒想好怎么做。
盡管我願意接受建議,但現在對我來說似乎最好的解決方案是允許我指定要禁止的函數名稱的規則。 ESlint 或插件是否具有這種功能?
我曾考慮過編寫自己的規則,但我被AST和編寫我的第一條規則的啟動困難嚇倒了。 如果我找不到更好的答案,我可能會冒險嘗試,是的,我們在 PR 中得到了足夠的信息來保證它。 這似乎是比我更聰明的人已經解決的問題,所以我寧願追隨他們的腳步,然后建立自己的。
不久前我遇到了同樣的問題,所以我可以幫助您編寫自己的。
所以,首先,讓我們解釋一些基本結構:
ESLint
有插件,每個插件都有規則。ESLint
使用AST語法樹來查找代碼中的特定部分。 這有助於 ESLint 找到每個規則正在尋找的內容。因此,讓我們首先創建一個帶有規則的插件:
這讓事情變得容易多了。 在這里查看。
安裝yeoman
和yeoman eslint generator
:
yo eslint:plugin
創建一個新的ESLint
插件yo eslint:rule
我使用suni
作為插件名稱,並使用check-as-mutable
作為規則名稱。 現在我們有了編寫規則所需的所有初始文件。
AST Explorer可以幫助我們找到我們正在尋找的東西類型。 這很重要,因此我們可以告訴ESLint
我們希望函數在代碼中運行的內容。
當您將代碼粘貼到AST Explorer 中時,它會向您顯示ESLint
所看到的內容。 我們要針對所有MemberExpression
:
something.
asMutable
();
在里面,我們希望Identifier node
檢查函數名稱
打開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.report
的node
。 您可以調整它以突出顯示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.