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






























