【JavaScript】ESlint & Prettier & Flow組合,得此三神助,混沌歸太清
阿新 • • 發佈:2019-09-07
Flow
Flow的意義
Flow是faceBook開源的一個JavaScript靜態型別檢查工具,作用類似TypeScript,但是它不像TS那樣是一門獨立的語言,而是作為一個babel-plugin,藉助babel的編譯切入JavaScript的編碼當中,同時,與ts不同的是,Flow.js的型別檢查不是強制的,可以通過//@flow手動開啟,意味著,你可以自由選擇某個檔案是否開啟型別檢查。 Flow真是眼前一亮,我就想,TypeScript挺好的,但或許也給人帶來了一些煩惱,一旦用了TS,就意味著任何時候都要強制型別檢查,我覺得,選擇JavaScript還是TypeScript就變成了這樣一個問題:我們手頭1000元,我們到底是買一件一萬元的比較喜歡的還耐用的衣服呢?還是買一件很便宜但是又不耐用的地攤貨呢?(耐用指的是維護性),但Flow幫我們找到了折中方案:型別檢查這東西,我們在想用和需要用的時候用,同時不想用也可以不用,就好比就是手裡有1000塊,那我們就剛好去買1000塊錢的衣服Flow的使用
//@flow //數字 functionflow1(x:number){ console.log(x); } flow1(2); //字串 functionflow2(x:string){ console.log(x); } flow2("xxx"); //可選引數 functionflow3(x:?string){ console.log(x); } flow3(); //多個值 functionflow4(x:"a"|"b"|"c"){ console.log(x); } flow3("a"); //任意值 functionflow5(y:any){ console.log(y); } flow3("a"); //陣列 let arr:Array<boolean>=[true,false,true];
Flow的優點
- 自由和[可選]的型別檢查風格
- 輕量化的型別檢查,滿足一些基本要求,同時容易學習上手
- 藉助babel,webpack整合到JS程式碼中,在當今前端社群中,這種方式非常容易被大家所理解和接受,同時也容易整合到已有的專案中
Flow的缺點
這傢伙簡直和JS一毛一樣,既有有好用的優點,同時呢,卻也有一些明顯的缺點。- 編輯器或IDE整合度低,比如,比如基本的變數提示功能
- 社群力量較弱,庫的數量較少
- 庫的型別定義質量不高,無法完全滿足開發需求
- FacebookFlow團隊的roadmap也並不是很清楚
Flow的安裝(Webpack整合)
(注意⚠️:你需要確保你有一個可執行的webpack配置,同時在module.rules配置項中引入了babel-loader解析所有js檔案)
過程- 下載VScode擴充套件外掛:FlowLanguageSupport,以在IDE中支援
- 安裝plugin-transform-flow-strip-types外掛,執行以下命令
npm install @babel/plugin-transform-flow-strip-types4. 建立.babelrc檔案,寫入以下配置
{ "plugins":[ "transform-flow-strip-types" ] }5. 執行以下命令,安裝flow命令列
npm install -g flow-bin
6. 在每次啟動專案前都檢查Flow是否有報錯,例如我就在在啟動指令碼中新增如下語句,它每次會先檢查flow有沒有報錯,然後才用Node啟動專案
"scripts":{ "start":"flow check src && node ./server.js", }7. 編寫flow程式碼吧!!但是你需要給當前檔案加上//@flow,如果不加,那麼flowcheck將不做檢查
//@flow functionflow1(x:number){ console.log(x); } //flow函式 flow1(2); //普通函式 functioncommon(a){ console.log(a); } common(1);
執行示例
執行 flow check src檢測src下的執行情況 型別匹配,無錯誤 型別不匹配,報錯(要求數字但傳入了字串)Prettier
prettier的意思是漂亮的,但其實我覺得,“美化程式碼”並不是它的核心功能,它的核心功能是“統一程式碼規範”(當然了,是用漂亮的規範去統一哈哈)。長久以來,團隊建設的一個重點要求就是”讓幾十個人寫的程式碼看上去是一個人寫的“。倘若如此,團隊協作,程式碼維護能力便大大增強。Prettier是完成這一豐功偉績的功臣。 Prettier是用來規範程式碼風格的,一些IDE比如VScode可以給我們提供程式碼格式化的功能,但是這種功能仍然有限。Prettier則提供了相當完善的程式碼風格規範。 試看—— A:我就喜歡這樣寫!!import {A,B,C,D,E} from‘lib’B: 我建議啊,應該這樣寫
import{ A, B, C, D, E } from ‘lib’A:你寫的不夠大氣! B:你寫的不夠簡潔! (互懟時刻即將開啟) Prettier和事佬:好了好了,兩位英雄莫相爭執,且聽我的!你們都寫成我這樣就得了! A,B:好,那咱就這麼辦
如何使用Prettier
- 在VScode上下載Prettier擴充套件外掛,最好把編輯器重啟一下。然後儲存時就可以自動格式化了
- 根據官網上的指示進行操作,下面這個講的是如何從Eslint上整合Prettier Integrating with Linters · Prettier
- 其實一般情況下,有VScode的Prettier外掛就足夠指導開發了,如果你想一次性把全部JS/JSX檔案全部格式化一遍,可以這樣,在根目錄下執行:
yarn prettier --write './src/**/*.js' './src/**/*.jsx’
執行示例
右邊是格式化後的ESlint
ESlint這種和我們朝夕相處的夥伴就不必過多解釋了吧,它的作用是做一些靜態檢查,對於一些可能在JS執行時候才會報的錯誤立即檢測出來。ESlint的使用
- 在VScode上下載Eslint擴充套件外掛,最好把編輯器重啟一下
- 設定Eslint這個VScode擴充套件外掛的AutoFix功能,如圖所示
- 在專案下安裝eslint命令列並進行初始化
3.1 執行 npm init: 先初始化下npm空間 3.2 執行 npm i eslint, 安裝eslint 3.3 執行 eslint --init:初始化eslint當你敲出init後,eslint的命令列會自動詢問你一大堆選擇題,而你只要通過箭頭選擇選項並回車就好了,很方便啊! 這些問題包括:
- Q1. 你想如何使用eslint?1.檢查語法2.檢查語法並且發現問題3.檢查語法,發現問題並強制約定程式碼風格
- Q2. 你的專案使用的模組化方式?1.CommonJS 2.Import/export 3.None of these
- Q3. 你的環境? 1.Node 2.瀏覽器
- Q4. 你使用到的框架? 1.React 2.Vue 3. None of these
- Q5. 你的專案使用TypeScript? 1.Y 2.N
{ "env":{ "browser":true, "es6":true }, "extends":[ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended" ], "globals":{ "Atomics":"readonly", "SharedArrayBuffer":"readonly" }, "parser":"@typescript-eslint/parser", "parserOptions":{ "ecmaVersion":2018, "sourceType":"module" }, "plugins":["@typescript-eslint"], "rules":{ "semi": ["error","always"], "quotes":["error","double"] } }
eslint真棒,讓我們看看這些配置選項都是怎麼搞的吧 1.env配置項 常見的可配置的有
"env":{ "browser":true,//瀏覽器環境 "node":true,//Node環境 "es6":true,//es6語法 "commonjs":true,//commonjs "worker":true//webwork相關語法 },2.globals配置項 它配的是全域性變數,一般情況下,按照eslint的規則,直接使用全域性變數是會報錯的,globals配置項幫你避免了這一點
"globals":{ "Atomics":"readonly", "SharedArrayBuffer":"readonly" },
3.parser配置項 可以配置解析器,預設是用的typescript的解析器,比如我們專案中就改成了babel-parser
"parser": "@typescript-eslint/parser”,
4.rules 配置具體的檢查細節,比如下面這條配置直接幹了no-console,如果使用console.log會報警告。如圖所示
"rules":{ "no-console":1 }
每個專案後面可以跟0,1,2三種數字
0:不報錯,不警告 1:警告但不報錯 2:報錯5.extends 你可能會問了,哎呀!!這麼多rules我還怎麼配啊,這樣eslint配置檔案連起來都可以繞VScode兩圈了! 不要擔心!!我們有extends配置項這個好東西,它提供的繼承功能直接集成了一些預設的配置,如下
"extends":[ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended" ]
6.plugins 加各種外掛,比如你想增加React的檢查怎麼辦? 你需要安裝eslint-plugin-react這個外掛 然後在配置中增加以下內容
"plugins":["react”]就OK了
執行示例
備註:官方推薦使用區域性eslint而非全域性eslintESLint was installed locally. We recommend using this local copy instead of your globally-installed copy