# Nodejs 开发规范
- 所有的查询使用 get 请求,所有的操作使用 post 请求,所有 post 请求必须有日志类型
# 代码规范
# 有关命名
尽量保证命名更加语义化
1
# 文件名
- 文件命名采用下划线命名法
// good
service_center.js
// bad
serviceCenter.js
1
2
3
4
5
2
3
4
5
# 类 & 构造函数命名
- 类命名采用 Pascal命名法,大写字母开头,各个单词首字母大写
class Person {
constructor(name) {
this.name = name;
}
}
const person = new Person('小明');
1
2
3
4
5
6
2
3
4
5
6
# 方法命名
- 方法命名采用 Camel命名法,小写字母开头,各个单词首字母大写
- 前缀应当是动词
- 命名建议:可使用常见动词约定等。
动词 | 含义 | 返回值 |
---|---|---|
get | 获取某个值 | 函数返回一个非布尔值 |
set | 设置某个值 | 无返回值、返回是否设置成功或者返回链式对象 |
is | 判断是否为某个值 | 函数返回一个布尔值。true:是;false:否 |
has | 判断是否含有某个值 | 函数返回一个布尔值。true:包含;false:不含 |
// good
function getName() {
...
return this.name;
}
function isExist() {
...
return true;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 变量命名
- 采用 Camel命名法,小写字母开头,各个单词首字母大写
- 特有大写缩写词汇保持大写如:SQL, URL等
- 变量名字不宜过长,可适当采用缩减英文元音字母来缩短长度
- 前缀应当是名词(方法名前缀为动词,以此区分变量和方法)
// good
let maxLength = 10;
// bad
let setLength = 10;
1
2
3
4
5
2
3
4
5
# 常量命名
- 必须采用 全大写命名,且单词以_分割
const MAX_COUNT = 10;
const SQL = 'SELECT * from bas_table';
1
2
2
# 注释规范
团队成员都应该形成良好的写注释的习惯,方便阅读以及为了其他成员顺利了解项目
1
JS支持三种不同类型的注释:行内注释,单行注释以及多行注释。
- 行内注释:行内注释以两个斜线开始,以行尾结束。双斜线与代码以及注释文字之间都都保留一个空格。 语法:code // 行内注释
function addNumber() {
return 3 + 2; // 5
}
1
2
3
2
3
- 单行注释:单独一行,单行注释以两个斜线开始,以行尾结束。
function addNumber(a, b) {
return a + b;
}
// 调用求和方法
addNumber(2, 3);
1
2
3
4
5
2
3
4
5
- 多行注释:以
/*
开头,*/
结尾 语法:/* 注释说明 */
/*
* 第一步:设置a, b值
* 第二步:调用addNumber()方法
*/
addNumber(2, 3);
1
2
3
4
5
2
3
4
5
- 方法注释:函数(方法)注释也是多行注释的一种,但是包含了特殊的注释要求。
语法:
/**
* 方法描述
* @param {type} 参数值 参数说明
* @param {type} 参数值 参数说明
*/
1
2
3
4
5
6
2
3
4
5
6
示例:
/**
* @param {number} a 参数a
* @param {Number} b 参数b
*/
function addNumber(a, b) {
return a + b;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
注意:方法里面不要使用多行注释。
# 格式规范
JS格式规范要严格遵循 Eslint
,要求在 husky
钩子中增加Eslint
规则校验,校验不通过,代码提交失败。
# 缩进
- 使用2个空格而不是 tab 来进行代码缩进,同时绝对不要混用空格和 tab。
# 行尾部空格
- 去除行末尾的多余空格。
# 换行
{}
花括号应该另起一行,左花括号与方法名、类名在同一行。(除了数组初始化时的花括号)if
、while
等语句,假如体内只有一句代码也不要省略{}
,为了方便以后的增删- 字符串过长考虑拆分成多行,每行不得超过
eslint
规范的最大长度。
// good
if (arr.length) {
console.log('good');
}
// bad
if (arr.length)
{
console.log('bad');
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 对齐
{}
括号等应该对齐- 类和方法的块注释必须紧贴类和方法
# 使用空格把运算符隔开
// bad
const x=y+5;
// good
const x = y + 5;
1
2
3
4
5
2
3
4
5
# 分号
- 必须使用分号。
# 其他规范
# 变量声明
对所有的变量优先使用const,可变的变量使用let,不允许使用var
// good
const a = 1;
const b = 2;
// good
let count = 1;
if (true) {
count += 1;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Strings
- 字符串使用单引号 ''
- 生成字符串时,使用模板字符串代替字符串连接
// bad
function sayHi(name) {
return 'How are you, ' + name + '?';
}
// good
function sayHi(name) {
return `How are you, ${name}?`;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 对象
使用字面值创建对象
// good
const obj = {};
// bad
const obj = new Object();
1
2
3
4
5
2
3
4
5
对象方法的简写
// bad
const atom = {
value: 1,
addValue: function (value) {
return atom.value + value;
},
};
// good
const atom = {
value: 1,
addValue(value) {
return atom.value + value;
},
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
对象属性值的简写
const lukeSkywalker = 'Hello World';
// bad
const obj = {
lukeSkywalker: lukeSkywalker
};
// good
const obj = {
lukeSkywalker
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 数组
使用字面值创建数组
// bad
const arr = new Array();
// good
const arr = [];
1
2
3
4
5
2
3
4
5
使用拓展运算符 ... 复制数组
// bad
const len = arr.length;
const arrCopy = [];
let i;
for (i = 0; i < len; i++) {
arrCopy[i] = arr[i];
}
// good
const arrCopy = [...arr];
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 解构
使用解构存取和使用多属性对象
// bad
function getFullName(user) {
const firstName = user.firstName;
const lastName = user.lastName;
return `${firstName} ${lastName}`;
}
// good
function getFullName(user) {
const {firstName, lastName} = user;
return `${firstName} ${lastName}`;
}
// best
function getFullName({firstName, lastName}) {
return `${firstName} ${lastName}`;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 函数
- 尽可能使用箭头函数
- 不允许在一个非函数代码块(if、while 等)中声明一个函数
- 使用函数声明代替函数表达式
因为函数声明是可命名的,所以他们在调用栈中更容易被识别。此外,函数声明会把整个函数提升(hoisted),而函数表达式只会把函数的引用变量名提升。这条规则使得箭头函数可以取代函数表达式。
1
// bad
const foo = function () {
};
// good
function foo() {
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 别保存 this 的引用。使用箭头函数或 Function#bind。
// bad
function foo() {
const that = this;
return function() {
console.log(that);
};
}
// good
function foo() {
return () => {
console.log(this);
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14