代码规范

221 阅读13分钟

Js代码规范

一、命名规范

1、文件命名

  • 与文件夹要路由名一致
  • 文件命名要与文件夹一直,再以驼峰进行类型区分
    如下:
    best

Dingtalk_20210326094104.jpg

bad:

6942128A-FF21-42f0-AB55-8C72F754E8F7.png

2、常量命名

  • 常量, 使用全部字母大写,单词间下划线分隔的命名方式

3、私有属性、方法、变量命名

  • 私有属性、变量和方法以下划线 _ 开头

4、变量命名

  • 要求驼峰格式
  • 应该要使变量名具有代表意图的象征,使人易于搜索并且容易理解
  • boolean 类型的变量使用 is 或 has 开头 Dingtalk_20210326095625.jpg

5、函数命名

  • 动词名词结合或者短语表达某个行为,让别人看函数名就能知道这个函数是用来做什么的

Dingtalk_20210326102408.jpg

二、参数&传参

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、函数/方法注释

例如:

Dingtalk_20210326143104.jpg

四、常规格式

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;
    top50px;
    left0;
    overflow-x: hidden;
    /* box model: sizes / margins / paddings / borders / ...  */
    width200px;
    padding5px;
    border1px solid #ddd;
    /* typographic: font / aligns / text styles / ... */
    font-size14px;
    line-height20px;
    /* 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-weight700;
}
 

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,必须遵循以下两种方法之一:

  1. 在 Web Server 根目录放置 favicon.ico 文件。

  2. 使用 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 背景图实现。 解释:

  1. 产品 logo、用户头像、用户产生的图片等有潜在下载需求的图片,以 img 形式实现,能方便用户下载。
  2. 无下载需求的图片,比如:icon、背景、代码使用的图片等,尽可能采用 CSS 背景图实现。

6、表单

6.1 控件标题

[强制] 有文本标题的控件必须使用 label 标签将其与其标题相关联。 解释: 有两种方式:

  1. 将控件置于 label 内。
  2. 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>
)