对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。——引用自《阿里规约》
一、命名规范
分类
camelCase (驼峰式,也叫小驼峰命名, e.g. userInfo )
PascalCase (帕斯卡命名式,也叫大驼峰命名, e.g. UserInfo )
kebab-case (短横线连接式, e.g. user-info )
snake_case (下划线连接式, e.g. user_info )
项目命名
全部采用小写方式, 以中划线分隔。
正确示例:lvji-web-pc
错误示例:lvji_web_pc / LvjiWebPc
目录命名
全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数
正确示例 | 错误示例 | 说明 |
---|---|---|
components | Components | 业务通用组件 |
images | Images | 图片库 |
utils | Utils | 工具库 |
demo-styles | Demo_styles | 示例样式 |
demo-scripts | Demo_scripts | 示例脚本 |
【特殊】组件目录使用 PascalCase ,其他目录统一使用 kebab-case 风格
正确示例: head-search / page-loading / authorized / notice-icon
错误示例: HeadSearch / PageLoading
JS、CSS、SCSS、HTML、PNG 文件命名
全部采用小写方式, 以中划线分隔
正确示例: render-dom.js / signup.css / index.html / company-logo.png
错误示例: renderDom.js / UserManagement.html
命名严谨性
代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用
正确示例:henan / luoyang / rmb 等国际通用的名称,可视同英文。
错误示例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 年龄 = 22
杜绝完全不规范的缩写,避免可读性的问题:
错误示例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成condi,此类随意缩写严重降低了代码的可阅读性。
二、HTML 规范
HTML 类型
推荐使用 HTML5 的文档类型申明: .
(建议使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的属性,比如 application/xhtml+xml 在浏览器中的应用支持与优化空间都十分限)。
- 规定字符编码
- IE 兼容模式
- 规定字符编码
- doctype 大写
正确示例:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta charset="UTF-8" />
<title>Page title</title>
</head>
<body>
<img src="images/company-logo.png" alt="Company" />
</body>
</html>
缩进
- 缩进使用 2 个空格(一个 tab)
- 嵌套的节点应该缩进。
语义化标签
HTML5 中新增很多语义化标签,所以优先使用语义化标签,避免一个页面都是 div 或者 p标签<!--正确示例-->
<header></header>
<footer></footer>
<!--错误示例-->
<div>
<p></p>
</div>
三、CSS 规范
命名
- 类名使用小写字母,以中划线分隔
- id 采用驼峰式命名
- less 中的变量、函数、混合、placeholder 采用驼峰式命名
ID 和 class的名称总是使用可以反应元素目的和用途的名称,或其他通用的名称。
/* 不推荐:*/
.fw-800 {
font-weight: 800;
}
.red {
color: red;
}
/* 推荐: */
.heavy { // 若粗体只有一种,则采用heavy,如多种,则采用以上方案
font-weight: 800;
}
.important { // 意味着重点标记的文字
color: red;
}
选择器
1) css 选择器中避免使用标签名
从结构、表现、行为分离的原则来看,应该尽量避免 css 中出现 HTML 标签,并且在 css 选择器中出现标签名会存在潜在的问题。
2) 很多前端开发人员写选择器链的时候不使用直接子选择器。有时,这可能会导致疼痛的设计问题并且有时候可能会很耗性能。然而,在任何情况下,这是一个非常不好的做法。如果你不写很通用的,需要匹配到 DOM 末端的选择器, 你应该总是考虑直接子选择器。
- 注:直接子选择器和后代选择器的区别
- 直接子选择器:用于选择指定标签元素的第一代子元素
- 后代选择器:用于选择指定标签元素下的后辈元素
/* 不推荐:*/
.content .title {
font-size: 2rem;
}
/* 推荐: */
.content > .title {
font-size: 2rem;
}
尽量使用缩写属性
```css / 不推荐:/ border-top-style: none; font-family: palatino, georgia, serif; font-size: 100%; line-height: 1.6; padding-bottom: 2em; padding-left: 1em; padding-right: 1em; padding-top: 0;
/ 推荐: / border-top: 0; font: 100%/1.6 palatino, georgia, serif; padding: 0 1em 2em;
<a name="r2Kpx"></a>
### 每个选择器及属性独占一行
```css
/* 不推荐:*/
button{
width:100px;height:50px;color:#fff;background:#00a0e9;
}
/* 推荐: */
button{
width:100px;
height:50px;
color:#fff;
background:#00a0e9;
}
省略0后面的单位
/* 不推荐:*/
div{
padding-bottom: 0px;
margin: 0em;
}
/* 推荐: */
div{
padding-bottom: 0;
margin: 0;
}
避免使用ID选择器及全局标签选择器防止污染全局样式#
/* 不推荐:*/
#header{
padding-bottom: 0px;
margin: 0em;
}
/* 推荐: */
.header{
padding-bottom: 0px;
margin: 0em;
}
四、Less规范
代码组织
1)将公共less文件放置在style/less/common文件夹
例:// color.less,common.less
2)按以下顺序组织
1、@import;
2、变量声明;
3、样式声明;
@import "mixins/size.less";
@default-text-color: #333;
.page {
width: 960px;
margin: 0 auto;
}
避免嵌套层级过多
将嵌套深度限制在3级。对于超过4级的嵌套,给予重新评估。这可以避免出现过于详实的CSS选择器。
避免大量的嵌套规则。当可读性受到影响时,将之打断。推荐避免出现多于20行的嵌套规则出现
/* 不推荐:*/
.main{
.title{
.name{
color:#fff
}
}
}
/* 推荐: */
.main-title{
.name{
color:#fff
}
}
五、Javascript 规范
命名
1) 变量采用驼峰式命名 camelCase, 常量使用全大写,用Class采用 PascalCase
正确示例:
let thisIsMyName;
const MAX_COUNT = 10;
Class Person { }
2)变量声明一个函数作用域中所有的变量声明尽量提到函数首部。优先使用块级变量 let 和 const ,如无需修改的常量使用 const
**
3) 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase风格,必须遵从驼峰形式。
正确示例: localValue / getHttpMessage() / inputUserId
其中 method 方法命名必须是 动词 或者 动词+名词 形式
正确示例:saveShopCarData /openShopCarInfoDialog
错误示例:save / open / show / go
特此说明,增删查改,详情统一使用如下 5个单词,不得使用其他(目的是为了统一各个端)
add / update / delete / detail / get
文末函数方法常用的动词
4) 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正确示例: MAX_STOCK_COUNT
错误示例: MAX_COUNT
代码格式(工具格式化)
1) 使用 2 个空格进行缩进
//正确示例:
if (x < y) {
x += 10;
} else {
x += 1;
}
_
2)单行长度单行长度不得超过 100,超过部分需要换行
3)统一加分号
4)空格
- 三元运算符’?:’前后逗号后必须要有空格
- 代码块 ‘{‘ 前下列关键字前:else, while, catch, finally 下列关键字后:if,else, for, while, do, switch, case, try,catch, finally, with, return, typeof
- 单行注释’//‘后(若单行注释和代码同行,则’//‘前也需要),
- 多行注释’*’后 对象的属性值前
- for循环,分号后留有一个空格,前置条件如果有多个,逗号后留一个空格无论是函数声明还是函数表达式,
- ‘{‘前一定要有空格
- 函数的参数之间
5)空行
- 变量声明后(当变量声明在代码块的最后一行时,则无需空行)
- 注释前(当注释在代码块的第一行时,则无需空行)
- 定义函数前
- 文件最后保留一个空行
6) 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。
说明:任何情形,没有必要插入多个空行进行隔开。
对象声明
1) 使用字面值创建对象
正确示例: let user = {};
错误示例: let user = new Object();
2) 使用字面量来代替对象构造器
// 正确示例:
var user = {
age: 0,
name: 1,
city: 3
};
// 错误示例:
var user = new Object();
user.age = 0;
user.name = 0;
user.city = 0;
使用 ES6,7
必须优先使用 ES6,7中新增的语法糖和函数。这将简化你的程序,并让你的代码更加灵活和可复用。
必须强制使用 ES6, ES7 的新语法,比如箭头函数、await/async , 解构, let ,for…of 等等
括号(工具格式化)
下列关键字后必须有大括号(即使代码块的内容只有一行):if, else, for, while, do,switch, try, catch, finally, with。
// 正确示例:
if (condition) {
doSomething();
}
// 错误示例:
if (condition) doSomething();
undefined 判断
永远不要直接使用 undefined 进行变量判断;使用 typeof和字符串’undefined’对变量进行判断。
// 正确示例:
if (typeof person === 'undefined') {
...
}
// 错误示例:
if (person === undefined) {
...
}
条件判断和循环最多三层
条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但是谨记不要写太长的三目运算符。如果超过3 层请抽成函数,并写清楚注释。
// 正确示例
company === patera ? ‘Yes’ : ‘No’
id && this.fetchData()
// 错误示例
item.sharedStatus === 0 ? '10px solid #fff' : item.sharedStatus === 1 ? '10px solid #e3effa' : item.sharedStatus === 2 ? '10px solid #f9f0ee' : item.sharedStatus === 3 ? '10px solid #eaf6df' : ''
注释规范
基础篇
1、 HTML 中的注释(分块注释)
在每一个块状元素,列表元素和表格元素后,加上一对 HTML 注释。注释格式
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta charset="UTF-8" />
<title>Page title</title>
</head>
<body>
<div class="page-wrapper">
<header></header>
<main>
<!--模块一表格-->
<div class="page-module"></div>
<!--模块一列表-->
<div class="page-module"></div>
</main>
<footer></footer>
</div>
</body>
</html>
2、CSS 中的注释
在 .html 文件中
<style>
div {
/* color: #fff; */
}
</style>
复制代码
在 .css 文件中
div {
/* color: #fff; */
}
复制代码
在 .less 或 .scss 文件中
div {
/* color: #fff;*/ /* 多行注释*/
// font-size: 14px; // 单行注释
background: #000;
}
注意点:
在 MDN 中关于 CSS 注释只有
/* */
一种语法。但是在 LESS 和 SCSS 中支持注释的语法和 JS 中保持一致,有单行注释//
和多行注释/* */
两种。单行注释编译之后不会被保留。
3、JS 中的注释
1)单行注释
- 注释单独一行的情况下,注释的//后面要跟一个空格
- 注释如果和代码同一行,代码分号结束后,要跟一个空格,注释的//后也要跟一个空格
- 单行注释为什么有时候写在代码上方,有时候写在代码后方?一般写在代码上方的时候意为对后面一段代码的注释,而写在代码后方的时候意为对本行代码的注释
_// 调用函数
Foo()
Let maxCount = 10; // 这是一个变量
2)多行注释尽量使用单行注释代替多行注释
/*
这是多行注释
定义一个数组
*/
var ary = [];
3)函数注释
/**
* 方法说明
* @method 方法名
* @for 所属类名
* @param {参数类型} 参数名 参数说明
* @return {返回值类型} 返回值说明
*/
const onSubmit = (params = {}) => {
const result = false;
if (params) {
result = true;
}
return result;
};
函数注释建议在以下几种情况使用:
- 难于理解的代码段(涉及到算法和设计模式)
- 可能存在错误的代码段业务逻辑强相关的代码函数注释
- 复杂的函数,所有类,都必须进行函数注释,函数注释使用业界统一的规范,方便后续使用 jsdoc 生成文档。最好配置VSCode自动生成模板
4)必要注释
- 公共组件使用说明
- api 目录的接口 js 文件必须加注释
- store 中的 state, mutation, action 等必须加注释
- vue 文件中的 template 必须加注释,若文件较大添加 start end 注释
- vue 文件的 methods,每个 method 必须添加注释
- vue 文件的 data, 非常见单词要加注释
5)文件注释
- 位于文件头部,一般包含概要、作者、版本改动信息以及修改时间等内容
/*
* 简述当前文件功能
* @author 作者名称
* @version 版本号 最近编辑时间
* @description 该版本改动信息
*/
4、特殊标记注释
- TODO 在该注释处有功能代码待编写,待实现的功能在说明中会简略说明
- FIXME 在该注释处代码需要修正,甚至代码是错误的,不能工作,需要修复,如何修正会在说明中简略说明
- XXX 在该注释处代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进,要改进的地方会在说明中简略说明
- NOTE 在该注释处说明代码如何工作
- HACK 在该注释处编写得不好或格式错误,需要根据自己的需求去调整程序代码
- BUG 在该注释处有 Bug
// TODO 功能未完成,待完善
// FIXME 待修复
// XXX 实现方法待确认
// NOTE 代码功能说明
// HACK 此处写法有待优化
// BUG 此处有 Bug
const arr = []
注释相关插件
在这里推荐几个比较好用的注释相关的 Vscode 插件,可在 setting.json
文件下自定义设置(可通过 ‘文件—首选项—设置’,打开 Vscode 文件 settings.json
)
- koroFileHeader 在vscode中用于生成文件头部注释和函数注释的插件
文件头部添加注释
- 在文件开头添加注释,记录文件信息/文件的传参/出参等
- 支持用户高度自定义注释选项, 适配各种需求和注释。
- 保存文件的时候,自动更新最后的编辑时间和编辑人
- 快捷键:
window
:ctrl+alt+i
,mac
:ctrl+cmd+i
/*
* @Author: your name
* @Date: 2020-09-28 10:06:44
* @LastEditTime: 2020-11-17 10:49:19
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: h5-business-platform/src/mixins/list-mixin.js
*/
在光标处添加函数注释
- 在光标处自动生成一个注释模板
- 支持用户高度自定义注释选项
- 快捷键:
window
:ctrl+alt+t
,mac
:ctrl+cmd+t
- 快捷键不可用很可能是被占用了,参考这里
- 可自定义默认参数
/**
* @description: 定义一个排序数组
* @param {*} payload
* @return {array} 排序完成的数组
*/
TODO Highlight 突出显示TODO,FIXME和任何关键字
目录、文件命名全部采用kebab-case (短横线连接式, e.g. user-info )
- css命名
- 类名使用小写字母,采用kebab-case,以中划线分隔
- id 采用驼峰式命名
- less 中的变量、函数、混合、placeholder 采用驼峰式命名
- js命名
- 变量采用驼峰式命名 camelCase,
- 常量使用全大写,
- 用Class采用 PascalCase
附: 函数方法常用的动词
get 获取/set 设置,
add 增加/remove 删除
create 创建/destory 移除
start 启动/stop 停止
open 打开/close 关闭,
read 读取/write 写入
load 载入/save 保存,
create 创建/destroy 销毁
begin 开始/end 结束,
backup 备份/restore 恢复
import 导入/export 导出,
split 分割/merge 合并
inject 注入/extract 提取,
attach 附着/detach 脱离
bind 绑定/separate 分离,
view 查看/browse 浏览
edit 编辑/modify 修改,
select 选取/mark 标记
copy 复制/paste 粘贴,
undo 撤销/redo 重做
insert 插入/delete 移除,
add 加入/append 添加
clean 清理/clear 清除,
index 索引/sort 排序
find 查找/search 搜索,
increase 增加/decrease 减少
play 播放/pause 暂停,
launch 启动/run 运行
compile 编译/execute 执行,
debug 调试/trace 跟踪
observe 观察/listen 监听,
build 构建/publish 发布
input 输入/output 输出,
encode 编码/decode 解码
encrypt 加密/decrypt 解密,
compress 压缩/decompress 解压缩
pack 打包/unpack 解包,
parse 解析/emit 生成
connect 连接/disconnect 断开,
send 发送/receive 接收
download 下载/upload 上传,
refresh 刷新/synchronize 同步
update 更新/revert 复原,
lock 锁定/unlock 解锁
check out 签出/check in 签入,
submit 提交/commit 交付
push 推/pull 拉,
expand 展开/collapse 折叠
begin 起始/end 结束,
start 开始/finish 完成
enter 进入/exit 退出,
abort 放弃/quit 离开
obsolete 废弃/depreciate 废旧,
collect 收集/aggregate 聚集
!!!看完了在下面回复“已读”