# Nodejs 开发规范

  • 所有的查询使用 get 请求,所有的操作使用 post 请求,所有 post 请求必须有日志类型

# 代码规范

# 有关命名

尽量保证命名更加语义化
1

# 文件名

  • 文件命名采用下划线命名法
// good
service_center.js

// bad
serviceCenter.js
1
2
3
4
5

# 类 & 构造函数命名

  • 类命名采用 Pascal命名法,大写字母开头,各个单词首字母大写
class Person {
  constructor(name) {
    this.name = name;
  }
}
const person = new Person('小明');
1
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

# 变量命名

  • 采用 Camel命名法,小写字母开头,各个单词首字母大写
  • 特有大写缩写词汇保持大写如:SQL, URL等
  • 变量名字不宜过长,可适当采用缩减英文元音字母来缩短长度
  • 前缀应当是名词(方法名前缀为动词,以此区分变量和方法)
// good
let maxLength = 10;

// bad
let setLength = 10;
1
2
3
4
5

# 常量命名

  • 必须采用 全大写命名,且单词以_分割
const MAX_COUNT = 10;
const SQL = 'SELECT * from bas_table';
1
2

# 注释规范

团队成员都应该形成良好的写注释的习惯,方便阅读以及为了其他成员顺利了解项目
1

JS支持三种不同类型的注释:行内注释,单行注释以及多行注释。

  1. 行内注释:行内注释以两个斜线开始,以行尾结束。双斜线与代码以及注释文字之间都都保留一个空格。 语法:code // 行内注释
function addNumber() {
  return 3 + 2; // 5
}
1
2
3
  1. 单行注释:单独一行,单行注释以两个斜线开始,以行尾结束。
function addNumber(a, b) {
  return a + b;
}
// 调用求和方法
addNumber(2, 3);
1
2
3
4
5
  1. 多行注释:以 /* 开头,*/结尾 语法:/* 注释说明 */
/*
 * 第一步:设置a, b值
 * 第二步:调用addNumber()方法
 */
  addNumber(2, 3);
1
2
3
4
5
  1. 方法注释:函数(方法)注释也是多行注释的一种,但是包含了特殊的注释要求。

语法:

/**
 * 方法描述
 * @param {type} 参数值 参数说明
 * @param {type} 参数值 参数说明
 */

1
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

注意:方法里面不要使用多行注释。

# 格式规范

JS格式规范要严格遵循 Eslint,要求在 husky 钩子中增加Eslint规则校验,校验不通过,代码提交失败。

# 缩进

  • 使用2个空格而不是 tab 来进行代码缩进,同时绝对不要混用空格和 tab。

# 行尾部空格

  • 去除行末尾的多余空格。

# 换行

  • {}花括号应该另起一行,左花括号与方法名、类名在同一行。(除了数组初始化时的花括号)
  • ifwhile等语句,假如体内只有一句代码也不要省略 {},为了方便以后的增删
  • 字符串过长考虑拆分成多行,每行不得超过 eslint 规范的最大长度。
// good
if (arr.length) {
  console.log('good');
}
// bad
if (arr.length)
{
  console.log('bad');
}
1
2
3
4
5
6
7
8
9

# 对齐

  • {}括号等应该对齐
  • 类和方法的块注释必须紧贴类和方法

# 使用空格把运算符隔开

// bad
const x=y+5;

// good
const x = y + 5;
1
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

# 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

# 对象

使用字面值创建对象

// good
const obj = {};

// bad
const obj = new Object();
1
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

对象属性值的简写

const lukeSkywalker = 'Hello World';

// bad
const obj = {
  lukeSkywalker: lukeSkywalker
};

// good
const obj = {
  lukeSkywalker
};
1
2
3
4
5
6
7
8
9
10
11

# 数组

使用字面值创建数组

// bad
const arr = new Array();

// good
const arr = [];
1
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

# 解构

使用解构存取和使用多属性对象

// 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

# 函数

  • 尽可能使用箭头函数
  • 不允许在一个非函数代码块(if、while 等)中声明一个函数
  • 使用函数声明代替函数表达式
因为函数声明是可命名的,所以他们在调用栈中更容易被识别。此外,函数声明会把整个函数提升(hoisted),而函数表达式只会把函数的引用变量名提升。这条规则使得箭头函数可以取代函数表达式。
1
// bad
const foo = function () {
};

// good
function foo() {
}
1
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