代碼檢查與格式化工具介紹

code

前言

多人開發(fā)通常會(huì)有代碼風(fēng)格不統(tǒng)一的情況,使用不同的編譯器等,造成項(xiàng)目不同代碼文件風(fēng)格不一致,為了解決這個(gè)問題,出現(xiàn)了一些能自動(dòng)格式化的工具,如prettier等。

常見的語法規(guī)則和代碼風(fēng)格檢查工具有ESLint, 代碼風(fēng)格及語法規(guī)則和格式化工具Standard, 代碼格式化工具Prettier

1. ESLint

可組裝的JavaScript/JSX檢查工具,它是一個(gè)由Nicholas C. Zakas于2013年開源的一個(gè)Pluggable Linter for JavaScript/JSX.

其運(yùn)行是根據(jù)默認(rèn)規(guī)則如 ECMAScript 5 語法檢測和用戶自定義規(guī)則進(jìn)行語法檢測,可通過自定義規(guī)則及插件添加其支持的其他類型的JS,如React.js, Vue.js等。

官網(wǎng)對(duì)其的描述:

ESlint 被設(shè)計(jì)為完全可配置的,這意味著你可以關(guān)閉每一個(gè)規(guī)則而只運(yùn)行基本語法驗(yàn)證,或混合和匹配 ESLint 默認(rèn)綁定的規(guī)則和你的自定義規(guī)則,以讓 ESLint 更適合你的項(xiàng)目。

ESLint 允許你指定你想要支持的 JavaScript 語言選項(xiàng)。默認(rèn)情況下,ESLint 支持 ECMAScript 5 語法。你可以覆蓋該設(shè)置,以啟用對(duì) ECMAScript 其它版本和 JSX 的支持。

使用ESLint的流程:

  1. 首先在項(xiàng)目中或全局通過npm i -g eslint 安裝npm包。
  2. 在項(xiàng)目根目錄或全局(window默認(rèn)為C盤用戶根目錄)建立配置文件, 以.eslintrc開頭,比如.eslintrc.json或.eslintrc.js等。
  3. 通過命令行使用 eslint filename將會(huì)對(duì)文件進(jìn)行檢測,支持正則表達(dá)式,對(duì)于發(fā)現(xiàn)的錯(cuò)誤可以使用eslint --fix進(jìn)行部分修復(fù)。
  4. 與IDE的集成,通常我們都是直接通過IDE,如VSCode結(jié)合插件進(jìn)行代碼語法及風(fēng)格實(shí)時(shí)檢測。
    以VSCode為例,需要在Extensions中安裝ESLint插件,可以通過VSCode的setting.json進(jìn)行ESLint規(guī)則配置,也可以在setting.json中指定要使用的配置文件.eslintrc.*地址。

配置詳解

有兩種主要的方式來配置 ESLint:

  1. Configuration Comments - 使用 JavaScript 注釋把配置信息直接嵌入到一個(gè)代碼源文件中。
  2. Configuration Files - 使用 JavaScript、JSON 或者 YAML 文件為整個(gè)目錄(處理你的主目錄)和它的子目錄指定配置信息??梢耘渲靡粋€(gè)獨(dú)立的 .eslintrc.* 文件,或者直接在 package.json 文件里的 eslintConfig 字段指定配置,ESLint 會(huì)查找和自動(dòng)讀取它們,再者,你可以在命令行運(yùn)行時(shí)指定一個(gè)任意的配置文件。

如果你在你的主目錄(通常 ~/)有一個(gè)配置文件,ESLint 只有在無法找到其他配置文件時(shí)才使用它。

配置信息:

  • Environments - 指定腳本的運(yùn)行環(huán)境。每種環(huán)境都有一組特定的預(yù)定義全局變量。
  • Globals - 腳本在執(zhí)行期間訪問的額外的全局變量。
  • Parser - 指定解析器,如使用babel-eslint對(duì)新的JS語法進(jìn)行支持。解析器需要通過npm進(jìn)行安裝。
  • Plugins - 配置第三方插件,如react, vue,可以省略eslint-plugin前綴
{
    "plugins": [
        "vue"
    ]
}

注意:由于 Node.js 的 require 函數(shù)的行為,全局安裝的 ESLint 實(shí)例只能使用全局安裝的 ESLint 插件,本地安裝的版本,只能用 本地安裝 的插件。不支持混合本地和全局插件。

  • Rules - 啟用的規(guī)則及其各自的錯(cuò)誤級(jí)別,可添加自定義規(guī)則。

ESLint 附帶有大量的規(guī)則。你可以使用注釋或配置文件修改你項(xiàng)目中要使用的規(guī)則。

要改變一個(gè)規(guī)則設(shè)置,你必須將規(guī)則 ID 設(shè)置為下列值之一:

  1. "off" 或 0 - 關(guān)閉規(guī)則
  2. "warn" 或 1 - 開啟規(guī)則,使用警告級(jí)別的錯(cuò)誤:warn (不會(huì)導(dǎo)致程序退出)
  3. "error" 或 2 - 開啟規(guī)則,使用錯(cuò)誤級(jí)別的錯(cuò)誤:error (當(dāng)被觸發(fā)的時(shí)候,程序會(huì)退出)

對(duì)不想讓eslint進(jìn)行規(guī)則檢測的js代碼可以用以下方式進(jìn)行注釋

/* eslint-disable no-alert, no-console  */

alert('foo');

/* eslint-enable no-alert, no-console  */

alert('foo'); // eslint-disable-line

// eslint-disable-next-line
alert('foo');

/* eslint-disable-next-line */
alert('foo');

alert('foo'); /* eslint-disable-line */

如果在整個(gè)文件范圍內(nèi)禁止規(guī)則出現(xiàn)警告,將 /* eslint-disable */ 塊注釋放在文件頂部:

所有這些選項(xiàng)讓你可以細(xì)粒度地控制 ESLint 如何對(duì)待你的代碼。

  • Extends -遞歸擴(kuò)展規(guī)則

一個(gè)配置文件可以被基礎(chǔ)配置中的已啟用的規(guī)則繼承。
extends 屬性值可以是:

  1. 在配置中指定的一個(gè)字符串
  2. 字符串?dāng)?shù)組:每個(gè)配置繼承它前面的配置
    ESLint 遞歸地進(jìn)行擴(kuò)展配置,所以一個(gè)基礎(chǔ)的配置也可以有一個(gè) extends 屬性。

此外eslint也可以擴(kuò)展插件中的配置:
extends 屬性值可以由以下組成:

  • plugin:
  • 包名 (省略了前綴,比如,react)
  • /
  • 配置名稱 (比如 recommended)
{
    "plugins": [
        "react"
    ],
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended"
    ],
    "rules": {
       "no-set-state": "off"
    }
2. Standard

主要用于統(tǒng)一JavaScript代碼風(fēng)格,集成常見配置,無須編寫配置文件,只要全局安裝或局部安裝后通過CLI進(jìn)行代碼檢查及自動(dòng)修復(fù)。

以下是官方的介紹:

無須配置。 史上最便捷的統(tǒng)一代碼風(fēng)格的方式,輕松擁有。
自動(dòng)代碼格式化。 只需運(yùn)行 standard --fix 從此和臟亂差的代碼說再見。
提前發(fā)現(xiàn)風(fēng)格及程序問題。 減少代碼審查過程中反反復(fù)復(fù)的修改過程,節(jié)約時(shí)間。
無須猶豫。再也不用維護(hù) .eslintrc, .jshintrc, or .jscsrc 。開箱即用。

Standard規(guī)則檢查細(xì)則

  • 使用兩個(gè)空格 – 進(jìn)行縮進(jìn)

  • 字符串使用單引號(hào) – 需要轉(zhuǎn)義的地方除外

  • 不再有冗余的變量 – 這是導(dǎo)致 大量 bug 的源頭!

  • 無分號(hào)沒什么不好。不騙你!

  • 行首不要以 (, [, or ``` 開頭

  • 關(guān)鍵字后加空格 if (condition) { ... }

  • 函數(shù)名后加空格 function name (arg) { ... }

  • 堅(jiān)持使用全等 === 摒棄 == 一但在需要檢查 null || undefined 時(shí)可以使用 obj == null。

  • 處理 Node.js 中錯(cuò)誤回調(diào)傳遞進(jìn)來的 err 參數(shù)。

  • 使用瀏覽器全局變量時(shí)加上 window 前綴

  • 查看更多

Code Linter.png

來源

此外也可集成到VSCode等IDE中,安裝standard插件,配置eslint使用standard的代碼風(fēng)格檢查規(guī)則。

eslint類似一個(gè)平臺(tái),用于檢測和報(bào)告信息,而檢測的標(biāo)準(zhǔn)規(guī)則都是可以自定義的。Standard則包含javascript standard代碼風(fēng)格規(guī)則及自動(dòng)格式化功能,對(duì)ESLint擴(kuò)展,其也可以進(jìn)行配置,使用eslint-plugin, 如在package.json中

{
  "standard": {
    "parser": "typescript-eslint-parser",
    "plugins": [ "typescript" ]
  }
}
3. Prettier

Prettier僅僅是代碼格式化工具,它會(huì)移除所有你的代碼風(fēng)格,然后根據(jù)它的編碼風(fēng)格如換行標(biāo)準(zhǔn),最大長度等,從0開始打印出新的,其不僅支持JS,還支持HTML/CSS。

其僅僅專注于代碼格式化,對(duì)代碼質(zhì)量檢測規(guī)則不做保證和檢測,以下是官方的說明

How does it compare to ESLint/TSLint/stylelint, etc.?

Linters have two categories of rules:

Formatting rules: eg: max-len, no-mixed-spaces-and-tabs, keyword-spacing, comma-style...

Prettier alleviates the need for this whole category of rules! Prettier is going to reprint the entire program from scratch in a consistent way, so it's not possible for the programmer to make a mistake there anymore :)

Code-quality rules: eg no-unused-vars, no-extra-bind, no-implicit-globals, prefer-promise-reject-errors...

Prettier does nothing to help with those kind of rules. They are also the most important ones provided by linters as they are likely to catch real bugs with your code!

Prettier配置主要是縮進(jìn),換行,分號(hào),單引號(hào)等信息,可以在其以下配置文件中進(jìn)行配置。

  1. prettierrc file, written in YAML or JSON, with optional extensions: .yaml/.yml/.json.
  2. prettierrc.toml file, written in TOML (the .toml extension is required).
  3. prettier.config.js or .prettierrc.js file that exports an object.
  4. "prettier" key in your package.json file.

Prettier可以與ESLint一起使用,只需安裝eslint-plugin-prettier,對(duì)Vue的SFC支持,僅需在.eslintrc.*的extends中添加 "plugin:prettier/recommended",
可參考

module.exports = {
  "root": true,
  "extends": [
    "plugin:vue/essential",
    "plugin:prettier/recommended",
    "eslint:recommended"
  ],
}
//https://alligator.io/vuejs/vue-eslint-prettier/
//https://www.futurehosting.com/blog/prettier-vs-eslint-whats-the-difference/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,697評(píng)論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,855評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,473評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,014評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,833評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,016評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,273評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評(píng)論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,730評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,006評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容