更新版-梳理前端開發(fā)使用eslint和prettier來檢查和格式化代碼問題

更新版裕菠,之前的版本可以看這里:梳理前端開發(fā)使用eslint和prettier來檢查和格式化代碼問題

一山涡、問題痛點(diǎn)

  • 在團(tuán)隊(duì)的項(xiàng)目開發(fā)過程中幻碱,代碼維護(hù)所占的時(shí)間比重往往大于新功能的開發(fā)狂秦。因此編寫符合團(tuán)隊(duì)編碼規(guī)范的代碼是至關(guān)重要的蚯涮,這樣做不僅可以很大程度地避免基本語(yǔ)法錯(cuò)誤坯临,也保證了代碼的可讀性焊唬。
  • 對(duì)于代碼版本管理系統(tǒng)(svn 和 git或者其他)恋昼,代碼格式不一致帶來的問題是嚴(yán)重的看靠,在代碼一致的情況下,因?yàn)楦袷讲煌杭。|發(fā)了版本管理系統(tǒng)標(biāo)記為 diff挟炬,導(dǎo)致無法檢查代碼和校驗(yàn)。

但是需要知道的是嗦哆,開發(fā)規(guī)范不僅僅包含代碼格式規(guī)范谤祖,還有很多內(nèi)容,這里只是單獨(dú)說明代碼格式化規(guī)范而已老速。

(一)關(guān)于代碼格式規(guī)范問題

代碼格式規(guī)范的標(biāo)準(zhǔn)可以參考各大主流公司和社區(qū)粥喜,以下都是一些常用主流規(guī)范:

參考別人的規(guī)范,制定適合自己團(tuán)隊(duì)使用的規(guī)范旁舰,太過復(fù)雜的規(guī)范執(zhí)行起來太麻煩锋华,太過簡(jiǎn)單的規(guī)范不如沒有規(guī)范。

沒有絕對(duì)的規(guī)范箭窜,只有適合的規(guī)范毯焕!

(二)關(guān)于為什么要用 eslint 和 prettier問題

  • prettier 主要是為了格式化代碼,而在沒有 prettier 之前磺樱,是用 eslint —fix和 編輯器自帶代碼格式來進(jìn)行代碼格式化的纳猫。
    • 缺點(diǎn):每種編輯器會(huì)有不一樣的代碼格式,而且配置會(huì)比較麻煩竹捉。
    • prettier 已經(jīng)逐漸成為業(yè)界主流的代碼風(fēng)格格式化工具芜辕。
    • 減輕 eslint 等工具的校驗(yàn)規(guī)則,因?yàn)閷⒋a樣式校驗(yàn)交給了 prettier活孩,所以可以將代碼校驗(yàn)的規(guī)則更準(zhǔn)確地應(yīng)用到代碼真正的規(guī)范上面物遇。
  • eslint 是主要還是負(fù)責(zé)代碼規(guī)則校驗(yàn),prettier 只調(diào)整代碼風(fēng)格憾儒,代碼樣式询兴,eslint 才是真正檢查代碼是否符合規(guī)范的工具。

所以兩者是需要配合使用的起趾。

二诗舰、解決辦法

舊有的解決辦法是:

  • 使用 editorconfig 協(xié)助兼容開發(fā)工具的代碼格式化。
  • 使用 eslint 檢查代碼
  • 使用 eslint —fix來修復(fù)不符合 eslint 規(guī)則的代碼训裆,它會(huì)自動(dòng)根據(jù)設(shè)置的規(guī)則來改變代碼(它會(huì)包含代碼樣式的規(guī)則眶根,但是 eslint 的樣式規(guī)則并不太準(zhǔn)確)蜀铲。
  • 手動(dòng)修改剩下的有問題的地方,或者有些地方很難用規(guī)則來判斷的時(shí)候属百,就需要手動(dòng)修改记劝。

新的解決辦法是:

  • 使用 editorconfig 協(xié)助兼容開發(fā)工具的代碼格式化。
  • 使用 eslint 檢查代碼族扰。
  • 使用 prettier 格式化代碼厌丑。(可以理解為prettier是 eslint —fix 的加強(qiáng)版,用 prettier 來代替 eslint-fix
  • 手動(dòng)修改剩下的有問題的地方渔呵,或者有些地方很難用規(guī)則來判斷的時(shí)候怒竿,就需要手動(dòng)修改。

咋一看扩氢,其實(shí)沒啥區(qū)別耕驰,甚至可能發(fā)現(xiàn)新解決辦法會(huì)更加麻煩了一些,其實(shí)步驟上確實(shí)如此录豺,但是真正操作上朦肘,會(huì)減輕 eslint 的規(guī)則編寫,也會(huì)減少很多手動(dòng)修改樣式的地方巩检,格式化后的代碼會(huì)更加美觀厚骗,耐看。

三兢哭、具體操作

鑒于網(wǎng)上文章說明的比較混亂领舰,這里主要是為了梳理整個(gè)流程和思路。

大綱

  1. 統(tǒng)一團(tuán)隊(duì)使用的開發(fā)工具(webstorm迟螺,ide 編輯器)
  2. 安裝 eslint 和 prettier (node 模塊)
  3. 安裝 eslint 和 prettier ( ide 編輯器的插件)
  4. 配置 eslint 和 prettier
  5. 配置 editorconfig (可選)
  6. 嚴(yán)格督查冲秽,按照流程檢查和格式化代碼,按照規(guī)范和要求進(jìn)行代碼提交矩父。

這里多了一步是安裝 eslint 和 prettier ( ide 編輯器的插件)锉桑,主要就是利用 ide 編輯器做代碼格式錯(cuò)誤提醒和代碼格式處理,這個(gè)操作也可以使用 webpack 打包的時(shí)候來做窍株,也可以使用 gulp 或者 npm 來做民轴,但這里借助編輯器會(huì)更方便。

(一)統(tǒng)一團(tuán)隊(duì)使用的開發(fā)工具(webstorm球订,ide 編輯器)

開發(fā)工具可以做很多東西后裸,是開發(fā)代碼的利器,但是不同的開發(fā)工具會(huì)有不同的代碼提示冒滩,代碼格式化微驶,代碼檢查的機(jī)制,這樣的差異化會(huì)對(duì)團(tuán)隊(duì)代碼規(guī)范(開發(fā)和檢查)帶來很多問題,所以需要統(tǒng)一因苹。

當(dāng)然苟耻,如果個(gè)人不愿意更換自己用慣的開發(fā)工具的話,也沒關(guān)系扶檐,只要能夠做到跟團(tuán)隊(duì)的開發(fā)規(guī)范保持一致也是可以的凶杖,但個(gè)人覺得,這樣難度比較大蘸秘,畢竟開發(fā)工具和團(tuán)隊(duì)的開發(fā)規(guī)范不那么容易融合官卡。

這里只說明前端業(yè)界目前最常用的開發(fā)工具來做例子 webstorm 。

(二)安裝 eslint 和 prettier (node 模塊)

安裝這個(gè)模塊的意義在于醋虏,實(shí)際上,整個(gè)流程最核心就是這個(gè)地方哮翘,開發(fā)工具雖然支持了這2個(gè)模塊颈嚼,但是最終運(yùn)行是必須要以這2個(gè)模塊安裝好才能使用的。

// 這里需要全局安裝最主要的兩個(gè)node 模塊饭寺,主要是要讓 ide 編輯器能夠讀取全局環(huán)境來調(diào)用這2個(gè)模塊
npm install eslint prettier -g --save-dev

// 這個(gè)是為了 eslint 跟 prettier 可以聯(lián)合使用
npm install --save-dev eslint-plugin-prettier
// 這個(gè)是為了讓 eslint 跟 prettier 兼容阻课,關(guān)閉 prettier 跟 eslint 沖突的rules
npm install --save-dev eslint-config-prettier

補(bǔ)充備注:

  • eslint-config-prettier :
    • 這個(gè)插件是如果eslint的規(guī)則和prettier的規(guī)則發(fā)生沖突的時(shí)候(主要是不必要的沖突),例如eslint 限制了必須單引號(hào)艰匙,prettier也限制了必須單引號(hào)限煞,那么如果用 eslint 驅(qū)動(dòng) prettier 來做代碼檢查的話,就會(huì)提示2種報(bào)錯(cuò)员凝,雖然他們都指向同一種代碼錯(cuò)誤署驻,這個(gè)時(shí)候就會(huì)由這個(gè)插件來關(guān)閉掉額外的報(bào)錯(cuò)。
    • 但如果是eslint 只負(fù)責(zé)檢測(cè)代碼健霹,prettier 只負(fù)責(zé)格式化代碼旺上,那么他們之間互不干擾,也就是說糖埋,也是可以不安裝這個(gè)插件的宣吱,但是因?yàn)閳F(tuán)隊(duì)的人員的差異性(即使同一個(gè)開發(fā)工具也有版本差異,也有使用 prettier 和 eslint 的差異)瞳别,可能有存在各種情況征候,所以最好還是安裝上這個(gè)插件。
    • 官方有詳細(xì)介紹:GitHub - prettier/eslint-config-prettier: Turns off all rules that are unnecessary or might conflict with Prettier.

模塊參考信息:Integrating with ESLint · Prettier

以下順便說一下其他我們常用到的eslint 模塊:

nam -g install babel-eslint eslint-plugin-html --save-dev
  • babel-eslint :
    • 有些代碼是沒被 eslint 支持的(因?yàn)?babel 也是負(fù)責(zé)這種事情祟敛,轉(zhuǎn)譯不被支持的 js 語(yǔ)法)疤坝,所以需要加上這個(gè)插件來保持兼容性。
    • 官方有詳細(xì)介紹:https://github.com/babel/babel-eslint
  • eslint-plugin-html:
    • 為了讓eslint 可以檢查.vue文件的代碼垒棋。

(三)安裝webstorm 的eslint 插件和 prettier 插件并啟用插件

更多配置方式參考:WebStorm Setup · Prettier

根據(jù)官方介紹webstorm 分別有2種處理:

  1. WebStorm 2018.1 和以上的版本
  2. WebStorm 2017.3 和更早的版本

如果用IntelliJ IDEA, PhpStorm, PyCharm, and other JetBrains IDEs, 則需要安裝prettier插件和 eslint 插件卒煞,而webstorm 的話默認(rèn)會(huì)幫你安裝上,這也是推薦 webstorm 的原因叼架。

1. WebStorm 2018.1 和以上的版本

官方默認(rèn)已經(jīng)集成了 prettier 支持畔裕,只需要配置好一個(gè)全局的 prettier 模塊調(diào)用方式就可以使用了(必須配置)衣撬。

image.png

快捷鍵是:Alt-Shift-Cmd-P on macOS or Alt-Shift-Ctrl-P on Windows and Linux

氪金王的好處,升級(jí)快扮饶,支持快具练,免破解,省心省力不省錢甜无!

2. WebStorm 2017.3 和更早的版本

這個(gè)版本有2種情況:

  • ①是eslint 模式扛点,使用 eslint-plugin-prettier 插件和啟用eslint 插件配合,這里相當(dāng)于使用 eslint 模塊來驅(qū)動(dòng) prettier 模塊岂丘,然后中間驅(qū)動(dòng)則是靠eslint-plugin-prettier陵究。

首先啟用 eslint,并且配置 eslint 模塊位置奥帘,默認(rèn)會(huì)自動(dòng)讀取當(dāng)前目錄的 eslint.rc 配置文件铜邮,然后需要進(jìn)行 npm 安裝eslint-plugin-prettier這個(gè)插件,后面再統(tǒng)一說明寨蹋。

image.png

  • ②是直接使用 prettier 作為額外工具來使用松蒜。


    image.png
image.png

上面兩種方式的默認(rèn)快捷鍵都是Cmd/Ctrl-Shift-A(在 mac 下是comm+shift+A),覺得不舒服已旧,按需修改快捷鍵即可秸苗。

image.png

(三) 配置 eslint 插件和 prettier插件

1. eslint 的配置

eslint 的檢查規(guī)則是通過配置文件.eslintrc 實(shí)現(xiàn)的,但是各家有各家的 eslint 配置文件GitHub - AlloyTeam/eslint-config-alloy: AlloyTeam ESLint 規(guī)則

image.png

詳細(xì)參考網(wǎng)址:

不過這里不糾結(jié)用哪一種 eslint 的配置运褪,具體看項(xiàng)目和團(tuán)隊(duì)惊楼,這里只是說明需要做 eslint 的配置,并且需要做一些說明:

.eslintrc 配置文件需要添加修改地方吐句,主要是為了 prettier插件和eslint-config-prettier 插件和eslint-plugin-prettier插件使用的:

// 因?yàn)槭褂昧?eslint 和 prettier胁后,所以要加上他們
extends: [ 'eslint:recommended', 'plugin:prettier/recommended'],

// required to lint *.vue files 使用 html參數(shù)
plugins: ['html', 'prettier'],

// rules 規(guī)則就按照各家寫法。

在 webstorm 下嗦枢,在項(xiàng)目根目錄.eslintrc作為配置文件攀芯。

2. prettier的配置

prettier 的檢查規(guī)則是通過配置文件.prettierrc 實(shí)現(xiàn)的,不過一般來說文虏,只需要配置少部分規(guī)則即可:.

{
  "printWidth": 100,
  "singleQuote": true, 
  "semi": false 
}

有可能會(huì)出現(xiàn)的情況是侣诺,prettier 格式化后,全部加了分號(hào)氧秘,但是 eslint 又要去掉分號(hào)年鸳,那么就會(huì)重復(fù)了,這里可以簡(jiǎn)單地設(shè)置 prettier 的分號(hào)設(shè)置跟 eslint 保持一致丸相,其他如此類推搔确,但只適用在幾個(gè)比較特別的地方,可以參考官方文檔。官方有詳細(xì)的介紹:Configuration File · Prettier

(四) 配置 editorconfig

  • EditorConfig可以幫助開發(fā)者在不同的編輯器和IDE之間定義和維護(hù)一致的代碼風(fēng)格膳算。
  • EditorConfig包含一個(gè)用于定義代碼格式的文件和一批編輯器插件座硕,這些插件可以讓編輯器讀取配置文件并依此格式化代碼。

對(duì)此我個(gè)人的理解就是涕蜂,editorconfig可以協(xié)助開發(fā)工具在自動(dòng)格式化或者自動(dòng)排版或者錄入排版的時(shí)候進(jìn)行代碼格式化华匾,但是只能支持比較簡(jiǎn)單的規(guī)則,不過也減輕了一部分代碼格式化的壓力和成本机隙,所以有比沒有好蜘拉,而且最好要有。

// 放在項(xiàng)目根目錄的.editorconfig文件
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

詳細(xì)參考:

(五) 嚴(yán)格督查有鹿,按照流程檢查和格式化代碼旭旭,按照規(guī)范和要求進(jìn)行代碼提交。

需要明確一點(diǎn)印颤,代碼格式化需要由上而下執(zhí)行您机,如果沒有強(qiáng)制性壓力督促,那么是對(duì)抗不了人類的惰性的年局。

整個(gè)代碼檢查和格式化流程應(yīng)該規(guī)范為如下步驟:

  1. 使用eslint 并且嘗試自動(dòng)修復(fù)所有問題(eslint 有 autofix 提示,可以進(jìn)行—fix 修復(fù)咸产,按照 .eslintrc 配置文件來進(jìn)行修復(fù))矢否。
  2. 使用 prettier 格式化所有代碼。
  3. 差異性修復(fù)代碼脑溢,因?yàn)橛行└袷交蛘咂渌麊栴}導(dǎo)致出錯(cuò)而被前兩部過濾之后還剩余的僵朗。(通常前面兩步基本解決了所有問題了)
  4. 把精美的格式化后的代碼提交到版本庫(kù)。

參考文檔:


本文轉(zhuǎn)載自我的 blog:更新版 - 梳理前端開發(fā)使用 eslint 和 prettier 來檢查和格式化代碼問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屑彻,一起剝皮案震驚了整個(gè)濱河市验庙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌社牲,老刑警劉巖粪薛,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搏恤,居然都是意外死亡违寿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門熟空,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藤巢,“玉大人,你說我怎么就攤上這事息罗〉嘀洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绍刮。 經(jīng)常有香客問我温圆,道長(zhǎng),這世上最難降的妖魔是什么录淡? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任捌木,我火速辦了婚禮,結(jié)果婚禮上嫉戚,老公的妹妹穿的比我還像新娘刨裆。我一直安慰自己,他們只是感情好彬檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布帆啃。 她就那樣靜靜地躺著,像睡著了一般窍帝。 火紅的嫁衣襯著肌膚如雪努潘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天坤学,我揣著相機(jī)與錄音疯坤,去河邊找鬼。 笑死深浮,一個(gè)胖子當(dāng)著我的面吹牛压怠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播飞苇,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼菌瘫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了布卡?” 一聲冷哼從身側(cè)響起雨让,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忿等,沒想到半個(gè)月后栖忠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡这弧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年娃闲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾浪。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皇帮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛋辈,到底是詐尸還是另有隱情属拾,我是刑警寧澤将谊,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站渐白,受9級(jí)特大地震影響尊浓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纯衍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一栋齿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧襟诸,春花似錦瓦堵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至陷揪,卻和暖如春惋鸥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悍缠。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工卦绣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飞蚓。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓迎卤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玷坠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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