命名方式:小驼峰
命名规范:前缀名词
// bad
let setCount = 10
// good
let maxCount = 10
命名方式:全部大写
命名规范:多个单词时使用分隔符_
// bad
const serverErrorCode = {
success: 200,
repeat: 444
}
// good
const SERVER_ERROR_CODE = {
SUCCESS: 200,
REPEAT: 444
}
命名方式:小驼峰
命名规范:前缀动词
// bad
function wordClass() {}
// good
function saveWordClass() {}
常用动词:can、has、is、load、get、set
命名方式:大驼峰
命名规范:前缀名词
// bad
class person {}
// good
class Person {}
// 单行注释,注意前面的空格
let maxCount = 123
/**
* 多行注释
* /
确定条件不允许时,尽早返回。经典使用场景:校验数据
// bad
if (condition1) {
if (condition2) {
...
}
}
// good
if (!condition1) return
if (!condition2) return
...
使用常量进行自解释
// bad
type: 1 // 1代表新增 2代表修改
// good
const MODIFY_TYPE = {
ADD: 1,
EDIT: 2
}
type: MODIFY_TYPE.ADD
尽可能简洁表达式
// bad
if (name === ''){}
if (collection.length > 0){}
if (notTrue === false){}
// good
if (!name) {}
if (collection.length){}
if (notTrue){}
对于相同变量或表达式的多值条件,用switch
代替if
。
// bad
let type = typeof variable
if (type === 'object') {
// ......
}
else if (type === 'number' || type === 'boolean' || type === 'string') {
// ......
}
// good
switch (typeof variable) {
case 'object':
// ......
break
case 'number':
case 'boolean':
case 'string':
// ......
break
}
V1.1
逻辑复杂时,建议使用变量名自解释,而不是晦涩难懂的简写。
// bad
function(value) {
return !helpers.req(value) || this.entity.entVocabularyEntries.filter(item => item.vocabularyEntryName === value).length < 2
}
// good
function(value) {
let entVocabularyList = this.entity.entVocabularyEntries
let repeatCount = entVocabularyList.filter(item => item.vocabularyEntryName === value).length
return !helpers.req(value) || repeatCount < 2
}
V1.1
遵循单一职责的基础上,可以把逻辑隐藏在函数中,同时使用准确的函数名自解释。
// bad
if (modifyType === MODIFY_TYPE.ADD) {
batchVariableAPI(data).then(() => {
this.closeModal()
this.$toast.show('添加变量成功')
})
} else {
updateVariableAPI(data).then(() => {
this.closeModal()
this.$toast.show('修改变量成功')
})
}
// good
modifyType === MODIFY_TYPE.ADD ? this._insertVariable(data) : this._updateVariable(data)
_insertVariable() {
batchVariableAPI(data).then(() => this._successOperation('添加变量成功'))
}
_updateVariable() {
updateVariableAPI(data).then(() => this._successOperation('修改变量成功'))
}
_successOperation(toastMsg) {
this.closeModal()
this.$toast.show(toastMsg)
}
使用prettier格式化工具以及eslint校验
.prettierrc配置:
module.exports = {
printWidth: 100, // 设置prettier单行输出(不折行)的(最大)长度
tabWidth: 4, // 设置工具每一个水平缩进的空格数
useTabs: false, // 使用tab(制表位)缩进而非空格
semi: false, // 在语句末尾添加分号
singleQuote: true, // 使用单引号而非双引号
trailingComma: 'none', // 在任何可能的多行中输入尾逗号
bracketSpacing: true, // 在对象字面量声明所使用的的花括号后({)和前(})输出空格
arrowParens: 'avoid', // 为单行箭头函数的参数添加圆括号,参数个数为1时可以省略圆括号
// parser: 'babylon', // 指定使用哪一种解析器
jsxBracketSameLine: true, // 在多行JSX元素最后一行的末尾添加 > 而使 > 单独一行(不适用于自闭和元素)
rangeStart: 0, // 只格式化某个文件的一部分
rangeEnd: Infinity, // 只格式化某个文件的一部分
filepath: 'none', // 指定文件的输入路径,这将被用于解析器参照
requirePragma: false, // (v1.7.0+) Prettier可以严格按照按照文件顶部的一些特殊的注释格式化代码,这些注释称为“require pragma”(必须杂注)
insertPragma: false, // (v1.8.0+) Prettier可以在文件的顶部插入一个 @format的特殊注释,以表明改文件已经被Prettier格式化过了。
proseWrap: 'preserve' // (v1.8.2+)
}
.eslintrc.js规则:
module.exports = {
root: true,
env: {
browser: true,
node: true
},
extends: ['plugin:vue/essential'],
parserOptions: {
parser: 'babel-eslint'
},
plugins: ['vue'],
// add your custom rules here
rules: {
'arrow-parens': 0, // allow paren-less arrow functions
'generator-star-spacing': 0, // allow async-await
'no-unused-vars': 'error', // disabled no ununsed var `V1.1`
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // no use debugger in production
'indent': [2, 4, { SwitchCase: 1 }], // 4 space for tab for perttier
'space-before-function-paren': ['error', 'never'], // no space in function name for perttier
}
}
如果是vue-cli3项目,以上配置的eslint插件默认已安装;如果不是vue-cli3项目,需要npm安装对应包:npm install --save-dev babel-eslint eslint-plugin-vue