新一代代碼檢查工具,比 ESLint 快 40 倍!
前言
大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~
安裝
通過 Cargo (Rust 包管理器)
$ cargo install rslint_cli
$ rslint --help預構建二進制文件 我們為每個版本發布適用于 Windows、Linux 和 MacOS 的預構建二進制文件,您可以在此處找到。
從源碼構建
$ git clone https://github.com/rslint/rslint.git
$ cd rslint
$ cargo run --release -- --help用法 要使用 linter,只需將需要檢查的文件傳遞給 CLI:
$ echo "let a = foo.hasOwnProperty('bar');" > foo.js
$ rslint ./foo.js
error[no-prototype-builtins]: 禁止直接從 `foo` 訪問對象屬性 `hasOwnProperty`
┌─ ./foo.js:1:9
│
1 │ let a = foo.hasOwnProperty('bar');
│ ^^^^^^^^^^^^^^^^^^^^^^^^^
│
幫助: 從 `Object` 的原型獲取該函數并調用它
│
1 │ let a = Object.prototype.hasOwnProperty.call(foo, 'bar');
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
│
╧ 注意: 此方法可能被遮蔽(shadowed),導致隨機錯誤和拒絕服務漏洞
結果: 1 個失敗, 0 個警告, 0 個成功
幫助: 要獲取有關錯誤的更多信息,請嘗試使用 explain 命令:`rslint explain <規則名稱>`RSLint CLI 無需配置文件即可工作,并將選擇運行推薦的非代碼風格規則。
特性
- 速度快。RSLint 利用并行性,在編譯為原生代碼的基礎上,使用多線程來加速 linting。
- 低內存占用。RSLint 的語法樹利用字符串駐留(interning)和其他方式,在 linting 時顯著減少內存使用。
- 合理的默認值。如果未指定配置文件,CLI 會假定使用推薦的非代碼風格規則,并忽略
node_modules等目錄。 - 錯誤恢復。RSLint 的自定義解析器可以從語法錯誤中恢復,即使語句的整個部分缺失,也能產生可用的語法樹。允許在您輸入時進行準確的實時 linting。
- 沒有令人困惑的選項。解析器的 ECMAScript 版本無需配置,解析器假定支持最新語法,并假定
*.js為腳本(script),*.mjs為模塊(module)。 - 原生 TypeScript 支持。自動檢查
*.ts文件,無需為不同的解析器或規則進行配置。 - 規則分組。規則按作用域分組,以便于配置、理解,并為項目提供更清晰的文件結構。
- 易于理解的錯誤信息。linter 發出的每個錯誤都以清晰易懂的方式指出源代碼中的位置,并包含標簽、注釋和建議,說明如何修復每個問題。還可以使用
-F標志或配置文件中的formatter鍵,選擇使用類似于 ESLint 格式化程序的替代格式化程序。 - 強類型的規則配置。RSLint 提供了 JSON 模式(JSON Schema)并將其鏈接到
rslintrc.json文件,以便在 Visual Studio Code 中為配置文件提供自動補全功能。JSON Schema 完整描述了規則配置選項,允許輕松配置。此外,RSLint 的語言服務器協議(LSP)實現也為rslintrc.toml文件提供了自動補全功能。 - 強大的指令。指令(通過注釋發出的命令)使用基于內部 JavaScript 詞法分析器的解析器,并帶有指令說明,這使我們能夠提供:
在語言服務器協議中為指令(如 // rslint-ignore no-empty)提供自動補全。
對指令的懸停支持,以便在懸停時提供命令信息。
對不正確指令的易于理解的錯誤信息。
- 獨立。RSLint 被編譯為單個獨立的二進制文件,它不需要 Node、v8 或任何其他運行時。RSLint 可以在 LLVM 能夠定位的任何平臺上運行。
- 強大的自動修復。為某些錯誤提供了自動修復,可以通過
--fix標志或 IDE 中的操作來應用。甚至可以通過--dirty標志在文件包含語法錯誤的情況下應用修復。 - 內置文檔。RSLint 在其二進制文件中包含了規則文檔,允許通過
explain子命令在終端中顯示文檔,例如rslint explain no-empty,for-direction。
內部特性
- 清晰明了的項目布局。RSLint 項目以單體倉庫(monorepo)形式布局,每個 crate(Rust 包)都有明確的職責,每個 crate 都可以在其他 Rust 項目中使用,并且每個 crate 都有良好的文檔和 API。
- 簡單的規則聲明。規則使用
declare_lint!宏來聲明。該宏接受文檔注釋、結構體名稱、組名稱、規則代碼和配置選項。該宏生成結構體定義和 Rule trait 的實現,并將文檔注釋處理為結構體的文檔以及每個規則的docs()方法中使用的靜態字符串。一切都很簡潔并集中在一處。 - 高保真語法樹。與 ESTree 不同,RSLint 的自定義語法樹保留了:
所有空白符
所有注釋
所有詞法標記(Token) 這使得它能夠進行強大的分析,而無需依賴諸如 ESLint 的 SourceCode 之類的單獨結構。
- 無類型語法樹。RSLint 的語法樹在底層由無類型節點和無類型詞法標記組成,這使得能夠進行強大、高效的樹遍歷,例如
if_stmt.cons()?.child_with_ast::<SwitchStmt>()。 - 簡便的 API。RSLint 為其復雜的錯誤使用了易于使用的構建器(builder),以及用于自動修復的構建器。一切的布局都旨在最大限度地減少實現規則所需的工作量。
性能
基準測試可以在 benchmarks 目錄中找到。您可以使用 deno run -A --quiet benchmarks/bench.ts 在您的機器上運行它們。它們也會在 CI 上運行,如果您點擊最新的 GitHub Actions 運行,可以看到最新結果。
項目 | RSLint | eslint |
engine262 (~42k 行 JavaScript) | 414ms | 46.9s |
Oak (~11k 行 TypeScript) | 53ms | 399ms |
(這些基準測試在 AMD Ryzen 7 2700x, 8 核心 @ 3.9MHz 上運行)






























