前端开发规范

通用规范

命名

目录及文件命名

  • 普通目录及文件采用全小写
  • 模块文件夹或者组件文件(如在components下的文件)采用大驼峰(例:LeftBar.js
  • 其他采用小驼峰

变量命名

  • 小驼峰命名
  • 类型+对象描述或属性的方式
// 不推荐
var getTitle = "LoginTable"

// 推荐
let tableTitle = "LoginTable"

函数命名

  • 小驼峰方式 ( 构造函数使用大驼峰命名法 )
  • 前缀为动词
动词 含义 返回值
can 判断是否可执行某个动作 (权 ) 函数返回一个布尔值。true:可执行;false:不可执行
has 判断是否含有某个值 函数返回一个布尔值。true:含有此值;false:不含有此值
is 判断是否为某个值 函数返回一个布尔值。true:为某个值;false:不为某个值
get 获取某个值 函数返回一个非布尔值
set 设置某个值 无返回值、返回是否设置成功或者返回链式对象
//是否可阅读
function canRead(){
    return true;
}

//获取姓名
function getName{
    return this.name
}

注释

单行注释

  1. 单独一行://(双斜线)与注释文字之间保留一个空格
  2. 在代码后面添加注释://(双斜线)与代码之间保留一个空格,并且//(双斜线)与注释文字之间保留一个空格。
  3. 注释代码://(双斜线)与代码之间保留一个空格。
// 调用了一个函数 <= 1)单独在一行
setTitle();
 
var maxCount = 10; // 设置最大量 <= 2)在代码后面注释
 
// setName(); // <= 3)注释代码

多行注释

  • 若开始(/*)和结束(*/)都在一行,推荐采用单行注释
  • 若至少三行注释时,第一行为/*,最后行为*/,其他行以开始,并且注释文字与保留一个空格。
  • 一般用于函数(方法)
/*
* 代码执行到这里后会调用setTitle()函数
* setTitle():设置title的值
*/
setTitle();

需要注释的地方

  1. 公共组件使用说明
  2. 各组件中重要函数或者类说明
  3. 复杂的业务逻辑处理说明
  4. 特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的hack、使用了某种算法或思路等需要进行注释描述
  5. 多重 if 判断语句

HTML规范

  • 缩进使用tab(2 个空格)
  • 嵌套的节点应该缩进
  • 在属性上,使用双引号,不要使用单引号
  • 属性名全小写,用中划线(-)做分隔符
  • 要在自动闭合标签结尾处使用斜线
  • 正确合理使用navheaderasidefooterarticlesection等语义标签,不要全篇
  • 在编写 HTML 代码时,需要尽量避免多余的父节点
  • 尽量避免行内样式(style的方式)
  • 标签的alt属性指定文本
  • 尽量使用样式解决视觉设计元素,多考虑使用伪元素:before:after
  • css样式表在head标签内引用,js脚本引用在body结束标签之前引用

CSS规范

  • 缩进使用tab(2 个空格)
  • 命名必须由单词、中划线或数字组成
  • 不允许使用拼音(约定俗成的除外,如:youku, baidu),尤其是缩写的拼音、拼音与英文的混合
/* 不推荐 */
.xiangqing { sRules; }
.news_list { sRules; }
.zhuti { sRules; }

/* 推荐 */
.detail { sRules; }
.news-list { sRules; }
.topic { sRules; }
  • 每个声明结束都要加分号
  • url 的内容要用引号
  • 类名使用小写字母,以中划线分隔
  • 非必要的情况下 0 后面不用加单位
/* 不推荐 */
padding-bottom: 0px;
margin: 0em;

/* 推荐 */
padding-bottom: 0;
margin: 0;
  • 使用子选择器
/* 不推荐 */
.content .title {
  font-size: 2rem;
}

/* 推荐 */
.content > .title {
  font-size: 2rem;
}
  • 尽量使用缩写属性
/* 不推荐 */
padding-bottom: 2em;
padding-left: 1em;
padding-right: 1em;
padding-top: 0;

/* 推荐 */
padding: 0 1em 2em;

JS规范

缩进

使用 tab 缩进(2 个空格)

注释原则

  • As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性、可读性
  • As long as necessary(如有必要,尽量详尽):合理的注释、空行排版等,可以让代码更易阅读、更具美感
  • 注释单独一行的情况下,注释的//后面要跟一个空格
  • 注释如果和代码同一行,代码分号结束后,要跟一个空格,注释的//后也要跟一个空格

命名

  • 变量,使用驼峰命名,特殊命名按约定熟成命名(如:iOS,Android)
let loadingModules = {};
  • boolean 类型的变量使用 is 或 has 开头
let isReady = false;
let hasMoreCommands = false;

分号

统一要加分号

空格

以下几种情况不用写空格:

  • 对象的属性名后
  • 函数调用括号前
  • 数组的'['后和']'前
  • 运算符'('后和')'前

以下几种情况一定要写空格:

  • 三元运算符'?:'前后
  • 逗号后必须要有空格
  • 下列关键字前:else, while, catch, finally
  • 下列关键字后:if, else, for, while, do, switch, case, try, catch, finally, with, return, typeof
  • 单行注释'//'后(若单行注释和代码同行,则'//'前也需要),多行注释'*'后
  • 对象的属性值前
  • for 循环,分号后留有一个空格,前置条件如果有多个,逗号后留一个空格
  • 无论是函数声明还是函数表达式,'{'前一定要有空格
  • 函数的参数之间

这些后续会用 eslint 和 prettier 进行格式化

// 不推荐
var a = {
  b : 1
};

// 推荐
var a = {
  b: 1
};

// 不推荐
++x;
y++;
z = x ? 1:2;

// 推荐
++x;
y++;
z = x ? 1 : 2;

// 不推荐
var a = [ 1, 2 ];

// 推荐
var a = [1, 2];

// 推荐
var doSomething = function(a, b, c) {
  // do something
};

// 推荐
doSomething(item);

// 不推荐
for (let i = 0;i < 6;i++) {
  x++;
}

// 推荐
for (let i = 0; i < 6; i++) {
  x++;
}

空行

以下几种情况一定要有空行

  • 变量声明后(当变量声明在代码块的最后一行时,则无需空行)
  • 注释前(当注释在代码块的第一行时,则无需空行)

换行

换行的地方,行末必须有','或者运算符;
以下几种情况不需要换行:

  • 下列关键字后:else, catch, finally
  • 代码块'{'前

以下几种情况需要换行:

  • 代码块'{'后和'}'前
  • 变量赋值后
// 不推荐
var a = {
    b: 1
    , c: 2
};

x = y
    ? 1 : 2;

// 推荐
var a = {
    b: 1,
    c: 2
};

x = y ? 1 : 2;

// 推荐
if (condition) {
    ...
} else {
    ...
}

try {
    ...
} catch (e) {
    ...
} finally {
    ...
}

// 不推荐
function test()
{
    ...
}

// 推荐
function test() {
    ...
}

// 不推荐
var a, foo = 7, b,
    c, bar = 8;

// 推荐
var a,
    foo = 7,
    b, c, bar = 8;

引号

最外层统一使用单引号,除非字符串嵌套的情况

// 不推荐
var x = "test";

// 推荐
var y = 'foo',
  z = '
';

对象,数组

  • 对象属性名不需要加引号,如对象属性名是中划线命名的需要加引号(eslint 的 rules)
  • 对象以缩进的形式书写,不要写在一行(单个属性可以写一行,es6 导入方法时可以使用单行)
  • 数组、对象最后不要有逗号
// 推荐
var a = {
  b: 1,
  c: 2
};

括号

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

// 不推荐
if (condition) doSomething();

// 推荐
if (condition) {
  doSomething();
}

undefined

  • 永远不要直接使用 undefined 进行变量判断
  • 使用 typeof 和字符串'undefined'对变量进行判断
// 不推荐
if (person === undefined) {
    ...
}

// 推荐
if (typeof person === 'undefined') {
    ...
}

三元操作符

  • 操作符始终写在前一行, 以免分号的隐式插入产生预想不到的问题
let x = a ? b : c;
let y = a ?
    longButSimpleOperandB : longButSimpleOperandC;
let z = a ?
        moreComplicatedB :
        moreComplicatedC;
  • 可以使用三元操作符替代 if 条件判断语句
// 不推荐
if (val != 0) {
  return foo();
} else {
  return bar();
}

// 推荐
return val ? foo() : bar();

异步

  • 用 Promises 替代回调
  • async/await 是较 Promises 更好的选择

其他

  • 优先使用ES6,ES7的写法,更简洁
  • 不要声明了变量却不使用
  • 数组中不要存在空元素
  • debugger 不要出现在提交的代码里
  • 尽量使用===代替==
  • 不使用eval()函数
  • 不再被调用的代码应及时删除
  • 尽量不手动操作 DOM

React

基础规则

  • 一个文件声明一个组件:尽管可以在一个文件中声明多个 React 组件,但是最好不要这样做;推荐一个文件声明一个 React 组件,并只导出一个组件;
  • 使用 JSX 表达式:不要使用 React.createElement 的写法;
  • 推荐使用函数式组件

React 中的命名

  • 组件名称: 推荐使用大驼峰命名;
  • 属性名称: React DOM 使用小驼峰命令来定义属性的名称,而不使用 HTML 属性名称的命名约定;
  • style 样式属性: 采用小驼峰命名属性的 JavaScript 对象;
// 组件名称
MyComponent
// 属性名称
onClick
// 样式属性
backgroundColor

JSX 写法

  • 当标签没有子元素的时候,始终使用自闭合的标签
// 推荐


// 不推荐

  • 如果标签有多行属性,关闭标签要另起一行
// 推荐


// 不推荐

  • 在自闭标签之前留一个空格
// 推荐


//不推荐 





  • 当组件跨行时,要用括号包裹 JSX 标签
// 推荐
render() {
    return (
      
        
      
    );
  }
  
  // 不推荐
  render() {
    return 
             
           ;
  }

key 属性设置

避免使用index作为key使用

为组件绑定事件处理器

// 推荐
 handleClick = () => {
    console.log('this is:', this);
 }
 
  
  // 不推荐
   constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
 }
 handleClick(){
    console.log('this is:', this);
 }
 

State

  • 不要直接修改 state
  • State 的更新可能是异步的,推荐让 setState() 接收一个函数而不是一个对象

避免不必要 render 的写法

  • 使用shouldComponentUpdate,React.PureComponent,React.Memo避免不必要的 render
  • 但不能滥用,否则某些情况下会适得其反

路由加载

建议使用路由懒加载当前用户所需要的内容,这样能够显著地提高你的应用性能。尽管并没有减少应用整体的代码体积,但你可以避免加载用户永远不需要的代码,并在初始加载的时候减少所需加载的代码量。
使用React.lazy()或者第三方插件Loadable

你可能感兴趣的:(前端开发规范)