什麼是flow?
flow是Facebook出品的靜態類型檢查工具(vue.js 的源碼就是利用了flow做靜態類型檢查)
爲什麼用flow?
- 因爲JavaScript是一種動態類型語言,靈活性強,但是過於靈活會帶來一些問題,很容易寫出非常隱蔽的隱患代碼,沒有明顯的語法錯誤編譯階段可能不會報錯,但是在運行階段會出現各種bug。
- 類型檢查就是在編譯階段發現由類型錯誤引起的bug,不影響代碼的運行,使得編寫JavaScript具有和編寫Java等強類型語言相近的體驗
- vue.js 2.0在ES6的基礎上,除了ESlint保證代碼風格外,引用了flow做靜態類型檢查,因爲Babel和ESLint都有對應的Flow插件以支持語法,可以完全沿用現有的構建配置,非常小成本的改動就可以擁有靜態類型檢查的能力
安裝使用flow
- npm i -g flow-bin 安裝flow
- flow init 初始化生成
.flowconfig
文件
.flowconfig文件如下: (配置一些不做類型檢查的問價和做類型檢查的文件等等)
[declarations]
[include]
[ignore]
[untyped]
[libs]
[lints]
[options]
[version]
flow靜態類型檢查工作方式?
- 類型推斷 通過變量的使用上下文推斷出變量類型,然後根據這些推斷來檢查類型
例子:
function strSplit (str) {
str.split(' ')
}
strSplit(11)
// 從上下文可以推斷出傳入參數應該是一個String類型,但是傳入的是Number類型,所以在編譯的時候就會報錯。
- 類型註釋 事先註釋好我們期待的類型。Flow會基於這些註釋來判斷
/*@flow*/
function strSplit (str: string) {
str.split(' ')
}
/*@flow*/
這個標記表示該文件會進行類型檢查
flow怎麼識別引用的第三方庫,或者自定義的類型呢?
flow提出了一個libdef的概念,可以用來識別這些第三方庫或者自定義類型。
vue.js源碼中的自定義類型
vue.js源碼中的自定義類型主要在flow目錄下:
(類似Flow的工具還有Typescript)