版本

架構

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 的執行環境
  • 從檔案系統讀取
  • 從設定檔(包括 .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() 或任何其他類似的方法
變更語言