架構
在高階層次上,ESLint 有幾個主要部分
bin/eslint.js
- 這是實際使用命令列工具執行的檔案。它是一個簡單的包裝器,除了引導 ESLint,將命令列引數傳遞給cli
之外,什麼也不做。這有意設計得很小,以避免需要大量的測試。lib/api.js
- 這是require("eslint")
的進入點。此檔案公開一個物件,其中包含公用類別Linter
、ESLint
、RuleTester
和SourceCode
。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
的執行環境。 - 從檔案系統讀取。
- 從設定檔(包括
.eslintrc
和package.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()
或任何其他類似方法。