協同開發過程當中,不一樣的編碼習慣寫出的代碼,差別很大。平常維護代碼或者修復bug的時候時候,看各類風格的代碼,影響效率不說,還有可能改出低級問題。目前咱們的項目尚未代碼規範,我決定要作點改變,因而考慮使用 ESlint
來作代碼規範檢查。javascript
考察了ESlint的官方網站和一些技術貼,決定先給咱們其中的一個 Vue2.0
項目配置 ESLint
。在配置 ESLint
過程當中走了一些彎路,把配置過程記錄下來,方便往後查看。vue
預測得到的收益:java
bug
;預期風險:node
擔憂整個項目添加了 ESLint
,其餘同事冒火,由於是多頁面應用,在項目根目錄下作了配置,新需求可使用新配置,老項目能夠自行選擇要不要改一輪eslint的報告提示,此次給咱們的 Vue2.0
項目配置了 ESLint
也給團隊作點貢獻。webpack
咳咳,配置流程來了。es6
既然要用 ESLint
,就要安裝它,經過命令: cnpm I eslint -D
安裝。web
eslint
安裝好以後,運行 eslint —init
命令作些簡單配置,咱們能夠選擇咱們須要的檢測的環境、文件類型等等。這步完成,在項目根目錄下會生成一個 eslintrc.js
文件。vue-router
咱們的項目須要webpack來編譯,須要對應的loader,安裝 eslint-loader
,運行命令 cnpm I eslint-loader -D
。npm
若是有
command not found: eslint
的報錯提示,能夠運行./node_modules/.bin/eslint --init
來進行eslint配置化安裝瀏覽器
打開 webpack
的 config
配置文件配置:
obj.module = {
rules: [
// ...
{
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [ path.resolve(commonDir, '../index.js'), resolve('./pages'), resolve('./components')], //
options: {
formatter: require('eslint-friendly-formatter')
}
}
]
};
複製代碼
eslint-friendly-formatter
這個模塊是爲了方便本地規範檢查代碼。記得運行cnpm i eslint-friendly-formatter -D
安裝上。
操做到這裏關於 eslint
的基本配置就完成了,把項目跑起來,咿居然有 parset
的報錯,說最新的eslint解析有問題。查詢資料是說須要 babel-eslint
,按依賴安裝的方式安裝上。
Vue.js
的官方 ESLint
插件: eslint-plugin-vue
,這個插件容許 咱們使用 ESLint
檢測 .vue
文件的 <template>
和 <script>
,有助於實時檢測代碼。 把這個插件安裝上,最終的 .eslintrc.js
:
module.exports = {
"root": true,
"env": {
"browser": true,
"es6": true
},
"extends": [
"eslint:recommended",
"plugin:vue/essential"
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"parser": 'babel-eslint',
"ecmaVersion": 2018,
"sourceType": "module"
},
"plugins": [
"vue"
],
"rules": {
}
};
複製代碼
配置參數:
eslint-config-airbnb
等。配置包須要安裝。eslint-plugin-
爲前綴cnpm i eslint eslint-loader eslint-friendly-formatter babel-eslint eslint-plugin-vue -D
複製代碼
配置完事,項目跑起來一堆的報錯,來來來,💃開始自我折磨吧。經歷磨練才能寫出更優雅更規範的代碼。看着頁面很少,花了幾個小時來處理 ESLint
的警告和報錯。😓
在eslint-plugin-vue官網看到關於這個問題的解釋和解決方案:
eslint-plugin-vue
裏的大多數規則都須要 vue-eslint-parser
來解析 template
的AST, 然而 babel-eslint
和 vue-eslint-parser
在解析上有衝突,解決辦法是把 "parser": "babel-eslint",
移入到 parserOptions
內。
- "parser": "babel-eslint",
+ "parser": "vue-eslint-parser",
"parserOptions": {
+ "parser": "babel-eslint",
"sourceType": "module"
}
複製代碼
此次配置ESLint,留下了一些疑惑,得空扒源碼吧。
eslint
是如何檢查代碼的?eslint-loader
都處理了什麼?eslint-friendly-formatter
?babel-eslint
,它是怎樣工做的?eslint-plugin-vue
?ESLint
是如何檢查代碼的出於對這個問題的疑惑,去查了一些資料,瞭解了 JS Linter 進化史。ESLint
的核心訴求是將代碼解析與代碼檢查邏輯分開,支持自定義規則,每一個規則是一個插件,超強的開發能力讓ESLint變的更好用。
引用JS Linter 進化史的一段話:
ESLint 核心部分專一於配置生成、規則管理、上下文維護、遍歷 AST、報告產出等主流程。目前 ESLint 支持自定義的解析器、規則插件、預編譯插件、結果報告,它更像是一個平臺,對核心的流程設定約束,並開放各方面的能力,從而適應複雜多變的實際場景。
eslint-loader
eslint-loader
的做用是讓 webpack
能夠處理eslint。
eslint-friendly-formatter
看 eslint-friendly-formatter
介紹的時候,該插件的做者說了下面這段話:
大概是講,他使用eslint的時候,發現eslint的報告提示在命令行中不友好,他不能在命令行中直接點擊跳轉到報錯的代碼處,沒有記錄報錯的行列,對應的報錯提示相關文檔也不方便直接查看。因而他寫了這個插件來處理以上問題。
如今這個插件被 eslint 官方推薦了。
babel-eslint
,它是怎樣工做的一般狀況下 eslint
使用默認的解析器 babel
。可是 eslint
自己不能檢測實驗階段的語法,ESNext
的不少實驗階段的語法瀏覽器廠商支持了,開發者也在用。恰好 eslint
容許使用自定義解析器,因此就有了 babel-eslint
插件來處理這個事。
babel-eslint
導出了 eslint
可使用的AST。
AST 是 Abstract Syntax Tree(抽象語法樹)
eslint-plugin-vue
Vue
單文件組件不是普通的 Javascript
,不能使用默認的解析器。因此不得不有了 eslint-plugin-vue
用於對 template
和 <script>
進行解析生成特定的加強的 AST
。
能夠對比着 vue風格指南看。目前咱們使用的 優先級A:必要的
的規範,即 plugin:vue/essential
。plugin:vue/essential
的具體規則能夠訪問eslint-plugin-vue官網。
不少學習 Vue 的小夥伴知識碎片化嚴重,我想整理出系統化的一套關於Vue的學習系列博客。在自我成長的道路上,也但願可以幫助更多人進步。
不看後悔,Vue進階系列
都看到這裏了,趕忙關注 MiaoMiao
、點贊、評論留言啦~