在 Ember 專案中使用ESLint (VScode編輯器下)

阿朋發表於2018-11-14

Use ESLint In Ember Project

在團隊開發過程中,有個開發規範是一個應該也是很重要的事情,在前端開發的這麼長的時間裡,包括各大廠都有自己的一套規範,我們大可以將成熟的規範拿來作為我們的規範。

ESLint

ESLint 是一個JavaScript 程式碼檢測工具,目標是保證程式碼的一致性和避免錯誤。ESLint 有很多規則來保證程式碼的一致。所以配置一個可行合理的規則塊是至關重要的。
在Ember 專案上,我們可以使用 ember-cli-eslint 來使用eslint規則:

yarn add ember-cli-eslint --dev
複製程式碼

在根目錄下的.eslintrc.js 新增規則,規則的樣子大致為:

{
    "rules": {
        "semi": ["error", "always"],
        "quotes": ["error", "double"]
    }
}
複製程式碼

這其中的semi以及quotes為ESLint的兩個規則,第一個值是錯誤級別,可以使用以下的值:

  • "off" or 0 - 關閉規則
  • "warn" or 1 - 將規則視為一個警告(不會影響退出碼)
  • "error" or 2 - 將規則視為一個錯誤 (退出碼為1);

知道這些之後,就可以配置自己想要的規則了,我們的規則附在下方。

將 ESLint 配置入VScode

檔案=>首選項=>設定內找到 ESLint選項配置我們的.eslintrc.js 的配置檔案地址就完成了。

{
	"folders": [
		{
			"path":  "/home/frank/github/self-ember-project/EmberProject"
		}
	],

	"settings": {
		"css.lint.zeroUnits":  "error",
		"editor.detectIndentation":  false,
		"editor.formatOnType":  true,
		"eslint.autoFixOnSave":  true,
		"eslint.options": {
		"configFile":  "ember-guide/.eslintrc.js"
		}
	},
}
複製程式碼

附錄

module.exports  = {
	root:  true,
	parserOptions: {
		ecmaVersion:  2017,
		sourceType:  'module'
	},
	plugins: [
		'ember'
	],
	extends: [
		'eslint:recommended',
		'plugin:ember/recommended'
	],
	env: {
		browser:  true
	},
	rules: {
		
		"no-alert":  1,//禁止使用alert confirm prompt

		"no-array-constructor":  2,//禁止使用陣列構造器

		"no-bitwise":  0,//禁止使用按位運算子

		"no-caller":  1,//禁止使用arguments.caller或arguments.callee

		"no-catch-shadow":  2,//禁止catch子句引數與外部作用域變數同名

		"no-class-assign":  2,//禁止給類賦值

		"no-cond-assign":  2,//禁止在條件表示式中使用賦值語句

		"no-console":  2,//禁止使用console

		"no-const-assign":  2,//禁止修改const宣告的變數

		"no-constant-condition":  2,//禁止在條件中使用常量表示式 if(true) if(1)

		"no-continue":  0,//禁止使用continue

		"no-control-regex":  2,//禁止在正規表示式中使用控制字元

		"no-debugger":  2,//禁止使用debugger

		"no-delete-var":  2,//不能對var宣告的變數使用delete操作符

		"no-div-regex":  1,//不能使用看起來像除法的正規表示式/=foo/

		"no-dupe-keys":  2,//在建立物件字面量時不允許鍵重複 {a:1,a:1}

		"no-dupe-args":  2,//函式引數不能重複

		"no-duplicate-case":  2,//switch中的case標籤不能重複

		"no-else-return":  2,//如果if語句裡面有return,後面不能跟else語句

		"no-empty":  2,//塊語句中的內容不能為空

		"no-empty-character-class":  2,//正規表示式中的[]內容不能為空

		"no-empty-label":  0,//禁止使用空label

		"no-eq-null":  2,//禁止對null使用==或!=運算子

		"no-eval":  2,//禁止使用eval

		"no-ex-assign":  2,//禁止給catch語句中的異常引數賦值

		"no-extend-native":  2,//禁止擴充套件native物件

		"no-extra-bind":  2,//禁止不必要的函式繫結

		"no-extra-boolean-cast":  2,//禁止不必要的bool轉換

		"no-extra-parens":  2,//禁止非必要的括號

		"no-extra-semi":  2,//禁止多餘的冒號

		"no-fallthrough":  1,//禁止switch穿透

		"no-floating-decimal":  2,//禁止省略浮點數中的0 .5 3.

		"no-func-assign":  2,//禁止重複的函式宣告

		"no-implicit-coercion":  1,//禁止隱式轉換

		"no-implied-eval":  2,//禁止使用隱式eval

		"no-inline-comments":  0,//禁止行內備註

		"no-inner-declarations": [2, "functions"],//禁止在塊語句中使用宣告(變數或函式)

		"no-invalid-regexp":  2,//禁止無效的正規表示式

		"no-invalid-this":  2,//禁止無效的this,只能用在構造器,類,物件字面量

		"no-irregular-whitespace":  2,//不能有不規則的空格

		"no-iterator":  2,//禁止使用__iterator__ 屬性

		"no-label-var":  2,//label名不能與var宣告的變數名相同

		"no-labels":  0,//禁止標籤宣告

		"no-lone-blocks":  2,//禁止不必要的巢狀塊

		"no-lonely-if":  2,//禁止else語句內只有if語句

		"no-loop-func":  1,//禁止在迴圈中使用函式(如果沒有引用外部變數不形成閉包就可以)

		"no-mixed-requires": [0, false],//宣告時不能混用宣告型別

		"no-mixed-spaces-and-tabs": [2, false],//禁止混用tab和空格

		"linebreak-style": [0, "windows"],//換行風格

		"no-multi-spaces":  1,//不能用多餘的空格

		"no-multi-str":  2,//字串不能用\換行

		"no-multiple-empty-lines": [1, { "max":  2 }],//空行最多不能超過2行

		"no-native-reassign":  2,//不能重寫native物件

		"no-negated-in-lhs":  2,//in 操作符的左邊不能有!

		"no-nested-ternary":  0,//禁止使用巢狀的三目運算

		"no-new":  1,//禁止在使用new構造一個例項後不賦值

		"no-new-func":  1,//禁止使用new Function

		"no-new-object":  2,//禁止使用new Object()

		"no-new-require":  2,//禁止使用new require

		"no-new-wrappers":  2,//禁止使用new建立包裝例項,new String new Boolean new Number

		"no-obj-calls":  2,//不能呼叫內建的全域性物件,比如Math() JSON()

		"no-octal":  2,//禁止使用八進位制數字

		"no-octal-escape":  2,//禁止使用八進位制轉義序列

		"no-param-reassign":  2,//禁止給引數重新賦值

		"no-path-concat":  0,//node中不能使用__dirname或__filename做路徑拼接

		"no-plusplus":  0,//禁止使用++,--

		"no-process-env":  0,//禁止使用process.env

		"no-process-exit":  0,//禁止使用process.exit()

		"no-proto":  2,//禁止使用__proto__屬性

		"no-redeclare":  2,//禁止重複宣告變數

		"no-regex-spaces":  2,//禁止在正規表示式字面量中使用多個空格 /foo bar/

		"no-restricted-modules":  0,//如果禁用了指定模組,使用就會報錯

		"no-return-assign":  1,//return 語句中不能有賦值表示式

		"no-script-url":  0,//禁止使用javascript:void(0)

		"no-self-compare":  2,//不能比較自身

		"no-sequences":  0,//禁止使用逗號運算子

		"no-shadow":  2,//外部作用域中的變數不能與它所包含的作用域中的變數或引數同名

		"no-shadow-restricted-names":  2,//嚴格模式中規定的限制識別符號不能作為宣告時的變數名使用

		"no-spaced-func":  2,//函式呼叫時 函式名與()之間不能有空格

		"no-sparse-arrays":  2,//禁止稀疏陣列, [1,,2]

		"no-sync":  0,//nodejs 禁止同步方法

		"no-ternary":  0,//禁止使用三目運算子

		"no-trailing-spaces":  1,//一行結束後面不要有空格

		"no-this-before-super":  0,//在呼叫super()之前不能使用this或super

		"no-throw-literal":  2,//禁止丟擲字面量錯誤 throw "error";

		"no-undef":  1,//不能有未定義的變數

		"no-undef-init":  2,//變數初始化時不能直接給它賦值為undefined

		"no-undefined":  2,//不能使用undefined

		"no-unexpected-multiline":  2,//避免多行表示式

		"no-underscore-dangle": ["error", { "allowAfterThis":  true }],//識別符號能以_開頭或結尾

		"no-unneeded-ternary":  2,//禁止不必要的巢狀 var isYes = answer === 1 ? true : false;

		"no-unreachable":  2,//不能有無法執行的程式碼

		"no-unused-expressions":  2,//禁止無用的表示式

		"no-unused-vars": [2, { "vars":  "all", "args":  "after-used" }],//不能有宣告後未被使用的變數或引數

		"no-use-before-define":  2,//未定義前不能使用

		"no-useless-call":  2,//禁止不必要的call和apply

		"no-void":  2,//禁用void操作符

		"no-var":  0,//禁用var,用let和const代替

		"no-warning-comments": [1, { "terms": ["todo", "fixme", "xxx"], "location":  "start" }],//不能有警告備註

		"no-with":  2,//禁用with

		  

		"array-bracket-spacing": [2, "never"],//是否允許非空陣列裡面有多餘的空格

		"arrow-parens":  0,//箭頭函式用小括號括起來

		"arrow-spacing":  0,//=>的前/後括號

		"accessor-pairs":  0,//在物件中使用getter/setter

		"block-scoped-var":  1,//塊語句中使用var

		"brace-style": [1, "1tbs"],//大括號風格

		"callback-return":  1,//避免多次呼叫回撥什麼的

		"camelcase":  2,//強制駝峰法命名

		"comma-dangle": [2, "never"],//物件字面量項尾不能有逗號

		"comma-spacing":  0,//逗號前後的空格

		"comma-style": [2, "last"],//逗號風格,換行時在行首還是行尾

		"complexity": [0, 11],//迴圈複雜度

		"computed-property-spacing": [0, "never"],//是否允許計算後的鍵名什麼的

		"consistent-return":  0,//return 後面是否允許省略

		"consistent-this": [2, "that"],//this別名

		"constructor-super":  2,//非派生類不能呼叫super,派生類必須呼叫super

		"curly": [2, "all"],//必須使用 if(){} 中的{}

		"default-case":  2,//switch語句最後必須有default

		"dot-location":  0,//物件訪問符的位置,換行的時候在行首還是行尾

		"dot-notation": [0, { "allowKeywords":  true }],//避免不必要的方括號

		"eol-last":  0,//檔案以單一的換行符結束

		"eqeqeq":  2,//必須使用全等

		"func-names":  0,//函式表示式必須有名字

		"func-style": [0, "declaration"],//函式風格,規定只能使用函式宣告/函式表示式

		"generator-star-spacing":  0,//生成器函式*的前後空格

		"guard-for-in":  0,//for in迴圈要用if語句過濾

		"handle-callback-err":  0,//nodejs 處理錯誤

		"id-length":  0,//變數名長度

		"indent": [2, 'tab'],//縮排風格

		"init-declarations":  2,//宣告時必須賦初值

		"key-spacing": [0, { "beforeColon":  false, "afterColon":  true }],//物件字面量中冒號的前後空格

		"lines-around-comment":  0,//行前/行後備注

		"max-depth": [1, 4],//巢狀塊深度

		"max-len": [0, 80, 4],//字串最大長度

		"max-nested-callbacks": [1, 2],//回撥巢狀深度

		"max-params": [0, 3],//函式最多隻能有3個引數

		"max-statements": [0, 10],//函式內最多有幾個宣告

		"new-cap":  2,//函式名首行大寫必須使用new方式呼叫,首行小寫必須用不帶new方式呼叫

		"new-parens":  2,//new時必須加小括號

		"newline-after-var":  2,//變數宣告後是否需要空一行

		"object-curly-spacing": [0, "never"],//大括號內是否允許不必要的空格

		"object-shorthand":  0,//強制物件字面量縮寫語法

		"one-var":  1,//連續宣告

		"operator-assignment": [0, "always"],//賦值運算子 += -=什麼的

		"operator-linebreak": [2, "after"],//換行時運算子在行尾還是行首

		"padded-blocks":  0,//塊語句內行首行尾是否要空行

		"prefer-const":  0,//首選const

		"prefer-spread":  0,//首選展開運算

		"prefer-reflect":  0,//首選Reflect的方法

		"quotes": ["warn", "double", { "avoidEscape":  true, "allowTemplateLiterals":  true }],//引號型別 `` "" ''

		"quote-props": ["error", "consistent", { "keywords":  true }],//物件字面量中的屬性名是否強制雙引號

		"radix":  2,//parseInt必須指定第二個引數

		"id-match":  0,//命名檢測

		"require-yield":  0,//生成器函式必須有yield

		"semi": [2, "always"],//語句強制分號結尾

		"semi-spacing": [0, { "before":  false, "after":  true }],//分號前後空格

		"sort-vars":  0,//變數宣告時排序

		"space-after-keywords": [0, "always"],//關鍵字後面是否要空一格

		"space-before-blocks": [0, "always"],//不以新行開始的塊{前面要不要有空格

		"space-before-function-paren": [0, "always"],//函式定義時括號前面要不要有空格

		"space-in-parens": [0, "never"],//小括號裡面要不要有空格

		"space-infix-ops":  0,//中綴操作符周圍要不要有空格

		"keyword-spacing":  2,//return throw case後面要不要加空格

		"space-unary-ops": [0, { "words":  true, "nonwords":  false }],//一元運算子的前/後要不要加空格

		"spaced-comment":  0,//註釋風格要不要有空格什麼的

		"strict":  2,//使用嚴格模式

		"use-isnan":  2,//禁止比較時使用NaN,只能用isNaN()

		"valid-jsdoc":  0,//jsdoc規則

		"valid-typeof":  2,//必須使用合法的typeof的值

		"vars-on-top":  2,//var必須放在作用域頂部

		"wrap-iife": [2, "inside"],//立即執行函式表示式的小括號風格

		"wrap-regex":  0,//正規表示式字面量用小括號包起來

		"yoda": [2, "never"]//禁止尤達條件
	},

		overrides: [
			// node files
		{

		files: [
			'ember-cli-build.js',
			'testem.js',
			'blueprints/*/index.js',
			'config/**/*.js',
			'lib/*/index.js'
		],
		parserOptions: {
			sourceType:  'script',
			ecmaVersion:  2015
		},
		env: {
			browser:  false,
			node:  true
		}
	}
]

};
複製程式碼

Written by Frank Wang.

有問題可以下方評論,或發郵件至 法研魯迅 .

相關文章