【vue系列】 vue2.0 項目配置 ESLint

協同開發過程當中,不一樣的編碼習慣寫出的代碼,差別很大。平常維護代碼或者修復bug的時候時候,看各類風格的代碼,影響效率不說,還有可能改出低級問題。目前咱們的項目尚未代碼規範,我決定要作點改變,因而考慮使用 ESlint 來作代碼規範檢查。javascript

考察了ESlint的官方網站和一些技術貼,決定先給咱們其中的一個 Vue2.0 項目配置 ESLint。在配置 ESLint 過程當中走了一些彎路,把配置過程記錄下來,方便往後查看。vue

預測得到的收益:java

  • 項目編碼風格統一,師出一人;
  • 開發過程當中修復語法錯誤,減小潛在 bug
  • 規定規範編碼,減小代碼冗餘,提升代碼質量;

預期風險:node

擔憂整個項目添加了 ESLint,其餘同事冒火,由於是多頁面應用,在項目根目錄下作了配置,新需求可使用新配置,老項目能夠自行選擇要不要改一輪eslint的報告提示,此次給咱們的 Vue2.0 項目配置了 ESLint 也給團隊作點貢獻。webpack

配置ESLint

咳咳,配置流程來了。es6

1. 安裝 eslint

既然要用 ESLint ,就要安裝它,經過命令: cnpm I eslint -D 安裝。web

2. 初始配置 eslint

eslint 安裝好以後,運行 eslint —init命令作些簡單配置,咱們能夠選擇咱們須要的檢測的環境、文件類型等等。這步完成,在項目根目錄下會生成一個 eslintrc.js 文件。vue-router

3. 安裝 eslint-loader

咱們的項目須要webpack來編譯,須要對應的loader,安裝 eslint-loader,運行命令 cnpm I eslint-loader -Dnpm

若是有 command not found: eslint 的報錯提示,能夠運行 ./node_modules/.bin/eslint --init 來進行eslint配置化安裝瀏覽器

4. 配置 webpack

打開 webpackconfig 配置文件配置:

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')
            }
        }
    ]
};
複製代碼

5. 安裝 eslint-friendly-formatter

eslint-friendly-formatter 這個模塊是爲了方便本地規範檢查代碼。記得運行 cnpm i eslint-friendly-formatter -D 安裝上。

6. 安裝 babel-eslint

操做到這裏關於 eslint 的基本配置就完成了,把項目跑起來,咿居然有 parset 的報錯,說最新的eslint解析有問題。查詢資料是說須要 babel-eslint,按依賴安裝的方式安裝上。

7. 安裝 eslint-plugin-vue

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": {
    }
};
複製代碼

配置參數:

  • root 爲true根配置文件,不然會按照目錄樹向上搜索
  • env 執行環境
  • extends 對基礎配置進行擴展,能夠配置共享配置包 eslint-config-airbnb等。配置包須要安裝。
  • globals 指定全局變量,無視 no-undef 規則
  • parserOptions 語法解析器選項
  • plugins 插件 ,插件命名規範是 eslint-plugin- 爲前綴
  • rules 校驗規則

8. 配置小結

  • 須要安裝的依賴有
cnpm i eslint eslint-loader eslint-friendly-formatter babel-eslint  eslint-plugin-vue  -D
複製代碼
  • webpack 配置
  • .eslintrc.js 配置

配置完事,項目跑起來一堆的報錯,來來來,💃開始自我折磨吧。經歷磨練才能寫出更優雅更規範的代碼。看着頁面很少,花了幾個小時來處理 ESLint 的警告和報錯。😓

配置問題

Use the latest vue-eslint-parser

eslint-plugin-vue官網看到關於這個問題的解釋和解決方案:

eslint-plugin-vue 裏的大多數規則都須要 vue-eslint-parser 來解析 template 的AST, 然而 babel-eslintvue-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

1. ESLint 是如何檢查代碼的

出於對這個問題的疑惑,去查了一些資料,瞭解了 JS Linter 進化史ESLint 的核心訴求是將代碼解析與代碼檢查邏輯分開,支持自定義規則,每一個規則是一個插件,超強的開發能力讓ESLint變的更好用。

引用JS Linter 進化史的一段話:

ESLint 核心部分專一於配置生成、規則管理、上下文維護、遍歷 AST、報告產出等主流程。目前 ESLint 支持自定義的解析器、規則插件、預編譯插件、結果報告,它更像是一個平臺,對核心的流程設定約束,並開放各方面的能力,從而適應複雜多變的實際場景。

2. 爲何須要 eslint-loader

eslint-loader 的做用是讓 webpack 能夠處理eslint。

3. 爲何須要 eslint-friendly-formatter

eslint-friendly-formatter介紹的時候,該插件的做者說了下面這段話:

大概是講,他使用eslint的時候,發現eslint的報告提示在命令行中不友好,他不能在命令行中直接點擊跳轉到報錯的代碼處,沒有記錄報錯的行列,對應的報錯提示相關文檔也不方便直接查看。因而他寫了這個插件來處理以上問題。

如今這個插件被 eslint 官方推薦了。

4. 爲何用 babel-eslint,它是怎樣工做的

一般狀況下 eslint 使用默認的解析器 babel。可是 eslint 自己不能檢測實驗階段的語法,ESNext 的不少實驗階段的語法瀏覽器廠商支持了,開發者也在用。恰好 eslint 容許使用自定義解析器,因此就有了 babel-eslint 插件來處理這個事。

babel-eslint 導出了 eslint 可使用的AST。

AST 是 Abstract Syntax Tree(抽象語法樹)

5. 爲何須要 eslint-plugin-vue

Vue 單文件組件不是普通的 Javascript,不能使用默認的解析器。因此不得不有了 eslint-plugin-vue 用於對 template<script> 進行解析生成特定的加強的 AST

能夠對比着 vue風格指南看。目前咱們使用的 優先級A:必要的 的規範,即 plugin:vue/essentialplugin:vue/essential 的具體規則能夠訪問eslint-plugin-vue官網。

參考

JS Linter 進化史

最後

不少學習 Vue 的小夥伴知識碎片化嚴重,我想整理出系統化的一套關於Vue的學習系列博客。在自我成長的道路上,也但願可以幫助更多人進步。

不看後悔,Vue進階系列

都看到這裏了,趕忙關注 MiaoMiao、點贊、評論留言啦~

相關文章
相關標籤/搜索