遷移至 v7.0.0
ESLint v7.0.0 是 ESLint 的主要版本。我們在此版本中進行了一些重大變更。本指南旨在引導您了解這些重大變更。
下面的列表大致按照每個變更預計會影響的使用者數量排序,其中第一個項目預計會影響最多的使用者。
目錄
對使用者造成的重大變更
- 不再支援 Node.js 8
- 預設情況下,檢查符合
overrides[].files
的檔案 - 如果設定檔是透過
--config
/--ignore-path
選項給定的,則overrides
和ignorePatterns
的基本路徑會變更 - ESLint 從何處載入外掛程式的位置已變更
- 針對
~/.eslintrc.*
設定檔的執行階段棄用警告 - 預設忽略模式已變更
- 指令註解中的描述
- Node.js/CommonJS 規則已棄用
- 數個規則已更新以涵蓋更多情況
eslint:recommended
已更新
對外掛程式開發人員造成的重大變更
對整合開發人員造成的重大變更
不再支援 Node.js 8
Node.js 8 已於 2019 年 12 月終止生命週期,我們在此版本中正式取消對其的支援。ESLint 現在支援以下 Node.js 版本
- Node.js 10 (
10.12.0
及以上) - Node.js 12 及以上
處理方式: 使用 ESLint v7.0.0 時,請務必升級到至少 Node.js 10.12.0
。一個重要的檢查點是透過編輯器整合使用 ESLint 時,您的編輯器支援的 Node.js 版本。如果您無法升級,我們建議繼續使用 ESLint 6,直到您可以升級 Node.js 為止。
預設情況下,檢查符合 overrides[].files
的檔案
在 v7.0.0 之前,如果您提供像 eslint src
這樣的目錄,ESLint 預設只會檢查副檔名為 .js
的檔案。
ESLint v7.0.0 現在還會額外檢查副檔名為其他副檔名(.ts
、.vue
等)的檔案,如果該副檔名是由 overrides[].files
項目明確比對到的。這將允許使用者檢查不以 *.js
結尾的檔案,而無需使用 --ext
命令列標記,並允許共用設定檔的作者啟用這些檔案的程式碼檢查,而無需為最終使用者增加額外開銷。請注意,以 *
結尾的模式不受此行為的影響,並且其行為將與先前一樣。例如,如果存在以下設定檔,
# .eslintrc.yml
extends: my-config-js
overrides:
- files: "*.ts"
extends: my-config-ts
那麼執行 eslint src
將檢查 src
目錄中的 *.js
和 *.ts
檔案。
處理方式: 使用 --ext
CLI 選項將覆寫此新行為。如果您正在使用 overrides
但只想檢查副檔名為 .js
的檔案,請使用 --ext .js
執行 ESLint。
如果您維護的的外掛程式會檢查副檔名不是 .js
的檔案,此功能將允許您透過在 recommended
預設設定中設定 overrides
設定來預設檢查這些檔案。
當使用 --config
/--ignore-path
選項時,overrides
和 ignorePatterns
的基本路徑已變更
到目前為止,ESLint 已將以下路徑解析為相對於入口設定檔的目錄路徑
- 設定檔 (
.eslintrc.*
)overrides[].files
設定中的相對路徑overrides[].excludedFiles
設定中的相對路徑ignorePatterns
設定中以/
開頭的路徑
- 忽略檔案 (
.eslintignore
)- 以
/
開頭的路徑
- 以
從 ESLint v7.0.0 開始,分別使用 --config path/to/a-config
和 --ignore-path path/to/a-ignore
CLI 標記傳遞給 ESLint 的設定檔和忽略檔案,將從目前的工作目錄解析,而不是從檔案位置解析。這允許使用者使用共用外掛程式,而無需直接在其專案中安裝它們。
處理方式: 如果您透過 --config
或 --ignore-path
CLI 選項使用設定或忽略檔案,請更新受影響的路徑。
外掛程式的解析已更新
在先前的版本中,ESLint 預設從目前的工作目錄解析所有外掛程式。
從 ESLint v7.0.0 開始,plugins
是相對於入口設定檔的目錄路徑解析的。
這在大多數情況下不會有任何改變。如果子目錄中的設定檔定義了 plugins
,則外掛程式將從子目錄(或如果找不到,則包括目前工作目錄的父目錄)載入。
這表示如果您透過 --config
選項使用共用位置的設定檔,則設定檔宣告的外掛程式將從共用設定檔位置載入。
處理方式: 請確保外掛程式安裝在可以相對於您的設定檔解析的位置,或使用 --resolve-plugins-relative-to .
來覆寫此變更。
針對 ~/.eslintrc.*
設定檔的執行階段棄用警告
自從 v6.7.0 以來,個人設定檔已棄用。ESLint v7.0.0 將開始列印執行階段棄用警告。它將針對以下情況列印警告
- 當專案沒有設定檔,並且 ESLint 從
~/.eslintrc.*
載入設定時。 - 當專案有設定檔,並且 ESLint 忽略了
~/.eslintrc.*
設定檔時。當$HOME
目錄是專案的父目錄,並且專案的設定檔不包含root:true
時,就會發生這種情況。
處理方式: 移除 ~/.eslintrc.*
設定檔,並將 .eslintrc.*
設定檔新增至您的專案。或者,使用 --config
選項來使用共用設定檔。
預設忽略模式已變更
到目前為止,ESLint 預設忽略以下檔案
- 點檔案 (
.*
) - 目前工作目錄中的
node_modules
(/node_modules/*
) - 目前工作目錄中的
bower_components
(/bower_components/*
)
ESLint v7.0.0 也會忽略子目錄的 node_modules/*
,但不再忽略 bower_components/*
和 .eslintrc.js
。因此,新的預設忽略模式如下:
- 點檔案,但
.eslintrc.*
除外 (.*
但不包含.eslintrc.*
) node_modules
(/**/node_modules/*
)
解決方案: 如果您不希望對 bower_components/*
和 .eslintrc.js
進行檢查,請修改您的 .eslintignore
或設定檔的 ignorePatterns
屬性。
指令註解中的描述
在舊版的 ESLint 中,沒有方便的方法可以指出為什麼需要指令註解(例如 /*eslint-disable*/
)。
為了允許將提供上下文的註解與指令並列,ESLint v7.0.0 增加了在指令註解中附加任意文字的功能,方法是忽略以空白包圍的 --
後面的文字。例如:
// eslint-disable-next-line a-rule, another-rule -- those are buggy!!
解決方案: 如果您的指令註解中包含以空白包圍的 --
,請考慮將其移至設定檔中。
Node.js/CommonJS 規則已被棄用
核心中的十個 Node.js/CommonJS 規則已被棄用,並移至 eslint-plugin-node 外掛程式(對於 ESLint v8.0.0 及更高版本,請改用維護的 eslint-plugin-n 分支)。
解決方案: 根據我們的棄用政策,已棄用的規則在可預見的未來仍將保留在核心中,並且仍然可以使用。但是,我們將不再更新或修復這些規則中的任何錯誤。若要使用受支援版本的規則,我們建議改用外掛程式中對應的規則。
相關問題: #12898
多個規則已更新以涵蓋更多情況
多個規則已增強,現在會報告其他錯誤
- accessor-pairs 規則現在預設會識別類別成員。
- array-callback-return 規則現在會識別
flatMap
方法。 - computed-property-spacing 規則現在預設會識別類別成員。
- func-names 規則現在會識別預設匯出中的函式宣告。
- no-extra-parens 規則現在會識別賦值目標中的括號。
- no-dupe-class-members 規則現在會識別靜態類別成員的計算鍵。
- no-magic-numbers 規則現在會識別 bigint 字面值。
- radix 規則現在會識別
parseInt()
的第二個參數的無效數字。 - use-isnan 規則現在預設會識別類別成員。
- yoda 規則現在會識別 bigint 字面值。
解決方案: 修復錯誤或停用這些規則。
相關問題: #12490, #12608, #12670, #12701, #12765, #12837, #12913, #12915, #12919
eslint:recommended
已更新
eslint:recommended
預設設定檔中已啟用三個新規則。
解決方案: 修復錯誤或停用這些規則。
相關問題: #12920
已為 RuleTester
類別新增其他驗證
RuleTester
現在會驗證下列項目:
- 如果測試中的規則使用非標準的
node.start
或node.end
屬性,則測試案例會失敗。規則應改用node.range
。 - 如果測試中的規則提供自動修正,但測試案例沒有
output
屬性,則測試案例會失敗。請將output
屬性新增至測試案例,以測試規則的自動修正功能。 - 如果
errors
屬性的物件中發現任何不明屬性,則測試案例會失敗。
解決方案: 如果現有的測試案例失敗,請修改您的規則或測試案例。
CLIEngine
類別已被棄用
CLIEngine
類別 已被棄用,並由新的 ESLint
類別取代。
CLIEngine
類別提供同步 API,這會阻礙平行檢查、在可共用設定檔/剖析器/外掛程式/格式器中支援 ES 模組,以及新增視覺化顯示檢查執行進度的功能。新的 ESLint
類別提供非同步 API,ESLint 核心現在將使用此 API。CLIEngine
在可預見的未來仍將保留在核心中,但可能會在未來的重大版本中移除。
解決方案: 如果您目前使用 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() |
(尚未實作) |
resolveFileGlobPatterns() |
(已移除 ※2) |
- ※1
engine.getFormatter()
方法目前會原封不動地傳回已載入套件的物件,這使得基於回溯相容性的考量而難以為格式器新增新功能。新的eslint.loadFormatter()
方法會傳回一個包裝已載入套件物件的配接器物件,以簡化新增新功能的流程。此外,配接器物件可以存取ESLint
執行個體,以計算預設資料(例如,使用已載入的外掛程式規則來建立rulesMeta
)。因此,ESLint
類別只實作loadFormatter()
方法的執行個體版本。 - ※2 自 ESLint 6 以來,ESLint 使用與
resolveFileGlobPatterns()
方法不同的邏輯來迭代檔案,因此此方法已過時。