架構
在高階層次上,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
的執行環境 - 從檔案系統讀取
- 從設定檔(包括
.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()
或任何其他類似的方法