代码编码规范

76 阅读9分钟

(一)命名规范

1.1.1 项目命名

全部采用小写方式, 以中划线分隔。

正例:mall-management-system

反例:mall_management-system / mallManagementSystem

1.1.2 目录命名

全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数

正例: scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc

反例: script / style / demo_scripts / demoStyles / imgs / docs

【特殊】VUE 的项目中的 components 中的组件目录,使用 kebab-case 命名

正例: head-search / page-loading / authorized / notice-icon

反例: HeadSearch / PageLoading

【特殊】VUE 的项目中的除 components 组件目录外的所有目录也使用 kebab-case 命名
正例: page-one / shopping-car / user-management

反例: ShoppingCar / UserManagement

1.1.3 JS、CSS、SCSS、HTML、PNG 文件命名

全部采用小写方式, 以中划线分隔

正例: render-dom.js / signup.css / index.html / company-logo.png

反例: renderDom.js / UserManagement.html

1.1.4 命名严谨性

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用

正例:henan / luoyang / rmb 等国际通用的名称,可视同英文。

反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

杜绝完全不规范的缩写,避免望文不知义:

反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。

(二)HTML 规范 (Vue Template 同样适用)

1.2.1 HTML 类型

推荐使用 HTML5 的文档类型申明: .
(建议使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的属性,比如 application/xhtml+xml 在浏览器中的应用支持与优化空间都十分有限)。

  • 规定字符编码
  • IE 兼容模式
  • 规定字符编码
  • doctype 大写

正例:

Page titlePage title
CompanyCompany

1.2.2 缩进

缩进使用 2 个空格(一个 tab)

嵌套的节点应该缩进。

1.2.3 分块注释

在每一个块状元素,列表元素和表格元素后,加上一对 HTML 注释。注释格式


### 1.2.4 语义化标签

HTML5 中新增很多语义化标签,所以优先使用语义化标签,避免一个页面都是 div 或者 p 标签

正例

|   | <header></header> |   | <header></header> |
| - | ------------------- | - | ------------------- |
|   | <footer></footer> |   | <footer></footer> |

反例

|   | <div>    |   | <div>    |
| - | --------- | - | --------- |
|   | <p></p> |   | <p></p> |
|   | </div>   |   | </div>   |

#### 1.2.5 引号

使用双引号(" ") 而不是单引号(’ ') 。

正例: ``

反例: ``

### (三) CSS 规范

#### 1.3.1 命名

-   类名使用小写字母,以中划线分隔
-   id 采用驼峰式命名
-   scss 中的变量、函数、混合、placeholder 采用驼峰式命名

ID 和 class 的名称总是使用可以反应元素目的和用途的名称,或其他通用的名称,代替表象和晦涩难懂的名称

不推荐:

|   | .fw-800 {         |   | .fw-800 {         |
| - | ----------------- | - | ----------------- |
|   | font-weight: 800; |   | font-weight: 800; |
|   | }                 |   | }                 |
|   |                   |   |                   |
|   | .red {            |   | .red {            |
|   | color: red;       |   | color: red;       |
|   | }                 |   | }                 |

推荐:

|   | .heavy {          |   | .heavy {          |
| - | ----------------- | - | ----------------- |
|   | font-weight: 800; |   | font-weight: 800; |
|   | }                 |   | }                 |
|   |                   |   |                   |
|   | .important {      |   | .important {      |
|   | color: red;       |   | color: red;       |
|   | }                 |   | }                 |

#### 1.3.2 选择器

1)css 选择器中避免使用标签名  
从结构、表现、行为分离的原则来看,应该尽量避免 css 中出现 HTML 标签,并且在 css 选择器中出现标签名会存在潜在的问题。

2)很多前端开发人员写选择器链的时候不使用 直接子选择器(注:直接子选择器和后代选择器的区别)。有时,这可能会导致疼痛的设计问题并且有时候可能会很耗性能。然而,在任何情况下,这是一个非常不好的做法。如果你不写很通用的,需要匹配到 DOM 末端的选择器, 你应该总是考虑直接子选择器。

不推荐:

|   | .content .title { |   | .content .title { |
| - | ----------------- | - | ----------------- |
|   | font-size: 2rem;  |   | font-size: 2rem;  |
|   | }                 |   | }                 |

推荐:

|   | .content > .title { |   | .content > .title { |
| - | ------------------- | - | ------------------- |
|   | font-size: 2rem;    |   | font-size: 2rem;    |
|   | }                   |   | }                   |

#### 1.3.3 尽量使用缩写属性

不推荐:

|   | border-top-style: none;                |   | border-top-style: none;                |
| - | -------------------------------------- | - | -------------------------------------- |
|   | font-family: palatino, georgia, serif; |   | font-family: palatino, georgia, serif; |
|   | font-size: 100%;                       |   | font-size: 100%;                       |
|   | line-height: 1.6;                      |   | line-height: 1.6;                      |
|   | padding-bottom: 2em;                   |   | padding-bottom: 2em;                   |
|   | padding-left: 1em;                     |   | padding-left: 1em;                     |
|   | padding-right: 1em;                    |   | padding-right: 1em;                    |
|   | padding-top: 0;                        |   | padding-top: 0;                        |

推荐:

|   | border-top: 0;                           |   | border-top: 0;                           |
| - | ---------------------------------------- | - | ---------------------------------------- |
|   | font: 100%/1.6 palatino, georgia, serif; |   | font: 100%/1.6 palatino, georgia, serif; |
|   | padding: 0 1em 2em;                      |   | padding: 0 1em 2em;                      |

#### 1.3.4 每个选择器及属性独占一行

不推荐:

|   | button{                                                |   | button{                                                |
| - | ------------------------------------------------------ | - | ------------------------------------------------------ |
|   | width:100px;height:50px;color:#fff;background:#00a0e9; |   | width:100px;height:50px;color:#fff;background:#00a0e9; |
|   | }                                                      |   | }                                                      |

推荐:

|   | button{             |   | button{             |
| - | ------------------- | - | ------------------- |
|   | width:100px;        |   | width:100px;        |
|   | height:50px;        |   | height:50px;        |
|   | color:#fff;         |   | color:#fff;         |
|   | background:#00a0e9; |   | background:#00a0e9; |
|   | }                   |   | }                   |

#### 1.3.5 省略0后面的单位

不推荐:

|   | div{                 |   | div{                 |
| - | -------------------- | - | -------------------- |
|   | padding-bottom: 0px; |   | padding-bottom: 0px; |
|   | margin: 0em;         |   | margin: 0em;         |
|   | }                    |   | }                    |

推荐:

|   | div{               |   | div{               |
| - | ------------------ | - | ------------------ |
|   | padding-bottom: 0; |   | padding-bottom: 0; |
|   | margin: 0;         |   | margin: 0;         |
|   | }                  |   | }                  |

#### 1.3.6 避免使用ID选择器及全局标签选择器防止污染全局样式

不推荐:

|   | #header{            |   | #header{            |
| - | -------------------- | - | -------------------- |
|   | padding-bottom: 0px; |   | padding-bottom: 0px; |
|   | margin: 0em;         |   | margin: 0em;         |
|   | }                    |   | }                    |

推荐:

|   | .header{             |   | .header{             |
| - | -------------------- | - | -------------------- |
|   | padding-bottom: 0px; |   | padding-bottom: 0px; |
|   | margin: 0em;         |   | margin: 0em;         |
|   | }                    |   | }                    |

### (四) LESS 规范

#### 1.4.1 代码组织

##### 1)将公共less文件放置在style/less/common文件夹

例:// color.less,common.less

##### 2)按以下顺序组织

1、@import;  
2、变量声明;  
3、样式声明;

|   | @import "mixins/size.less"; |   | @import "mixins/size.less"; |
| - | --------------------------- | - | --------------------------- |
|   |                             |   |                             |
|   | @default-text-color: #333;  |   | @default-text-color: #333;  |
|   |                             |   |                             |
|   | .page {                     |   | .page {                     |
|   | width: 960px;               |   | width: 960px;               |
|   | margin: 0 auto;             |   | margin: 0 auto;             |
|   | }                           |   | }                           |

#### 1.4.2 避免嵌套层级过多

将嵌套深度限制在3级。对于超过4级的嵌套,给予重新评估。这可以避免出现过于详实的CSS选择器。  
避免大量的嵌套规则。当可读性受到影响时,将之打断。推荐避免出现多于20行的嵌套规则出现

不推荐:

|   | .main{     |   | .main{     |
| - | ---------- | - | ---------- |
|   | .title{    |   | .title{    |
|   | .name{     |   | .name{     |
|   | color:#fff |   | color:#fff |
|   | }          |   | }          |
|   | }          |   | }          |
|   | }          |   | }          |

推荐:

|   | .main-title{ |   | .main-title{ |
| - | ------------ | - | ------------ |
|   | .name{       |   | .name{       |
|   | color:#fff   |   | color:#fff   |
|   | }            |   | }            |
|   | }            |   | }            |

### (五) Javascript 规范

#### 1.5.1 命名

##### 1) 采用小写驼峰命名 lowerCamelCase,代码中的命名均不能以下划线,也不能以下划线或美元符号结束

反例: _name / name_ / name$

##### 2) 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。

正例: localValue / getHttpMessage() / inputUserId

****其中 method 方法命名必须是 动词 或者 动词+名词 形式****

正例:saveShopCarData /openShopCarInfoDialog

反例:save / open / show / go

****特此说明,增删查改,详情统一使用如下 5 个单词,不得使用其他(目的是为了统一各个端)****

add / update / delete / detail / get

**附: 函数方法常用的动词:**

|   | get 获取/set 设置,             |   | get 获取/set 设置,             |
| - | -------------------------- | - | -------------------------- |
|   | add 增加/remove 删除           |   | add 增加/remove 删除           |
|   | create 创建/destory 移除       |   | create 创建/destory 移除       |
|   | start 启动/stop 停止           |   | start 启动/stop 停止           |
|   | open 打开/close 关闭,          |   | open 打开/close 关闭,          |
|   | read 读取/write 写入           |   | read 读取/write 写入           |
|   | load 载入/save 保存,           |   | load 载入/save 保存,           |
|   | create 创建/destroy 销毁       |   | create 创建/destroy 销毁       |
|   | begin 开始/end 结束,           |   | begin 开始/end 结束,           |
|   | backup 备份/restore 恢复       |   | backup 备份/restore 恢复       |
|   | import 导入/export 导出,       |   | import 导入/export 导出,       |
|   | split 分割/merge 合并          |   | split 分割/merge 合并          |
|   | inject 注入/extract 提取,      |   | inject 注入/extract 提取,      |
|   | attach 附着/detach 脱离        |   | attach 附着/detach 脱离        |
|   | bind 绑定/separate 分离,       |   | bind 绑定/separate 分离,       |
|   | view 查看/browse 浏览          |   | view 查看/browse 浏览          |
|   | edit 编辑/modify 修改,         |   | edit 编辑/modify 修改,         |
|   | select 选取/mark 标记          |   | select 选取/mark 标记          |
|   | copy 复制/paste 粘贴,          |   | copy 复制/paste 粘贴,          |
|   | undo 撤销/redo 重做            |   | undo 撤销/redo 重做            |
|   | insert 插入/delete 移除,       |   | insert 插入/delete 移除,       |
|   | add 加入/append 添加           |   | add 加入/append 添加           |
|   | clean 清理/clear 清除,         |   | clean 清理/clear 清除,         |
|   | index 索引/sort 排序           |   | index 索引/sort 排序           |
|   | find 查找/search 搜索,         |   | find 查找/search 搜索,         |
|   | increase 增加/decrease 减少    |   | increase 增加/decrease 减少    |
|   | play 播放/pause 暂停,          |   | play 播放/pause 暂停,          |
|   | launch 启动/run 运行           |   | launch 启动/run 运行           |
|   | compile 编译/execute 执行,     |   | compile 编译/execute 执行,     |
|   | debug 调试/trace 跟踪          |   | debug 调试/trace 跟踪          |
|   | observe 观察/listen 监听,      |   | observe 观察/listen 监听,      |
|   | build 构建/publish 发布        |   | build 构建/publish 发布        |
|   | input 输入/output 输出,        |   | input 输入/output 输出,        |
|   | encode 编码/decode 解码        |   | encode 编码/decode 解码        |
|   | encrypt 加密/decrypt 解密,     |   | encrypt 加密/decrypt 解密,     |
|   | compress 压缩/decompress 解压缩 |   | compress 压缩/decompress 解压缩 |
|   | pack 打包/unpack 解包,         |   | pack 打包/unpack 解包,         |
|   | parse 解析/emit 生成           |   | parse 解析/emit 生成           |
|   | connect 连接/disconnect 断开,  |   | connect 连接/disconnect 断开,  |
|   | send 发送/receive 接收         |   | send 发送/receive 接收         |
|   | download 下载/upload 上传,     |   | download 下载/upload 上传,     |
|   | refresh 刷新/synchronize 同步  |   | refresh 刷新/synchronize 同步  |
|   | update 更新/revert 复原,       |   | update 更新/revert 复原,       |
|   | lock 锁定/unlock 解锁          |   | lock 锁定/unlock 解锁          |
|   | check out 签出/check in 签入,  |   | check out 签出/check in 签入,  |
|   | submit 提交/commit 交付        |   | submit 提交/commit 交付        |
|   | push 推/pull 拉,             |   | push 推/pull 拉,             |
|   | expand 展开/collapse 折叠      |   | expand 展开/collapse 折叠      |
|   | begin 起始/end 结束,           |   | begin 起始/end 结束,           |
|   | start 开始/finish 完成         |   | start 开始/finish 完成         |
|   | enter 进入/exit 退出,          |   | enter 进入/exit 退出,          |
|   | abort 放弃/quit 离开           |   | abort 放弃/quit 离开           |
|   | obsolete 废弃/depreciate 废旧, |   | obsolete 废弃/depreciate 废旧, |
|   | collect 收集/aggregate 聚集    |   | collect 收集/aggregate 聚集    |

##### 3) 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。

正例: MAX_STOCK_COUNT

反例: MAX_COUNT

#### 1.5.2 代码格式

##### 1) 使用 2 个空格进行缩进

正例:

|   | if (x < y) { |   | if (x < y) { |
| - | ------------ | - | ------------ |
|   | x += 10;     |   | x += 10;     |
|   | } else {     |   | } else {     |
|   | x += 1;      |   | x += 1;      |
|   | }            |   | }            |

##### 2) 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。

说明:任何情形,没有必要插入多个空行进行隔开。

#### 1.5.3 字符串

统一使用单引号(‘),不使用双引号(“)。这在创建 HTML 字符串非常有好处:

正例:

|   | let str = 'foo';                         |   | let str = 'foo';                         |
| - | ---------------------------------------- | - | ---------------------------------------- |
|   | let testDiv = '<div id="test"></div>'; |   | let testDiv = '<div id="test"></div>'; |

反例:

|   | let str = 'foo';                         |   | let str = 'foo';                         |
| - | ---------------------------------------- | - | ---------------------------------------- |
|   | let testDiv = "<div id='test'></div>"; |   | let testDiv = "<div id='test'></div>"; |

#### 1.5.4 对象声明

##### 1)使用字面值创建对象

正例: let user = {};

反例: let user = new Object();

##### 2) 使用字面量来代替对象构造器

正例:

|   | var user = { |   | var user = { |
| - | ------------ | - | ------------ |
|   | age: 0,      |   | age: 0,      |
|   | name: 1,     |   | name: 1,     |
|   | city: 3      |   | city: 3      |
|   | };           |   | };           |

反例:

|   | var user = new Object(); |   | var user = new Object(); |
| - | ------------------------ | - | ------------------------ |
|   | user.age = 0;            |   | user.age = 0;            |
|   | user.name = 0;           |   | user.name = 0;           |
|   | user.city = 0;           |   | user.city = 0;           |

#### 1.5.5 使用 ES6,7

必须优先使用 ES6,7 中新增的语法糖和函数。这将简化你的程序,并让你的代码更加灵活和可复用。

必须强制使用 ES6, ES7 的新语法,比如箭头函数、await/async , 解构, let , for…of 等等

#### 1.5.6 括号

下列关键字后必须有大括号(即使代码块的内容只有一行):if, else, for, while, do, switch, try, catch, finally, with。

正例:

|   | if (condition) { |   | if (condition) { |
| - | ---------------- | - | ---------------- |
|   | doSomething();   |   | doSomething();   |
|   | }                |   | }                |

反例:

if (condition) doSomething();

#### 1.5.7 undefined 判断

永远不要直接使用 undefined 进行变量判断;使用 typeof 和字符串’undefined’对变量进行判断。

正例:

|   | if (typeof person === 'undefined') { |   | if (typeof person === 'undefined') { |
| - | ------------------------------------ | - | ------------------------------------ |
|   | ...                                  |   | ...                                  |
|   | }                                    |   | }                                    |

反例:

|   | if (person === undefined) { |   | if (person === undefined) { |
| - | --------------------------- | - | --------------------------- |
|   | ...                         |   | ...                         |
|   | }                           |   | }                           |

#### 1.5.8 条件判断和循环最多三层

条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但是谨记不要写太长的三目运算符。如果超过 3 层请抽成函数,并写清楚注释。

#### 1.5.9 this 的转换命名

对上下文 this 的引用只能使用’self’来命名

#### 1.5.10 慎用 console.log

因 console.log 大量使用会有性能问题,所以在非 webpack 项目中谨慎使用 log 功能