一、项目规范
- 项目命名 - 采用小写方式, 以中划线分隔
// bad
mall_management-system / mallManagementSystem
// good
mall-management-system
- 目录命名全部采用小写方式,以中划线分割,有复数结构时,要采用复数命名法
// bad
script / style / demo_scripts / demoStyles / imgs / docs
// good
scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc
【特殊】项目中的 components 中的组件目录,使用大驼峰的方式
- 文件名采用小写方式,以中划线分隔
// bad
renderDom.js / UserManagement.html
// good
render-dom.js / signup.css / index.html / company-logo.png
- 修改公共组件,需提前在群中告知
如:
-
-
@all 我需要修改 XXX 公用组件,大家请知晓;
-
条件允许:在该组件中写一个更新日志,写清楚改什么功能
-
二、代码规范
- css
1.1 id 采用驼峰式命名
1.2 less 中的变量、函数、混合、placeholder 采用驼峰式命名
1.3 选择器尽可能精准
// bad
.content .title {
font-size: 2rem;
}
// good
.content > .title {
font-size: 2rem;
}
1.4 颜色值和属性值使用rgba或者十六进制两种方式,有透明度的采用rgba,否则采用十六进制,十六进制数值能用简写需使用简写,并全部使用大写。
- 引用
2.1 使用 tabs (空格字符) 设置为 2 个空格
2.2 使用const定义常量;避免使用var
// bad
var a = 1
var b = 2
// good
const a = 1
const b = 2
2.3 如果你必须重新赋值你的引用, 使用 let 代替 var
- 对象
3.1使用字面语法来创建对象
// bad
const item = new Object();
// good
const item = {};
3.2 在创建具有动态属性名称的对象时使用计算属性名
3.3 使用对象方法的缩写
3.4 使用属性值的缩写
3.5 只使用引号标注无效标识符的属性
3.6 更喜欢对象扩展操作符,而不是用 Object.assign 浅拷贝一个对象。 使用对象的 rest 操作符来获得一个具有某些属性的新对象。
- 数组
4.1 使用字面语法创建数组
// bad
const items = new Array()
// good
const items = []
4.2 使用 Array#push 取代直接赋值来给数组添加项。
4.3 使用数组展开方法 ... 来拷贝数组。
4.4 将一个类数组对象转换成一个数组, 使用展开方法 ... 代替 Array.from
4.5 对于对迭代器的映射,使用 Array.from 替代展开方法 ... , 因为它避免了创建中间数组
4.6 在数组回调方法中使用 return 语句。 如果函数体由一个返回无副作用的表达式的单个语句组成,那么可以省略返回值
4.7 如果数组有多行,则在开始的时候换行,然后在结束的时候换行
- 解构
5.1 在访问和使用对象的多个属性的时候使用对象的解构
// 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}`
}
5.2 使用数组解构
5.3 对于多个返回值使用对象解构,而不是数组解构。
- 字符
6.1 使用单引号''定义字符串
// bad
const name = "Capt. Janeway"
// bad - 模板文字应该包含插值或换行。
const name = `Capt. Janeway`
// good
const name = 'Capt. Janeway'
6.2 当以编程模式构建字符串时,使用字符串模板代替字符串拼接
6.3 不要在字符串上使用 eval()
6.4 不要转义字符串中不必要的字符
- 函数
7.1 永远不要定义一个参数为arguments。 这将会优先于每个函数给定范围的arguments对象
// bad
function foo(name, options, arguments) {
// ...
}
// good
function foo(name, options, args) {
// ...
}
7.2 不要使用 arguments, 选择使用 rest 语法 ... 代替
7.3 使用默认的参数语法,而不是改变函数参数
7.4 总是把默认参数放在最后
- 模块
8.1 使用import导入模块(只引入需要的代码)
// bad
import airbnbGuide from './AirbnbStyleGuide'
airbnbGuide.isEqual()
// good
import { isEqual } from './AirbnbStyleGuide'
8.2 不要直接从导入导出
8.3 只从一个路径导入所有需要的东西
8.4 将所有的 imports 语句放在所有非导入语句的上边
- 属性
9.1 访问属性时使用点符号
const luke = {
jedi: true,
age: 28
}
// bad
const isJedi = luke['jedi']
// good
const isJedi = luke.jedi
9.2 使用变量访问属性时,使用 []表示法
- 变量
10.1 把const声明的放在一起,把let声明的放在一起
// bad
let i
const items = getItems()
let dragonball
const goSportsTeam = true
let len
// good
const goSportsTeam = true
const items = getItems()
let dragonball
let i
let length
- 比较运算符
11.1 使用===和!==而不是==和!=
11.2 对于布尔值使用简写,但是对于字符串和数字进行显式比较
// bad
if (isValid === true) {
// ...
}
// good
if (isValid) {
// ...
}
// bad
if (name) {
// ...
}
// good
if (name !== '') {
// ...
}
// bad
if (collection.length) {
// ...
}
// good
if (collection.length > 0) {
// ...
}
11.3 三目表达式不应该嵌套,通常是单行表达式
11.4 避免不必要的三目表达式
- 代码块
12.1 当有多行代码块的时候,使用大括号包裹
// bad
if (test)
return false
// good
if (test) return false
// good
if (test) {
return false
}
// bad
function foo() { return false }
// good
function bar() {
return false
}
12.2 如果一个 if 块总是执行一个 return 语句,那么接下来的 else 块就没有必要了。 如果一个包含 return 语句的 else if 块,在一个包含了 return 语句的 if 块之后,那么可以拆成多个 if 块。
- 空格
13.1 用空格分离操作符
// bad
const x=y+5
// good
const x = y + 5
13.2 使用单个换行符结束文件
13.3 在使用链式方法调用的时候使用缩进(超过两个方法链)。 使用一个引导点,强调该行是方法调用,而不是新的语句
13.4 不要在块的开头使用空白行
13.5 不要在括号内添加空格
13.6 不要在中括号中添加空格
13.7 在花括号内添加空格
13.8 逗号之前避免使用空格,逗号之后需要使用空格
13.9 在行的末尾避免使用空格
13.10 避免多个空行,并且只允许在文件末尾添加一个换行符
- 逗号
14.1 添加尾随逗号
// bad - 没有尾随逗号的 git 差异
const hero = {
firstName: 'Florence',
- lastName: 'Nightingale'
+ lastName: 'Nightingale',
+ inventorOf: ['coxcomb chart', 'modern nursing']
};
// good - 有尾随逗号的 git 差异
const hero = {
firstName: 'Florence',
lastName: 'Nightingale',
+ inventorOf: ['coxcomb chart', 'modern nursing'],
};
三、交互规范
新增:/add 有操作按钮
编辑:/edit/:id 有操作按钮
查看:/detail/:id 无操作按钮,只查看(待定)
路由定义(关键字)/:action/:id
// action: add | edit | detail
- Form 组件布局
-
- 在Modal 中的Form 布局使用horizontal ,一行一个FormItem
-
-
在Drawer 中的Form 布局使用 vertical ,一行两个FormItem
-
在表格上方如高级搜索中的Form 布局使用 inline
-
四、注释规范
- 变量注释
-
- 使用行内注释
-
- 对变量进行注释
- 函数注释
-
- 函数的描述
- 参数的类型和表示的含义
- 返回值的类型和表示的含义
- 函数内部的逻辑使用行内注释
/**
* 两数求和
* @param {number} a 数字a
* @param {number} b 数字b
* @return {number} 返回两数的和
*/
function add (a, b) {
// ...
return a + b
}
五、变量起名
- 常用动词
| 获取 | 设置 | 增加 | 删除 | 编辑 | 查看 | 打开 | 关闭 |
|---|---|---|---|---|---|---|---|
| get | set | add | delete | edit | view | open | close |
| 读取 | 写入 | 载入 | 保存 | 开始 | 结束 | 备份 | 恢复 |
| read | write | load | save | begin | end | backup | restore |
| 分割 | 合并 | 导入 | 导出 | 插入 | 清除 | 绑定 | 追加 |
| split | merge | import | export | insert | clear | bind | append |
| 清理 | 排序 | 选取 | 标记 | 复制 | 粘贴 | 撤销 | 重做 |
| clean | sort | select | mark | copy | paste | undo | redo |
| 暂停 | 启动 | 发布 | 解析 | 搜索 | 增加 | 减少 | 播放 |
| pause | launch | publish | parse | search | increase | decrease | play |
| 运行 | 编译 | 执行 | 提交 | 展开 | 折叠 | 监听 | 构建 |
| run | compile | execute | submit | expand | collapse | listen | build |
| 收集 | 编码 | 解码 | 加密 | 解密 | 压缩 | 解压缩 | 打包 |
| collect | encode | decode | encrypt | decrypt | compress | decompress | pack |
| 发出 | 连接 | 断开 | 发送 | 接收 | 下载 | 上传 | 刷新 |
| emit | connect | disconnect | send | receive | download | upload | refresh |
- 函数采用变量 + 名词的方式
// 获取模型列表 getModelList
// 查看模型详情 getModelDetail
// 新增模型 addModel
// 编辑模型 editModel
// 删除模型 delModel
- 避免单字母的名字。用你的命名来描述功能
// bad
function q() {
// ...
}
// good
function query() {
// ...
}
- 在命名对象、函数和实例时使用驼峰命名法(和数据库有关的可以使用下划线)
- 不要使用前置或者后置下划线
// bad
this.__firstName__ = 'Panda';
this.firstName_ = 'Panda';
this._firstName = 'Panda';
// good
this.firstName = 'Panda';
- 不要保存
this的引用。 使用箭头函数或者 函数#bind。
// bad
function foo() {
const that = this;
return function () {
console.log(that);
};
}
// good
function foo() {
return () => {
console.log(this);
};
}
六、 Vue项目规范
- 一个文件声明一个组件并只导出一个组件
- 组件名称和定义该组件的文件名称建议要保持一致
// bad
import GlobalFotter from './Footer
// good
import Footer from './Footer';
- 组件名称: 推荐使用大驼峰命名
- 当标签没有子元素的时候,始终使用自闭合的标签
// bad
<Component></Component>
// good
<Component />
- 如果标签有多行属性,关闭标签要另起一行
// bad
<Component
bar="bar"
baz="baz" />
// good
<Component
bar="bar"
baz="baz"
/>
- 使用下列的对齐方式
// goood
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
/>
// 如果组件的属性可以放在一行(一个属性时)就保持在当前一行中
<Foo bar="bar" />
// 多行属性采用缩进
<Foo
superLongParam="bar"
anotherSuperLongParam="baz"
>
<Quux />
</Foo>
- Template 的属性都采用双引号,其他的 JS 都使用单引号
// bad
<Foo bar='bar' />
// good
<Foo bar="bar" />
- 列表循环中禁止用index 作为key 值, 可以使用内容作为key 值
// bad
<li for="(item, index) in list" :key="index"></li>
// good
<li for="(item, index) in list" :key="item"></li>
七、vscode设置
// 在vscode编辑器中增加如下设置(ctrl+,)
"editor.codeActionsOnSave": {
"editor.formatOnSave": true,
"source.fixAll.eslint": true
},