版本

架構

dependency graph

在高階層次上,ESLint 有幾個主要部分

  • bin/eslint.js - 這是實際使用命令列工具執行的檔案。它是一個簡單的包裝器,除了引導 ESLint,將命令列引數傳遞給 cli 之外,什麼也不做。這有意設計得很小,以避免需要大量的測試。
  • lib/api.js - 這是 require("eslint") 的進入點。此檔案公開一個物件,其中包含公用類別 LinterESLintRuleTesterSourceCode
  • lib/cli.js - 這是 ESLint CLI 的核心。它接受一個引數陣列,然後使用 eslint 執行命令。透過將其作為一個獨立的工具,它允許其他人有效地從另一個 Node.js 程式中呼叫 ESLint,就像在命令列上完成一樣。主要呼叫是 cli.execute()。這也是執行所有檔案讀取、目錄遍歷、輸入和輸出的部分。
  • lib/cli-engine/ - 這個模組是 CLIEngine 類別,它尋找原始碼檔案和設定檔,然後使用 Linter 類別進行程式碼驗證。這包括設定檔、解析器、外掛程式和格式器的載入邏輯。
  • lib/linter/ - 這個模組是核心 Linter 類別,它根據設定選項進行程式碼驗證。此檔案不執行任何檔案 I/O,也不與 console 互動。對於其他具有要驗證的 JavaScript 文字的 Node.js 程式,它們可以直接使用此介面。
  • lib/rule-tester/ - 這個模組是 RuleTester 類別,它是 Mocha 的包裝器,以便可以對規則進行單元測試。這個類別讓我們可以為每個實作的規則編寫格式一致的測試,並確信每個規則都能運作。RuleTester 介面是仿照 Mocha 建模的,並且與 Mocha 的全域測試方法一起運作。RuleTester 也可以修改為與其他測試框架一起運作。
  • lib/source-code/ - 這個模組是 SourceCode 類別,用於表示已解析的原始碼。它接收原始碼和代表程式碼的 AST 的 Program 節點。
  • lib/rules/ - 這個目錄包含驗證原始碼的內建規則。

cli 物件

cli 物件是命令列介面的 API。實際上,bin/eslint.js 檔案只是將引數傳遞給 cli 物件,然後將 process.exitCode 設定為傳回的結束代碼。

主要方法是 cli.execute(),它接受一個字串陣列,表示命令列選項(如同傳遞了沒有前兩個引數的 process.argv)。如果您想從另一個程式內部執行 ESLint,並使其表現得像 CLI 一樣,那麼 cli 就是要使用的物件。

此物件的職責包括

  • 解譯命令列引數。
  • 從檔案系統讀取。
  • 輸出到主控台。
  • 輸出到檔案系統。
  • 使用格式器。
  • 傳回正確的結束代碼。

此物件可能不會

  • 直接呼叫 process.exit()
  • 執行任何非同步操作。

CLIEngine 物件

CLIEngine 類型代表 CLI 的核心功能,除了它不從命令列讀取任何內容,預設情況下也不輸出任何內容。相反,它接受許多(但不是全部)傳遞到 CLI 的引數。它讀取設定檔和原始碼檔案,並管理傳遞到 Linter 物件的環境。

CLIEngine 的主要方法是 executeOnFiles(),它接受要執行 linter 的檔案和目錄名稱陣列。

此物件的職責包括

  • 管理 Linter 的執行環境。
  • 從檔案系統讀取。
  • 從設定檔(包括 .eslintrcpackage.json)讀取設定資訊。

此物件可能不會

  • 直接呼叫 process.exit()
  • 執行任何非同步操作。
  • 輸出到主控台。
  • 使用格式器。

Linter 物件

Linter 物件的主要方法是 verify(),它接受兩個引數:要驗證的原始文字和設定物件(給定設定檔加上命令列選項的烘焙設定)。該方法首先使用 espree(或任何設定的解析器)解析給定的文字,並檢索 AST。AST 是使用行/列和範圍位置產生的,這對於報告問題的位置和檢索與 AST 節點相關的原始文字非常有用。

一旦 AST 可用,estraverse 就用於從上到下遍歷 AST。在每個節點,Linter 物件都會發出一個事件,該事件的名稱與節點類型相同(即,“Identifier”、“WithStatement” 等)。在返回子樹的路上,會發出一個事件,其中包含 AST 類型名稱並附加了“:exit”後綴,例如“Identifier:exit” - 這允許規則在遍歷的向下和向上方向都採取動作。每個事件都會發出,並提供適當的 AST 節點。

此物件的職責包括

  • 檢查 JavaScript 程式碼字串。
  • 為程式碼建立 AST。
  • 在 AST 上執行規則。
  • 回報執行的結果。

此物件可能不會

  • 直接呼叫 process.exit()
  • 執行任何非同步操作。
  • 使用 Node.js 特定功能。
  • 存取檔案系統。
  • 呼叫 console.log() 或任何其他類似方法。

規則

個別規則是 ESLint 架構中最專業化的部分。規則可以做的事情很少,它們只是一組針對提供的 AST 執行的指令。它們確實獲得了一些傳遞的上下文資訊,但規則的主要職責是檢查 AST 並報告警告。

這些物件的職責是

  • 檢查 AST 以尋找特定模式。
  • 在找到特定模式時報告警告。

這些物件可能不會

  • 直接呼叫 process.exit()
  • 執行任何非同步操作。
  • 使用 Node.js 特定功能。
  • 存取檔案系統。
  • 呼叫 console.log() 或任何其他類似方法。
變更語言