遷移至 v8.0.0
ESLint v8.0.0 是 ESLint 的主要版本。我們在此版本中進行了一些重大變更。本指南旨在引導您了解重大變更。
以下列表大致按預期受每個變更影響的使用者數量排序,其中第一個項目預期影響最多使用者。
目錄
使用者的重大變更
- 不再支援 Node.js 10、13 和 15
- 移除
codeframe
和table
格式化工具 comma-dangle
規則 schema 更加嚴格- 未使用的 disable 指令現在可修正
eslint:recommended
已更新
外掛程式開發者的重大變更
- 不再支援 Node.js 10、13 和 15
- 規則需要
meta.hasSuggestions
才能提供建議 - 規則需要
meta.fixable
才能提供修正 SourceCode#getComments()
在RuleTester
中失敗- 速記屬性 AST 格式的變更
整合開發者的重大變更
不再支援 Node.js 10、13 和 15
Node.js 10、13、15 都在 2020 年或 2021 年初達到生命週期終止。ESLint 從 ESLint v8.0.0 開始正式停止支援這些版本的 Node.js。ESLint 現在支援以下版本的 Node.js
- Node.js 12.22 及以上版本
- Node.js 14 及以上版本
- Node.js 16 及以上版本
解決方案: 使用 ESLint v8.0.0 時,請確保您升級到至少 Node.js 12.22.0
。一個需要再三確認的重要事項是透過編輯器整合使用 ESLint 時,您的編輯器支援的 Node.js 版本。如果您無法升級,我們建議您繼續使用 ESLint 7,直到您可以升級 Node.js 為止。
相關問題: #14023
移除 codeframe
和 table
格式化工具
ESLint v8.0.0 已從核心移除 codeframe
和 table
格式化工具。這些格式化工具需要 ESLint 中其他地方未使用的相依性,移除它們可以減少 ESLint 的大小,從而加快安裝速度。
解決方案: 如果您正在使用 codeframe
或 table
格式化工具,您需要安裝獨立的 eslint-formatter-codeframe
或 eslint-formatter-table
套件,才能在 ESLint v8.0.0 中使用它們。
comma-dangle
規則 schema 更加嚴格
在 ESLint v7.0.0 中,可以像這樣設定 comma-dangle
規則而不會出錯
{
"rules": {
"comma-dangle": ["error", "never", { "arrays": "always" }]
}
}
使用此設定,規則會忽略陣列中的第三個元素,因為只讀取了第二個元素。在 ESLint v8.0.0 中,此設定將導致 ESLint 擲回錯誤。
解決方案: 變更您的規則設定,使陣列中只有兩個元素,且第二個元素是字串或物件,例如
{
"comma-dangle": ["error", "never"],
}
或
{
"comma-dangle": ["error", {
"arrays": "never",
"objects": "never",
"imports": "never",
"exports": "never",
"functions": "never"
}]
}
相關問題: #13739
未使用的 disable 指令現在可修正
在 ESLint v7.0.0 中,在命令列上同時使用 --report-unused-disable-directives
和 --fix
將僅修正規則,但將未使用的 disable 指令保留在原位。在 ESLint v8.0.0 中,命令列選項的這種組合將導致移除未使用的 disable 指令。
解決方案: 如果您在命令列上同時使用 --report-unused-disable-directives
和 --fix
,並且不希望移除未使用的 disable 指令,請新增 --fix-type problem,suggestion,layout
作為命令列選項。
相關問題: #11815
eslint:recommended
已更新
eslint:recommended
預設設定中已啟用四個新規則。
no-loss-of-precision
no-nonoctal-decimal-escape
no-unsafe-optional-chaining
no-useless-backreference
解決方案: 修正錯誤或停用這些規則。
相關問題: #14673
規則需要 meta.hasSuggestions
才能提供建議
在 ESLint v7.0.0 中,提供建議的規則不需要讓 ESLint 知道。在 v8.0.0 中,提供建議的規則需要將其 meta.hasSuggestions
設定為 true
。這會通知 ESLint 規則打算提供建議。如果沒有此屬性,任何提供建議的嘗試都會導致錯誤。
解決方案: 如果您的規則提供建議,請將 meta.hasSuggestions
新增至物件,例如
module.exports = {
meta: {
hasSuggestions: true
},
create(context) {
// your rule
}
};
eslint-plugin/require-meta-has-suggestions 規則可以自動修正並強制您的規則正確指定 meta.hasSuggestions
。
相關問題: #14312
規則需要 meta.fixable
才能提供修正
在 ESLint v7.0.0 中,寫成函式(而非物件)的規則能夠提供修正。在 ESLint v8.0.0 中,只有寫成物件的規則才允許提供修正,並且必須將 meta.fixable
屬性設定為 "code"
或 "whitespace"
。
解決方案: 如果您的規則進行修正並且寫成函式,例如
module.exports = function(context) {
// your rule
};
然後以此格式重寫您的規則
module.exports = {
meta: {
fixable: "code" // or "whitespace"
},
create(context) {
// your rule
}
};
eslint-plugin/require-meta-fixable 規則可以自動修正並強制您的規則正確指定 meta.fixable
。
eslint-plugin/prefer-object-rule 規則可以自動修正並強制您的規則以物件格式而不是已棄用的函式格式撰寫。
請參閱規則文件以取得有關撰寫規則的更多資訊。
相關問題: #13349
SourceCode#getComments()
在 RuleTester
中失敗
早在 ESLint v4.0.0 中,我們就已棄用 SourceCode#getComments()
,但我們忽略了將其移除。我們沒有在 v8.0.0 中完全移除它,而是採取了中間步驟,更新 RuleTester
以在規則內部使用 SourceCode#getComments()
時失敗。因此,所有現有規則將繼續運作,但是當開發人員為規則執行測試時,將會發生失敗。
SourceCode#getComments()
方法將在 v9.0.0 中移除。
解決方案: 如果您的規則使用 SourceCode#getComments()
,請使用 SourceCode#getCommentsBefore()
、SourceCode#getCommentsAfter()
或 SourceCode#getCommentsInside()
。
相關問題: #14744
速記屬性 AST 格式的變更
ESLint v8.0.0 包含升級至 Espree v8.0.0 以支援新語法。反過來,此 Espree 升級包含升級至 Acorn v8.0.0,後者變更了速記屬性在 AST 中的表示方式。以下是一個範例
const version = 8;
const x = {
version
};
此程式碼建立一個屬性節點,如下所示
{
"type": "Property",
"method": false,
"shorthand": true,
"computed": false,
"key": {
"type": "Identifier",
"name": "version"
},
"kind": "init",
"value": {
"type": "Identifier",
"name": "version"
}
}
請注意,key
和 value
屬性都包含相同的資訊。在 Acorn v8.0.0 之前(因此在 ESLint v8.0.0 之前),這兩個節點由同一個物件表示,因此您可以使用 ===
來判斷它們是否表示相同的節點,例如
// true in ESLint v7.x, false in ESLint v8.0.0
if (propertyNode.key === propertyNode.value) {
// do something
}
在 ESLint v8.0.0 中(透過 Acorn v8.0.0),key 和 value 現在是個別的物件,因此不再相等。
解決方案: 如果您的規則在速記物件實值屬性的 key 和 value 之間進行比較,以判斷它們是否為相同的節點,則您需要透過以下兩種方式之一變更您的程式碼
- 使用
propertyNode.shorthand
來判斷屬性是否為速記屬性節點。 - 使用每個節點的
range
屬性來判斷 key 和 value 是否佔用相同的位置。
相關問題: #14591
CLIEngine
類別已移除
CLIEngine
類別已移除,並由 ESLint
類別取代。
解決方案: 如果您目前正在使用 CLIEngine
,請更新您的程式碼以使用新的 ESLint
類別。下表將現有的 CLIEngine
方法對應到它們的 ESLint
對應項目
CLIEngine |
ESLint |
---|---|
executeOnFiles(patterns) |
lintFiles(patterns) |
executeOnText(text, filePath, warnIgnored) |
lintText(text, options) |
getFormatter(name) |
loadFormatter(name) |
getConfigForFile(filePath) |
calculateConfigForFile(filePath) |
isPathIgnored(filePath) |
isPathIgnored(filePath) |
static outputFixes(results) |
static outputFixes(results) |
static getErrorResults(results) |
static getErrorResults(results) |
static getFormatter(name) |
(已移除 ※1) |
addPlugin(pluginId, definition) |
plugins 建構子選項 |
getRules() |
(已移除 ※2) |
resolveFileGlobPatterns() |
(已移除 ※3) |
- ※1
engine.getFormatter()
方法目前按原樣傳回已載入套件的物件,這使得由於向後相容性原因而難以向格式化工具新增新功能。新的eslint.loadFormatter()
方法傳回一個轉接器物件,該物件包裝了已載入套件的物件,以簡化新增新功能的流程。此外,轉接器物件可以存取ESLint
實例,以計算預設資料(例如,使用已載入的外掛程式規則來建立rulesMeta
)。因此,ESLint
類別僅實作loadFormatter()
方法的實例版本。 - ※2
CLIEngine#getRules()
方法具有副作用,因此已移除。如果您使用CLIEngine#getRules()
來檢索有關基於 linting 結果的規則的中繼資訊,請改用ESLint#getRulesMetaForResults()
。如果您使用CLIEngine#getRules()
來檢索所有內建規則,請從eslint/use-at-your-own-risk
匯入builtinRules
,以取得允許存取內部規則的不受支援的 API。 - ※3 自 ESLint v6.0.0 以來,ESLint 使用與
resolveFileGlobPatterns()
方法不同的邏輯來迭代檔案,從而使此方法過時。
linter
物件已移除
已棄用的 linter
物件已從 v8.0.0 中的 ESLint 套件中移除。
解決方案: 如果您正在使用 linter
物件,例如
const { linter } = require("eslint");
將您的程式碼變更為此
const { Linter } = require("eslint");
const linter = new Linter();
/lib
entrypoint 已移除
從 v8.0.0 開始,ESLint 嚴格定義其公共 API。先前,您可以存取個別檔案,例如 require("eslint/lib/rules/semi")
,但現在已不再允許這樣做。現在有少數現有的 API 可以透過 /use-at-your-own-risk
entrypoint 取得,以實現向後相容性,但是這些 API 未獲得正式支援,並且可能隨時中斷或消失。
解決方案: 如果您直接透過 /lib
entrypoint 存取規則,例如
const rule = require("eslint/lib/rules/semi");
將您的程式碼變更為此
const { builtinRules } = require("eslint/use-at-your-own-risk");
const rule = builtinRules.get("semi");
如果您直接透過 /lib
entrypoint 存取 FileEnumerator
,例如
const { FileEnumerator } = require("eslint/lib/cli-engine/file-enumerator");
將您的程式碼變更為此
const { FileEnumerator } = require("eslint/use-at-your-own-risk");