Js代码规范
一、命名规范
1、文件命名
- 与文件夹要路由名一致
- 文件命名要与文件夹一直,再以驼峰进行类型区分
如下:
best
bad:
2、常量命名
- 常量, 使用全部字母大写,单词间下划线分隔的命名方式
3、私有属性、方法、变量命名
- 私有属性、变量和方法以下划线 _ 开头
4、变量命名
- 要求驼峰格式
- 应该要使变量名具有代表意图的象征,使人易于搜索并且容易理解
- boolean 类型的变量使用 is 或 has 开头
5、函数命名
- 动词名词结合或者短语表达某个行为,让别人看函数名就能知道这个函数是用来做什么的
二、参数&传参
1、避免使用大量的参数
1-3个是比较合理的范围,参数超过三个需要改成对象传参方式
// bad
function getUsers(name, area, gender){}
getUsers('阿三', '华东', '男')
// best
function getUsers({name, area, gender}){}
getUsers({name: '阿三', area: '华东', gender: '男'})
2、使用默认参数
// bad
function getUsers(name){
request(name || '小米')
}
// best
function getUsers(name='小米'){
request(name)
}
三、注释
1、单行注释
必须独占一行。// 后跟一个空格,缩进与下一行被注释说明的代码一致。
2、多行注释
有多行注释内容时,使用多个单行注释。
3、函数/方法注释
例如:
四、常规格式
1、使用两个空格进行缩进
function hello(name) {
console.log('hi', name)
}
2、除需要转义的情况外,字符串统一使用单引号
3、关键字后面加空格
// bad
if(condition){ ... }
// best
if (condition) { ... }
4、函数声明时括号与函数名间不加空格
// best
function name(arg) { ... }
5、始终使用 === 替代 ==,!==替代!=
6、字符串拼接使用es6的` `操作
// bad
const message = 'hello, '+name+'!'
//best
const message = `hello${name}!`
7、逗号后面加空格
// bad
const list = [1,2,3,4];
function getName(id,year){}
// best
const list = [1, 2, 3, 4];
function getName(id, year){}
8、if 语句的的括号不能省
// bad
if (options.quiet !== true) console.log('done');
if (options.quiet !== true)
console.log('done')
// best
if (options.quiet !== true) {
console.log('done')
}
9、使用浏览器window对象
访问window属性时加上 window. 前缀,document、console、navigator除外。
// bad
alert(location.href);
// best
window.alert(window.location.href);
10、语句结束使用分号
11、每个 const、let 关键字单独声明一个变量
// bad
let maxNum = 213, length;
// best
let maxNum = 213;
let length;
CSS代码规范
一、命名规范
1、类选择器class命名
- class必须使用小写字母,多个单词直接用-分隔
- 代码中命名均不能以下划线或者美元符号开始,也不能以下划线和美元符号结束
- 代码中命名不能以拼音与英文混合的方式,更不允许直接使用中文的方式。强制使用英文拼写和语法可以让阅读者易于理解,避免歧义
2、全局命名
- 字体颜色:.fc-颜色名(yellow){}
- 字体大小:.fs-文字大小{}
- 背景颜色:.bc-颜色名(yellow){}
- 边线颜色:.border-color-颜色名(yellow){}
二、代码格式
- css属性代码缩紧和换行,不一行写到底
- 减少嵌套,css嵌套建议最多3,4层,不可再多
- 不使用标签直接写样式, 使用id或classs(除了全局样式覆盖)
- 减少css样式
/* bad */
.name{
margin-top: 1px;
margin-bottom: 3px;
margin-left: 4px;
}
/* best */
.name {
margin: 1px 0px 3px 4px;
}
-
删除冗余的被注视代码
-
省略 px 提高性能的一个简单方法是使用CSS标准的一个特性。为 0 的数值默认单位 是 px—— 删除 px 可以为每个数字节省两个字节。
/* bad */
.name {padding:0px; margin:0px;}
/* best */
.name {padding:0; margin:0}
- 不使用* 做样式处理,如果需要添加class名称。影响后期维护(排除全局样式统一覆盖,局部不使用*)
*{font-size: 12px}
- 属性书写顺序:Formatting Model(布局方式、位置) > Box Model(尺寸) > Typographic(文本相关) > Visual(视觉效果)
解释:
Formatting Model 相关属性包括:position / top / right / bottom / left / float /display / overflow 等
Box Model 相关属性包括:border / margin / padding / width / height 等
Typographic 相关属性包括:font / line-height / text-align / word-wrap 等
Visual 相关属性包括:background / color / transition / list-style 等
另外,如果包含 content 属性,应放在最前面。 示例:
.sidebar {
/* formatting model: positioning schemes / offsets / z-indexes / display / ... */
position: absolute;
top: 50px;
left: 0;
overflow-x: hidden;
/* box model: sizes / margins / paddings / borders / ... */
width: 200px;
padding: 5px;
border: 1px solid #ddd;
/* typographic: font / aligns / text styles / ... */
font-size: 14px;
line-height: 20px;
/* visual: colors / shadows / gradients / ... */
background: #f5f5f5;
color: #333;
-webkit-transition: color 1s;
-moz-transition: color 1s;
transition: color 1s;
}
-
不使用!important, 能使用层级或id 覆盖样式不使用!important。除非是组件不能覆盖样式。不可使用!important
-
属性兼容 带私有前缀的属性由长到短排列,按冒号位置对齐。 解释: 标准属性放在最后,按冒号对齐方便阅读,也便于在编辑器内进行多行编辑。 示例:
.box {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
- 字重
font-weight 属性必须使用数值方式描述。
解释:
CSS 的字重分 100 – 900 共九档,但目前受字体本身质量和浏览器的限制,实际上支 持 400 和 700 两档,分别等价于关键词 normal 和 bold。 示例:
/* bad */
h1 {
font-weight: bold;
}
/*best*/
h1 {
font-weight: 700;
}
HTML编码规范
1、前言
本节的目标是使 HTML 代码风格保持一致,容易被理解和被维护。
2、代码风格
2.1 缩进与换行
[强制] 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格 或 tab 字符。 解释: 对于非 HTML 标签之间的缩进,比如 script 或 style 标签内容缩进,与 script 或 style 标签的缩进同级。 示例:
<style>
/* 样式内容的第一级缩进与所属的 style 标签对齐 */
ul {
padding: 0;
}
</style>
<ul>
<li>first</li>
<li>second</li>
</ul>
<script>
// 脚本代码的第一级缩进与所属的 script 标签对齐
require(['app'], function (app) {
app.init();
});
</script>
[建议] 每行不得超过 120 个字符。 解释: 过长的代码不容易阅读与维护。但是考虑到 HTML 的特殊性,不做硬性要求。
2.2 命名
[强制] class 必须单词全字母小写,单词间以 - 分隔。 [强制] class 必须代表相应模块或部件的内容或功能,不得以样式信息进行命名。 示例:
<!-- good -->
<div class="sidebar"></div>
<!-- bad -->
<div class="left"></div>
[强制] 元素 id 必须保证页面唯一。 解释: 同一个页面中,不同的元素包含相同的 id,不符合 id 的属性含义。并且使用 document.getElementById 时可能导致难以追查的问题。
[建议] id 建议单词全字母小写,单词间以 - 分隔。同项目必须保持风格一致。 [建议] id、class 命名,在避免冲突并描述清楚的前提下尽可能短。 示例:
<!-- good -->
<div id="nav"></div>
<!-- bad -->
<div id="navigation"></div>
<!-- good -->
<p class="comment"></p>
<!-- bad -->
<p class="com"></p>
<!-- good -->
<span class="author"></span>
<!-- bad -->
<span class="red"></span>
[强制] 禁止为了 hook 脚本,创建无样式信息的 class。 解释: 不允许 class 只用于让 JavaScript 选择某些元素,class 应该具有明确的语义和样式。否则容易导致 CSS class 泛滥。 使用 id、属性选择作为 hook 是更好的方式。
[强制] 同一页面,应避免使用相同的 name 与 id。 解释: IE 浏览器会混淆元素的 id 和 name 属性, document.getElementById 可能获得不期望的元素。所以在对元素的 id 与 name 属性的命名需要非常小心。 一个比较好的实践是,为 id 和 name 使用不同的命名法。 示例:
<input name="foo">
<div id="foo"></div>
<script>
// IE6 将显示 INPUT
alert(document.getElementById('foo').tagName);
</script>
2.3 标签
[强制] 标签名必须使用小写字母。 示例:
<!-- good -->
<p>Hello StyleGuide!</p>
<!-- bad -->
<P>Hello StyleGuide!</P>
[强制] 对于无需自闭合的标签,不允许自闭合。 解释: 常见无需自闭合标签有 input、br、img、hr 等。 示例:
<!-- good -->
<input type="text" name="title">
<!-- bad -->
<input type="text" name="title" />
[强制] 对 HTML5 中规定允许省略的闭合标签,不允许省略闭合标签。 解释: 对代码体积要求非常严苛的场景,可以例外。比如:第三方页面使用的投放系统。 示例:
<!-- good -->
<ul>
<li>first</li>
<li>second</li>
</ul>
<!-- bad -->
<ul>
<li>first
<li>second
</ul>
[强制] 标签使用必须符合标签嵌套规则。 解释: 比如 div 不得置于 p 中,tbody 必须置于 table 中。a不能嵌套 严格嵌套约束在所有的浏览器下都不被允许;而语义嵌套约束,浏览器大多会容错处理,生成的文档树可能相互不太一样。
语义嵌套约束 · li 用于ul 或 ol 下; · dd, dt 用于 dl 下; · thead>, tbody, tfoot, tr, td 用于 table 下; 严格嵌套约束 · inline-Level 元素,仅可以包含文本或其它 inline-Level 元素; · a里不可以嵌套交互式元素a、button、select等; · p里不可以嵌套块级元素div、h1~h6、p、ul/ol/li、dl/dt/dd、form等。
[建议] HTML 标签的使用应该遵循标签的语义。 解释: 下面是常见标签语义 · p - 段落 · h1,h2,h3,h4,h5,h6 - 层级标题 · strong,em - 强调 · ins - 插入 · del - 删除 · abbr - 缩写 · code - 代码标识 · cite - 引述来源作品的标题 · q - 引用 · blockquote - 一段或长篇引用 · ul - 无序列表 · ol - 有序列表 · dl,dt,dd - 定义列表
示例:
<!-- good -->
<p>Esprima serves as an important <strong>building block</strong> for some JavaScript language tools.</p>
<!-- bad -->
<div>Esprima serves as an important <span class="strong">building block</span> for some JavaScript language tools.</div>
[建议] 标签的使用应尽量简洁,减少不必要的标签。 示例:
<!-- good -->
<img class="avatar" src="image.png">
<!-- bad -->
<span class="avatar">
<img src="image.png">
</span>
2.4属性
[强制] 属性名必须使用小写字母。 示例:
<!-- good -->
<table cellspacing="0">...</table>
<!-- bad -->
<table cellSpacing="0">...</table>
[强制] 属性值必须用双引号包围。 解释:不允许使用单引号,不允许不使用引号。 示例:
<!-- good -->
<script src="esl.js"></script>
<!-- bad -->
<script src='esl.js'></script>
<script src=esl.js></script>
[建议] 布尔类型的属性,建议不添加属性值。 示例:
<input type="text" disabled>
<input type="checkbox" value="1" checked>
[建议] 属性应该按照指定顺序出现以保证易读性 · class · id · name · data-* · src, for, type, href, value , max-length, max, min, pattern · placeholder, title, alt · aria-*, role · required, readonly, disabled
示例:
<a class="…" id="…" data-modal="…" href="#">Example link</a>
<input class="form-control" type="text">
<img src="…" alt="…">
[建议] boolean属性不需要声明取值的属性。 解释:boolean属性的存在表示取值为true,不存在则表示取值为false。 示例:
<input type="text" disabled>
<input class="checkbox" value="1" checked>
<select>
<option value="1" selected>1</option>
</select>
[建议] 自定义属性建议以 xxx- 为前缀,推荐使用 data-。 解释: 使用前缀有助于区分自定义属性和标准定义的属性。 示例:
<ol data-ui-type="Select"></ol>
3、通用
3.1 DOCTYPE
[强制] 使用 HTML5 的 doctype 来启用标准模式,建议使用大写的 DOCTYPE。 示例:
<!DOCTYPE html>
[建议] 启用 IE Edge 模式。 示例:
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
[建议] 在 html 标签上设置正确的 lang 属性。 解释: 有助于提高页面的可访问性,如:让语音合成工具确定其所应该采用的发音,令翻译工具确定其翻译语言等。 示例:
<html lang="zh-CN">
3.2 编码
[强制] 页面必须使用精简形式,明确指定字符编码。指定字符编码的 meta 必须是 head 的第一个直接子元素。 示例:
<html>
<head>
<meta charset="UTF-8">
......
</head>
<body>
......
</body>
</html>
3.3 CSS 和 JavaScript 引入
[强制] 引入 CSS 时必须指明 rel="stylesheet"。 示例:
<link rel="stylesheet" href="page.css">
[强制] 移动环境或只针对现代浏览器设计的 Web 应用,如果引用外部资源的 URL 协议部分与页面相同,建议省略协议前缀。 解释:省略外链资源(图片及其它媒体资源)URL 中的 http / https 协议,使 URL 成为相对地址,其它协议(ftp 等)的 URL 不省略。 示例:
<script src="//s1.bdstatic.com/cache/static/jquery-1.10.2.min_f2fb5194.js"></script>
[建议] 引入 CSS 和 JavaScript 时无须指明 type 属性。 解释:
text/css 和 text/javascript 是 type 的默认值。
[建议] 展现定义放置于外部 CSS 中,行为定义放置于外部 JavaScript 中。 解释: 结构-样式-行为的代码分离,对于提高代码的可阅读性和维护性都有好处。
[建议] 在 head 中引入页面需要的所有 CSS 资源。 解释: 在页面渲染的过程中,新的CSS可能导致元素的样式重新计算和绘制,页面闪烁。
[建议] JavaScript 应当放在页面末尾,或采用异步加载。 解释: 将 script 放在页面中间将阻断页面的渲染。出于性能方面的考虑,如非必要,请遵守此条建议。 示例:
<body>
<!-- a lot of elements -->
<script src="init-behavior.js"></script>
</body>
4、HEAD
4.1 title
[强制] 页面必须包含 title 标签声明标题。 [强制] title 必须作为 head 的直接子元素,并紧随 charset 声明之后。
解释:title 中如果包含 ASCII 之外的字符,浏览器需要知道字符编码类型才能进行解码,否则可能导致乱码。 示例:
<head>
<meta charset="UTF-8">
<title>页面标题</title>
</head>
4.2 favicon
[强制] 保证 favicon 可访问。 解释:在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证 favicon 可访问,避免 404,必须遵循以下两种方法之一:
-
在 Web Server 根目录放置 favicon.ico 文件。
-
使用 link 指定 favicon。 示例:
<link rel="shortcut icon" href="path/to/favicon.ico">
4.3 viewport
[建议] 若页面欲对移动设备友好,需指定页面的 viewport。 解释:viewport meta tag 可以设置可视区域的宽度和初始缩放大小,避免在移动设备上出现页面展示不正常。 · viewport: 一般指的是浏览器窗口内容区的大小,不包含工具条、选项卡等内容; · width: 浏览器宽度,输出设备中的页面可见区域宽度; · device-width: 设备分辨率宽度,输出设备的屏幕可见宽度; · initial-scale: 初始缩放比例; · maximum-scale: 最大缩放比例; 示例:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
5、图片
[建议] 避免为 img 添加不必要的 title 属性。 解释: 多余的 title 影响看图体验,并且增加了页面尺寸。
[建议] 为重要图片添加 alt 属性。 解释: 可以提高图片加载失败时的用户体验。
[建议] 添加 width 和 height 属性,以避免页面抖动。
[建议] 有下载需求的图片采用 img 标签实现,无下载需求的图片采用 CSS 背景图实现。 解释:
- 产品 logo、用户头像、用户产生的图片等有潜在下载需求的图片,以 img 形式实现,能方便用户下载。
- 无下载需求的图片,比如:icon、背景、代码使用的图片等,尽可能采用 CSS 背景图实现。
6、表单
6.1 控件标题
[强制] 有文本标题的控件必须使用 label 标签将其与其标题相关联。 解释: 有两种方式:
- 将控件置于 label 内。
- label 的 for 属性指向控件的 id。 推荐使用第一种,减少不必要的 id。如果 DOM 结构不允许直接嵌套,则应使用第二种。 示例:
<label><input type="checkbox" name="confirm" value="on"> 我已确认上述条款</label>
<label for="username">用户名:</label> <input type="textbox" name="username" id="username">
6.2 按钮
[强制] 使用 button 元素时必须指明 type 属性值。 解释:button 元素的默认 type 为 submit,如果被置于 form 元素中,点击后将导致表单提交。为显示区分其作用方便理解,必须给出 type 属性。 示例:
<button type="submit">提交</button>
<button type="button">取消</button>
[建议] 尽量不要使用按钮类元素的 name 属性。 解释:由于浏览器兼容性问题,使用按钮的 name 属性会带来许多难以发现的问题。
7 多媒体
[建议] 当在现代浏览器中使用 audio 以及 video 标签来播放音频、视频时,应当注意格式。 解释: 音频应尽可能覆盖到如下格式: · MP3 · WAV · Ogg 视频应尽可能覆盖到如下格式: · MP4 · WebM · Ogg [建议] 在支持 HTML5 的浏览器中优先使用 audio 和 video 标签来定义音视频元素。
8 JSX语法规范
1,使用双引号
对于JSX属性值总是使用双引号(""),其他均使用单引号(''); 解释:因为HTML属性也是使用双引号,因此JSX的属性也遵循此约定 示例:
// bad
<Foo bar='bar' />
// good
<Foo bar="bar" />
// bad
<Foo style={{ left: "20px" }} />
// good
<Foo style={{ left: '20px' }} />
2,空格
//自动关闭的标签前加一个空格,正常情况下不需要换行
// bad
<Foo/>
// very bad
<Foo />
// bad
<Foo
/>
// good
<Foo />
不要在JSX {} 引用括号里两边加空格
// bad
<Foo bar={ baz } />
// good
<Foo bar={baz} />
3,属性
//JSX属性名使用驼峰式命名
// bad
<Foo
UserName="hello"
phone_number={12345678}
/>
// good
<Foo
userName="hello"
phoneNumber={12345678}
/>
如果属性值为true,可以直接省略
// bad
<Foo hidden={true} />
// good
<Foo hidden />
避免使用数组的index作为属性key的值,推荐使用唯一id
// bad
{todos.map((todo, index) =>
<Todo
{...todo}
key={index}
/>
)}
// good
{todos.map(todo => (
<Todo
{...todo}
key={todo.id}
/>
))}
4,括号
//将多行JSX标签写在()里,
// bad
render() {
return <MyComponent className="long body" foo="bar">
<MyChild />
</MyComponent>;
}
// good
render() {
return (
<MyComponent className="long body" foo="bar">
<MyChild />
</MyComponent>
);
}
// good, 单行可以不需要
render() {
const body = <div>hello</div>;
return <MyComponent>{body}</MyComponent>;
}
5,标签
//对于没有子元素的标签,总是自动关闭标签
// bad
<Foo className="stuff"></Foo>
// good
<Foo className="stuff" />
如果组件有多行的属性,关闭标签时新建一行
// bad
<Foo
bar="bar"
baz="baz" />
// good
<Foo
bar="bar"
baz="baz"
/>
6,避免无效的标签元素
//render方法里面需要返回一个根组件,可以使用Fragment;
// bad
return (
<div>
<div>
<List>
<ListItem />
</List>
</div>
</div>
)
// good
return (
<Fragment>
<div>
<List>
<ListItem />
</List>
</div>
</Fragment>
)