# 一、HTML

使用语义化标签

HTML能使用语义化标签的,尽量使用语义化标签,避免整个文档都是div或者是p标签

<!-- bad -->
<div>
  <p></p>
</div>

<!-- good -->
<header></header>
<footer></footer>

属性顺序要求

HTML属性应该按照特定的顺序出现以保证易读性

id
class
name
data-xxx
src, for, type, href
title, alt
aria-xxx, role

语法

  • 属性使用双引号,不要使用单引号
  • 属性名全小写,使用中线(-)做分隔符

# 二、CSS

BEM命名原则

  • block:模块,名字单词间用-连接
  • element:元素,模块的子元素,以_与block连接
  • modifier:修饰,模块的变体,定义特殊模块,以--与block连接
/* 举个例子 */
.block__element {
}
.block--modifier {
}

有效使用CSS选择器

选择器嵌套应少于3级

/* bad */
.page .header .login #username input {
}

/* good */
#username input {
}

有效使用CSS选择器,应遵守以下规则

  • 保持简单,不要嵌套过多复杂的选择器
  • 通配符和属性选择器效率最低,需要匹配的元素最多,避免使用
  • 不要使用类选择器和ID选择器修饰元素标签
  • 避免CSS表达式

# 三、JavaScript

# 关于命名

普通命名使用小驼峰

let userName = 'coderqmj';

命名复数时需要加s,如一个存放很多名字的数组

let names = ['邱模建', '马云', '马化腾'];

每个常量都需命名,便于别人读懂含义

// good
const COL_NUM = 10
let row = Math.ceil(num / COL_NUM)

// bad
let row = Math.ceil(num / 10)

命名需要语义化,函数命名,一般需要加上动词前缀:

  • can判断是否可以执行某个动作
  • has判断是否含有某个值
  • is判断是否为某个值
  • get获取某个值
  • set设置某个值

# 关于函数

函数参数使用结构语法,函数参数越少越好,如果超过两个参数,要使用ES6结构语法,不用考虑参数顺序。

function foo({name, age, height}) {
  console.log(`你好,我的名字是${name},今年${age}岁,身高是${height}m`)
}

foo({
  age: 18,
  name: '邱模建',
  height: 1.88
})

# 空行

以下情况需要空行:

  • 变量声明之后
  • 注释前(如果注释在文件第一行,则不需要)
  • 文件最后保留一个空行

# 引号

外层单引号,内层双引号

# 括号

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

// not good
if (condition) doSomething();

// good
if (condition) {
  doSomething();
}

# 不要写全局方法

会污染全局,团队开发中会造成安全隐患

# 四、React

# 基础规则

  • 一个文件一个组件 :虽然一个文件可以声明多个组件,但是最好不要这样做;推荐一个文件声明一个组件,并且也只导出一个文件。
  • 函数式组件和类组件选择 :如果定义的组件不需要props和state,建议将组件定义成函数组件,否则class组件

# React中的命名

  • 组件名称:大驼峰
  • 属性名称:React DOM使用小驼峰定义属性名称,和HTML属性名称的约定不一样

# JSX写法注意点

标签多行属性关闭标签要另起一行

// bad
<Component
  bar="bar"
  baz="baz" />

// good
<Component
  bar="bar"
  baz="baz" 
/>

组件跨行时,要使用括号包裹JSX标签

// bad
  render() {
    return <MyComponent className="long body" foo="bar">
             <MyChild />
           </MyComponent>;
  }

// good
  render() {
    return (
      <MyComponent className="long body" foo="bar">
        <MyChild />
      </MyComponent>
    );
  }

JSX语法应该使用以下对齐方式

// 推荐
<Foo
  superLongParam="bar"
  anotherSuperLongParam="baz"
/>

// 不推荐
<Foo superLongParam="bar"
     anotherSuperLongParam="baz" />

JSX引号问题:JSX的属性都采用双引号,其他JS都使用单引号,因为JSX属性不能包含转义引号

// bad
<Foo bar='bar' />
    
<Foo style={{ left: "20px" }} />

// good
<Foo bar="bar" />

<Foo style={{ left: '20px' }} />

# Redux代码规范

  • 每个模块都有对应自己的reducer,通过combineReducer进行合并
  • 异步请求代码使用redux-thunk,并且写在actionCreators中
  • redux直接采用redux hooks方式编写,不再使用connect

# 组件代码的顺序

// 1.类组件
class Example extends Component {
    // 静态属性
    static defaultProps = {}

    // 构造函数
    constructor(props) {
        super(props);
        this.state={}
    }

    // 声明周期钩子函数
    // 按照它们执行的顺序
    // 1. componentWillMount
    // 2. componentWillReceiveProps
    // 3. shouldComponentUpdate
    // 4. componentDidMount
    // 5. componentDidUpdate
    // 6. componentWillUnmount
    componentDidMount() { ... }

    // 事件函数/普通函数
    handleClick = (e) => { ... }

    // 最后,render 方法
    render() { ... }
}
                          
// 2.函数式组件
第三方/官方
自己配置的功能性
导入组件
本文件组件
组件内部state管理
redux的hooks代码
其他组件的hooks代码
其他逻辑代码
返回JSX代码

# 五、项目规范

  • 文件夹,文件名统一小写,多个单词以连接符(-)连接;
  • JavaScript变量名称 小驼峰,常量全部大写字母,组件命名 大驼峰
  • 组件内部状态可以使用useState,useReducer;业务数据全部放在redux中管理;
  • 函数组件内部按照以下顺序编写代码
    • 组件内部state管理
    • redux的hooks代码
    • 其他组件的hooks代码
    • 其他逻辑代码
    • 返回JSX代码
  • 每个模块都有对应自己的reducer
  • 前端目录划分
├─public
└─src
    ├─assets
    │  ├─css
    │  ├─font
    │  └─img
    ├─common  // 放点常量,公共配置之类的 
    ├─components
    ├─pages
    ├─router
    ├─services
    ├─store
    └─utils
最后更新于: 5/17/2021, 10:39:45 PM