不論是多人合做仍是我的項目,代碼規範是很重要的。這樣作不只能夠很大程度地避免基本語法錯誤,也保證了代碼的可讀性。javascript
可能在早期創建項目的時候,由於一些緣由沒有引入eslint、單元測試等,隨着項目開發,更多的小夥伴加入進來,每一個人的編碼風格遠近高低各不一樣,後續本身或他人進行維護他人的代碼時,會變得很棘手。html
就最基本的縮進、字段類型、參數函數命名方式(駝峯底槓)等可能都會讓其餘維護人員抓狂。vue
以此爲背景,趁如今參與開發當前項目的人還少的時候,考慮引入ESLint規範代碼編寫風格。java
Visual Studio Code(VSCode)
vue、vue-cli、npm、ESLintnode
npm install eslint eslint-config-airbnb-base eslint-plugin-import eslint-plugin-vue --save-dev
或在package.json中配置如下依賴,執行 npm install 安裝react
"devDependencies": { "babel-eslint": "8.2.6", "eslint": "4.19.1", "eslint-friendly-formatter": "4.0.1", "eslint-loader": "2.0.0", "eslint-plugin-vue": "4.7.1", }
在項目根路徑添加兩個文件 .eslintrc.js 和 .eslintignorewebpack
module.exports = { root: true, parserOptions: { parser: 'babel-eslint', sourceType: 'module' }, env: { browser: true, node: true, es6: true, }, extends: ['plugin:vue/recommended', 'eslint:recommended'], // 最嚴格模式,會在命令窗口打印錯誤提示 // extends: ['plugin:vue/essential', 'eslint:recommended'], // add your custom rules here // it is base on https://github.com/vuejs/eslint-config-vue // 中文文檔 https://cn.eslint.org/docs/rules/ rules: { "vue/max-attributes-per-line": [2, { "singleline": 10, "multiline": { "max": 1, "allowFirstLine": false } }], "vue/name-property-casing": ["error", "PascalCase"], 'accessor-pairs': 2, // 強制 getter 和 setter 在對象中成對出現 'arrow-spacing': [2, { 'before': true, 'after': true }], // 強制箭頭函數的箭頭先後使用一致的空格 'block-spacing': [2, 'always'], // 禁止或強制在代碼塊中開括號前和閉括號後有空格 'brace-style': [2, '1tbs', { 'allowSingleLine': true }], // 強制在代碼塊中使用一致的大括號風格 'camelcase': [0, { 'properties': 'always' }], // 強制使用駱駝拼寫法命名約定 'comma-dangle': [2, 'never'], // 要求或禁止末尾逗號 'comma-spacing': [2, { 'before': false, 'after': true }], // 強制在逗號先後使用一致的空格 'comma-style': [2, 'last'], // 強制使用一致的逗號風格 'constructor-super': 2, // 要求在構造函數中有 super() 的調用 'curly': [2, 'multi-line'], // 強制全部控制語句使用一致的括號風格 'dot-location': [2, 'property'], // 強制在點號以前和以後一致的換行 'eol-last': 2, // 要求或禁止文件末尾存在空行 'eqeqeq': [2, 'allow-null'], // 要求使用 === 和 !== 'generator-star-spacing': [2, { 'before': true, 'after': true }], // 強制 generator 函數中 * 號周圍使用一致的空格 'handle-callback-err': [2, '^(err|error)$'], // 要求回調函數中有容錯處理 'indent': [2, 2, { 'SwitchCase': 1 }], // 強制使用一致的縮進 'jsx-quotes': [2, 'prefer-single'], // 強制在 JSX 屬性中一致地使用雙引號或單引號 'key-spacing': [2, { 'beforeColon': false, 'afterColon': true }], // 強制在對象字面量的屬性中鍵和值之間使用一致的間距 'keyword-spacing': [2, { 'before': true, 'after': true }], // 強制在關鍵字先後使用一致的空格 'new-cap': [2, { 'newIsCap': true, 'capIsNew': false }], // 要求構造函數首字母大寫 'new-parens': 2, // 要求調用無參構造函數時有圓括號 'no-array-constructor': 2, // 禁用 Array 構造函數 'no-caller': 2, // 禁用 arguments.caller 或 arguments.callee 'no-console': 'off', // 禁用 console 'no-class-assign': 2, // 禁止修改類聲明的變量 'no-cond-assign': 2, // 禁止條件表達式中出現賦值操做符 'no-const-assign': 2, // 禁止修改 const 聲明的變量 'no-control-regex': 2, // 禁止在正則表達式中使用控制字符 'no-delete-var': 2, // 禁止刪除變量 'no-dupe-args': 2, // 禁止 function 定義中出現重名參數 'no-dupe-class-members': 2, // 禁止類成員中出現重複的名稱 'no-dupe-keys': 2, // 禁止對象字面量中出現重複的 key 'no-duplicate-case': 2, // 禁止出現重複的 case 標籤 'no-empty-character-class': 2, // 禁止在正則表達式中使用空字符集 'no-empty-pattern': 2, // 禁止使用空解構模式 'no-eval': 2, // 禁用 eval() 'no-ex-assign': 2, // 禁止對 catch 子句的參數從新賦值 'no-extend-native': 2, // 禁止擴展原生類型 'no-extra-bind': 2, // 禁止沒必要要的 .bind() 調用 'no-extra-boolean-cast': 2, // 禁止沒必要要的布爾轉換 'no-extra-parens': [2, 'functions'], // 禁止沒必要要的括號 'no-fallthrough': 2, // 禁止 case 語句落空 'no-floating-decimal': 2, // 禁止數字字面量中使用前導和末尾小數點 'no-func-assign': 2, // 禁止對 function 聲明從新賦值 'no-implied-eval': 2, // 禁止使用相似 eval() 的方法 'no-inner-declarations': [2, 'functions'], // 禁止在嵌套的塊中出現變量聲明或 function 聲明 'no-invalid-regexp': 2, // 禁止 RegExp 構造函數中存在無效的正則表達式字符串 'no-irregular-whitespace': 2, // 禁止在字符串和註釋以外不規則的空白 'no-iterator': 2, // 禁用 __iterator__ 屬性 'no-label-var': 2, // 不容許標籤與變量同名 'no-labels': [2, { 'allowLoop': false, 'allowSwitch': false }], // 禁用標籤語句 'no-lone-blocks': 2, // 禁用沒必要要的嵌套塊 'no-mixed-spaces-and-tabs': 2, // 禁止空格和 tab 的混合縮進 'no-multi-spaces': 2, // 禁止使用多個空格 'no-multi-str': 2, // 禁止使用多行字符串 'no-multiple-empty-lines': [2, { 'max': 3, "maxEOF": 3, "maxBOF": 3, }], // 禁止出現多行空行(此處設置最多出現連續3個空行) 'no-global-assign': 2, // 禁止對原生對象或只讀的全局對象進行賦值,原no-native-reassign已被此替換 'no-unsafe-negation': 2, // 禁止對關係運算符的左操做數使用否認操做符,原no-negated-in-lhs已被此替換 'no-new-object': 2, // 禁用 Object 的構造函數 'no-new-require': 2, // 禁止調用 require 時使用 new 操做符 'no-new-symbol': 2, // 禁止 Symbolnew 操做符和 new 一塊兒使用 'no-new-wrappers': 2, // 禁止對 String,Number 和 Boolean 使用 new 操做符 'no-obj-calls': 2, // 禁止把全局對象做爲函數調用 'no-octal': 2, // 禁用八進制字面量 'no-octal-escape': 2, // 禁止在字符串中使用八進制轉義序列 'no-path-concat': 2, // 禁止對 __dirname 和 __filename 進行字符串鏈接 'no-proto': 2, // 禁用 __proto__ 屬性 'no-redeclare': 2, // 禁止屢次聲明同一變量 'no-regex-spaces': 2, // 'no-return-assign': [2, 'except-parens'], // 禁止在 return 語句中使用賦值語句 'no-self-assign': 2, // 禁止自我賦值 'no-self-compare': 2, // 禁止自身比較 'no-sequences': 2, // 禁用逗號操做符 'no-shadow-restricted-names': 2, // 禁止將標識符定義爲受限的名字 'func-call-spacing': 2, // 要求或禁止在函數標識符和其調用之間有空格,原no-spaced-func已被此替換 'no-sparse-arrays': 2, // 禁用稀疏數組 'no-this-before-super': 2, // 禁止在構造函數中,在調用 super() 以前使用 this 或 super 'no-throw-literal': 2, // 禁止拋出異常字面量 'no-trailing-spaces': 1, // 禁用行尾空格 'no-undef': 2, // 禁用未聲明的變量,除非它們在 /*global */ 註釋中被提到 'no-undef-init': 2, // 禁止將變量初始化爲 undefined 'no-unexpected-multiline': 2, // 禁止出現使人困惑的多行表達式 'no-unmodified-loop-condition': 2, // 禁用一成不變的循環條件 'no-unneeded-ternary': [2, { 'defaultAssignment': false }], // 禁止能夠在有更簡單的可替代的表達式時使用三元操做符 'no-unreachable': 2, // 禁止在return、throw、continue 和 break 語句以後出現不可達代碼 'no-unsafe-finally': 2, // 禁止在 finally 語句塊中出現控制流語句 'no-unused-vars': [2, { 'vars': 'all', 'args': 'none' }], // 禁止出現未使用過的變量 'no-useless-call': 2, // 禁止沒必要要的 .call() 和 .apply() 'no-useless-computed-key': 2, // 禁止在對象中使用沒必要要的計算屬性 'no-useless-constructor': 2, // 禁用沒必要要的構造函數 'no-useless-escape': 0, // 禁用沒必要要的轉義字符 'no-whitespace-before-property': 2, // 禁止屬性前有空白 'no-with': 2, // 禁用 with 語句 'one-var': [2, { 'initialized': 'never' }], // 強制函數中的變量要麼一塊兒聲明要麼分開聲明 'operator-linebreak': [2, 'after', { 'overrides': { '?': 'before', ':': 'before' } }], // 強制操做符使用一致的換行符 'padded-blocks': [0, 'never'], // 要求或禁止塊內填充 'quotes': [2, 'single', { 'avoidEscape': true, 'allowTemplateLiterals': true }], // 強制使用一致的反勾號、雙引號或單引號 // 'semi': [2, 'never'], // 要求或禁止使用分號代替 ASI,分號設置:never 從不出現分號,always 必須分號結尾 'semi': [0], 'semi-spacing': [2, { 'before': false, 'after': true }], // 強制分號以前和以後使用一致的空格 'space-before-blocks': [2, 'always'], // 強制在塊以前使用一致的空格 'space-before-function-paren': [2, 'never'], // 強制在 function的左括號以前使用一致的空格 'space-in-parens': [2, 'never'], // 強制在圓括號內使用一致的空格 'space-infix-ops': 2, // 要求操做符周圍有空格 'space-unary-ops': [2, { 'words': true, 'nonwords': false }], // 強制在一元操做符先後使用一致的空格 'spaced-comment': [2, 'always', { 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] }], // 強制在註釋中 // 或 /* 使用一致的空格 'template-curly-spacing': [2, 'never'], // 要求或禁止模板字符串中的嵌入表達式周圍空格的使用 'use-isnan': 2, // 要求使用 isNaN() 檢查 NaN 'valid-typeof': 2, // 強制 typeof 表達式與有效的字符串進行比較 'wrap-iife': [2, 'any'], // 要求 IIFE 使用括號括起來 'yield-star-spacing': [2, 'both'], // 強制在 yield* 表達式中 * 周圍使用空格 'yoda': [2, 'never'], // 要求或禁止 「Yoda」 條件 'prefer-const': 2, // 要求使用 const 聲明那些聲明後再也不被修改的變量 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, // 禁用 debugger 'object-curly-spacing': [2, 'always', { objectsInObjects: false }], // 強制在大括號中使用一致的空格 'array-bracket-spacing': [2, 'never'] // 強制數組方括號中使用一致的空格 } }
build/*.js config/*.js src/assets
ESLint的規則有三種級別:es6
webpack.base.conf.js 能夠經過配置 eslint-loader 讓你有不符合eslint的時候在命令行或者界面裏提示你有什麼錯誤。(能夠不配置)github
const createLintingRule = () => ({ test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-formatter'), emitWarning: !config.dev.showEslintErrorsInOverlay } }) module.exports = { entry: { }, output: { }, resolve: { }, externals: { }, module: { rules: [ ...(config.dev.useEslint ? [createLintingRule()] : []) ], loaders: [ ] }, plugins: [ ] }
module.exports = { dev: { // Use Eslint Loader? // If true, your code will be linted during bundling and // linting errors and warnings will be shown in the console. useEslint: true, // If true, eslint errors and warnings will also be shown in the error overlay // in the browser. showEslintErrorsInOverlay: false, }, build: { } }
TIP:showEslintErrorsInOverlay 這個變量能夠控制錯誤提示是否須要在瀏覽器界面中提示。
由於是後期加入的eslint,對於現有代碼,一點點手動修復是很麻煩的一件事,在 package.js 中配置如下命令並執行,能夠按照你配置的規則批量修改代碼
{ "scripts": { "lint": "eslint --ext .js,.vue src/api/index.js" }, "dependencies": { }, "devDependencies": { "babel-eslint": "8.2.6", "eslint": "4.19.1", "eslint-friendly-formatter": "4.0.1", "eslint-loader": "2.0.0", "eslint-plugin-vue": "4.7.1", }, "engines": { }, "browserslist": [ ] }
1. 運行 npm run lint 能夠查看到全部不符合規範的代碼 2. 運行 npm run lint --fix,能夠快速修復全部不符合規範的代碼 3. 也能夠寫成 "lint": "eslint --ext .js,.vue src/api/index.js --fix",而後直接運行 npm run lint 進行修復 4. 上面的命令中 --ext 參數就是用來指定須要檢查的擴展名的文件(.js和.vue),src 就是指定檢查的目錄(能夠是單個文件,也能夠是整個目錄)
以前一直是用sublime開發的,可是因爲最近好像沒法安裝插件等問題轉用了VSCode。
安裝並配置完成 ESLint 後,文件 > 首選項 > 設置 打開 VSCode 配置文件,添加以下配置
{ "eslint.enable": false, // 是否開啓檢測 "eslint.validate": [ "javascript", "javascriptreact", // "vue-html", // "html", // "vue", { "language": "vue-html", "autoFix": false // 編輯vue-html,保存時是否根據eslint規則自動修復 }, { "language": "html", "autoFix": false }, { "language": "vue", "autoFix": false } ], "eslint.run": "onSave", "eslint.autoFixOnSave": false, // 保存時是否根據eslint規則自動修復 }
部分參考自:
給vue項目添加ESLint
vue-element-admin