版本

遷移至 v7.0.0

ESLint v7.0.0 是 ESLint 的主要版本。我們在此版本中進行了一些重大變更。本指南旨在引導您了解這些重大變更。

下面的列表大致按照每個變更預計會影響的使用者數量排序,其中第一個項目預計會影響最多的使用者。

目錄

對使用者造成的重大變更

對外掛程式開發人員造成的重大變更

對整合開發人員造成的重大變更


不再支援 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 為止。

相關 issue: RFC44#12700

預設情況下,檢查符合 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 設定來預設檢查這些檔案。

相關 issue: RFC20#12677

當使用 --config/--ignore-path 選項時,overridesignorePatterns 的基本路徑已變更

到目前為止,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 選項使用設定或忽略檔案,請更新受影響的路徑。

相關 issue: RFC37#12887

外掛程式的解析已更新

在先前的版本中,ESLint 預設從目前的工作目錄解析所有外掛程式。

從 ESLint v7.0.0 開始,plugins 是相對於入口設定檔的目錄路徑解析的。

這在大多數情況下不會有任何改變。如果子目錄中的設定檔定義了 plugins,則外掛程式將從子目錄(或如果找不到,則包括目前工作目錄的父目錄)載入。

這表示如果您透過 --config 選項使用共用位置的設定檔,則設定檔宣告的外掛程式將從共用設定檔位置載入。

處理方式: 請確保外掛程式安裝在可以相對於您的設定檔解析的位置,或使用 --resolve-plugins-relative-to . 來覆寫此變更。

相關 issue: RFC47#12922

針對 ~/.eslintrc.* 設定檔的執行階段棄用警告

自從 v6.7.0 以來,個人設定檔已棄用。ESLint v7.0.0 將開始列印執行階段棄用警告。它將針對以下情況列印警告

  1. 當專案沒有設定檔,並且 ESLint 從 ~/.eslintrc.* 載入設定時。
  2. 當專案有設定檔,並且 ESLint 忽略了 ~/.eslintrc.* 設定檔時。當 $HOME 目錄是專案的父目錄,並且專案的設定檔不包含 root:true 時,就會發生這種情況。

處理方式: 移除 ~/.eslintrc.* 設定檔,並將 .eslintrc.* 設定檔新增至您的專案。或者,使用 --config 選項來使用共用設定檔。

相關 issue: RFC32#12678

預設忽略模式已變更

到目前為止,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 屬性。

相關問題: RFC51, #12888

指令註解中的描述

在舊版的 ESLint 中,沒有方便的方法可以指出為什麼需要指令註解(例如 /*eslint-disable*/)。

為了允許將提供上下文的註解與指令並列,ESLint v7.0.0 增加了在指令註解中附加任意文字的功能,方法是忽略以空白包圍的 -- 後面的文字。例如:

// eslint-disable-next-line a-rule, another-rule -- those are buggy!!

解決方案: 如果您的指令註解中包含以空白包圍的 --,請考慮將其移至設定檔中。

相關問題: RFC33, #12699

Node.js/CommonJS 規則已被棄用

核心中的十個 Node.js/CommonJS 規則已被棄用,並移至 eslint-plugin-node 外掛程式(對於 ESLint v8.0.0 及更高版本,請改用維護的 eslint-plugin-n 分支)。

解決方案: 根據我們的棄用政策,已棄用的規則在可預見的未來仍將保留在核心中,並且仍然可以使用。但是,我們將不再更新或修復這些規則中的任何錯誤。若要使用受支援版本的規則,我們建議改用外掛程式中對應的規則。

已棄用的規則 取代規則
callback-return node/callback-return
global-require node/global-require
handle-callback-err node/handle-callback-err
no-mixed-requires node/no-mixed-requires
no-new-require node/no-new-require
no-path-concat node/no-path-concat
no-process-env node/no-process-env
no-process-exit node/no-process-exit
no-restricted-modules node/no-restricted-require
no-sync node/no-sync

相關問題: #12898

多個規則已更新以涵蓋更多情況

多個規則已增強,現在會報告其他錯誤

解決方案: 修復錯誤或停用這些規則。

相關問題: #12490, #12608, #12670, #12701, #12765, #12837, #12913, #12915, #12919

eslint:recommended 已更新

eslint:recommended 預設設定檔中已啟用三個新規則。

解決方案: 修復錯誤或停用這些規則。

相關問題: #12920

已為 RuleTester 類別新增其他驗證

RuleTester 現在會驗證下列項目:

  • 如果測試中的規則使用非標準的 node.startnode.end 屬性,則測試案例會失敗。規則應改用 node.range
  • 如果測試中的規則提供自動修正,但測試案例沒有 output 屬性,則測試案例會失敗。請將 output 屬性新增至測試案例,以測試規則的自動修正功能。
  • 如果 errors 屬性的物件中發現任何不明屬性,則測試案例會失敗。

解決方案: 如果現有的測試案例失敗,請修改您的規則或測試案例。

相關問題: RFC25, #12096, #12955

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() 方法不同的邏輯來迭代檔案,因此此方法已過時。

相關問題: RFC40, #12939

變更語言