react
项目为例detanx-react
。detanx-react/index.js
文件,项目的入口文件。detanx-react/config
文件夹,用来存放项目的一些配置文件,例如咱们使用webpack
的打包配置以及其余好比将react-router
、react-dom
等经过gulp打包单独的包等配置。detanx-react/analyz
文件夹,用来存放经过webpack
打包后,分析打包过程的文件。detanx-react/build
或者detanx-react/dist
文件夹,用来存放项目开发完成后,须要部署上线的全部生产文件。detanx-react/mock
文件夹,在项目开发时,后端开发的进度可能没有前端快,致使接口没法调试,因此咱们能够本身配置mock
数据进行开发和调试。这个文件夹就用来存放全部的mock
数据。detanx-react/public
文件夹,打包会须要基本的html
模版,内嵌的一些好比css
、favicon
等咱们就能够放到这个文件夹下面。detanx-react/src
文件夹,这个文件夹是咱们项目开发变化最多的,咱们写的大多数代码都在这个文件夹下面,针对不一样项目,它下面的结构也不同。
detanx-react/src/components
文件夹,存放项目开发的公共组件。detanx-react/src/hooks
文件夹,存放开发过程当中封装的一些新的hook。detanx-react/src/request
文件夹,存放项目请求的封装。detanx-react/src/router
文件夹,存放项目的路由相关设置,配置也能够写到detanx-react/config
文件夹下。detanx-react/src/view
文件夹,存放项目开发的全部页面内容,根据每一个模块划分。
index
文件(模块入口)、components
文件夹(存放模块的抽离组件)等。detanx-react/src/common
文件夹,存放项目的公共内容,例如:公共的方法(判断空、数据类型等)、常量(会多个(2
个及以上)不一样模块用到的常量)文件等。detanx-react/static
文件夹,这个文件夹也能够放在detanx-react/src
下面,用于存放一些图片、字体、CSS
(LESS
、SASS
)等文件。class
命名(CSS
命名)。开发项目时,尤为在多人合做的时候,若是没有一个好的命名规范而且也不喜欢写代码注释。当你离职或者其余缘由须要项目交接时,别人可能就是在遍看代码边问候你的家人了,可能还会打电话问你,浪费彼此不少时间。can
判断是否可执行某个动做(canGetUserName
)has
判断是否含有某个值(hasUserName
)is
判断是否为某个值(isEmpty
)get
获取某个值(getUserName
)set
设置某个值(setUserName
)load
加载某些数据(loadUserInfo
)200
行,超过应该尝试抽离部分逻辑为一个新的函数。实在没法抽离应该在复杂逻辑部分添加适当的注释。_
或$
开头的函数为私有。a
,反正下面只会用到一次;再者一个是某个计数变量就直接一个i
或者其余字母。当你这个模块全身这种变量时,别人看你的代码就是一个灾难。isShowModal
(是否显示弹窗)userLists
(用户列表)userInfoObj
(用户信息对象,虽然咱们通常知道userInfo
就是一个对象,我这里只是表示一个若是看不出来的命名,咱们能够在后面加一个标识)Symbol
类型:userNameSym
(Symbol
类型的用户名)_
或者$
为开头,一般开发时约定_
或者$
开头的为私有变量。list1
、list2
等等这种变量名称。WARNING_DUATION_TIME
:警告显示时间)。react
模块为例,咱们每一个模块的命名应该使用大驼峰(UserConfig
),而且模块名称应该语义化,表示模块的内容,例如(UserConfig
)表示用户的配置模块。class
命名(CSS
命名)CSS
命名咱们通常是使用 BEM
(块(block
)、元素(element
)、修饰符(modifier
)) 命名规范。.block {}
.block__element {}
.block--modifier {}
复制代码
block
表明了更高级别的抽象或组件。block__element
表明 .block
的后代,用于造成一个完整的 .block
的总体。block--modifier
表明 .block
的不一样状态或不一样版本。.sub-block__element {}
.sub-block--modifier {}
复制代码
class
名称会特别长,咱们能够经过其余约定解决,例如:缩减层级等。LESS/SASS
等预处理器语言来编写 CSS
。js
经过eslint
去约束,ts
能够经过tslint
约束,咱们只须要一我的去配置相应的约束的配置文件。ESLint
是一个语法规则和代码风格的检查工具,能够用来保证写出语法正确、风格统一的代码。ESLint
。$ npm i -g eslint
复制代码
Airbnb
语法规则,以及 import
、a11y
、react
插件。$ npm i -g eslint-config-airbnb
$ npm i -g eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
复制代码
.eslintrc
文件,配置 ESLint
。{
"extends": "eslint-config-airbnb"
}
复制代码
vscode
中安装eslint
插件便可边写边检查。'
)和双引号("
)以及ES6
新增的模版字符串使用 `` 表示,可能在开发时大部分都是随便去使用这个引号,怎么输入着方便怎么来。通常状况下,.js
、.ts
、.jsx
、.tsx
、.vue
等能够写js
的文件中,通常是使用单引号('
),在html
中(标签的属性等)使用双引号('
)。``能够代替之前的连续字符串链接操做。export default class extends PureComponent {
constructor() {
this.state = {
value: 'detanx',
list: null
}
}
render() {
const { value, list } = this.state
return (<>
<div className="detanx">{value}</div>
</>)
}
}
// ``使用
let user = 'my name is'
const NAME = 'detanx'; // 简单示例一下
// es5
user = user + ' ' + NAME;
// es6
let user = `${user} ${NAME}`
复制代码
let
和const
去声明变量,而不是用var
。2
处使用的某个值,咱们应该使用const
在当前使用模块的最顶层去声明,多个模块使用的应该在文件的公共模块的常量文件中声明。// bad
let i
for(i = 0; i < 10; i ++) { ... }
// good
let i = 0;
for(; i < 10; i ++) { ... }
for (let i = 0; i < 10; i ++) { ... }
复制代码
const
连续声明多个值时,可使用数组解构赋值的方式。// bad
var a = 1, b = 2, c = 3;
// good
const a = 1;
const b = 2;
const c = 3;
// best
const [a, b, c] = [1, 2, 3];
复制代码
const
声明。
const arr = [1, 2, 3, 4];
// bad
const first = arr[0];
const second = arr[1];
// good
const [first, second] = arr;
复制代码
// bad
function getFullName(user) {
const firstName = user.firstName;
const lastName = user.lastName;
}
// good
function getFullName(obj) {
const { firstName, lastName } = obj;
}
// best
function getFullName({ firstName, lastName }) {
}
复制代码
// bad
function processInput(input) {
return [left, right, top, bottom];
}
// good
function processInput(input) {
return { left, right, top, bottom };
}
const { left, right } = processInput(input);
复制代码
// bad
const a = { k1: v1, k2: v2, };
const b = {
k1: v1,
k2: v2
};
// good
const a = { k1: v1, k2: v2 };
const b = {
k1: v1,
k2: v2,
};
复制代码
Object.assign
方法。// bad
const a = {};
a.x = 3;
// if reshape unavoidable
const a = {};
Object.assign(a, { x: 3 });
// good
const a = { x: null };
a.x = 3;
复制代码
// bad
const obj = {
id: 5,
name: 'San Francisco',
};
obj[getKey('enabled')] = true;
// good
const obj = {
id: 5,
name: 'San Francisco',
[getKey('enabled')]: true,
};
复制代码
上面代码中,对象obj
的最后一个属性名,须要计算获得。这时最好采用属性表达式,在新建obj
的时候,将该属性与其余属性定义在一块儿。这样一来,全部属性就在一个地方定义了。css
对象的属性和方法,尽可能采用简洁表达法,这样易于描述和书写。html
var ref = 'some value';
// bad
const atom = {
ref: ref,
value: 1,
addValue: function (value) {
return atom.value + value;
},
};
// good
const atom = {
ref,
value: 1,
addValue(value) {
return atom.value + value;
},
};
复制代码
使用扩展运算符(...
)拷贝数组。前端
// bad
const len = items.length;
const itemsCopy = [];
let i;
for (i = 0; i < len; i++) {
itemsCopy[i] = items[i];
}
// good
const itemsCopy = [...items];
复制代码
Array.from
方法,将相似数组的对象转为数组。const foo = document.querySelectorAll('.foo');
const nodes = Array.from(foo);
复制代码
// 当即执行函数
(() => {
console.log('Welcome to the Internet.');
})();
复制代码
// bad
function divide(a, b, option = false ) { ... }
// good
function divide(a, b, { option = false } = {}) { ... }
复制代码
arguments
变量,使用 rest
运算符(...
)代替。由于 rest
运算符显式代表你想要获取参数,并且 arguments
是一个相似数组的对象,而 rest
运算符能够提供一个真正的数组。// bad
function concatenateAll() {
const args = Array.prototype.slice.call(arguments);
return args.join('');
}
// good
function concatenateAll(...args) {
return args.join('');
}
复制代码
// bad
function handleThings(opts) {
opts = opts || {};
}
// good
function handleThings(opts = {}) { ... }
复制代码
Object
和 Map
,只有模拟现实世界的实体对象时,才使用 Object
。若是只是须要key: value
的数据结构,使用 Map
结构。由于 Map
有内建的遍历机制。let map = new Map(arr);
for (let key of map.keys()) { console.log(key); }
for (let value of map.values()) { console.log(value); }
for (let item of map.entries()) { console.log(item[0], item[1]); }
复制代码
import
取代require
。// bad
const moduleA = require('moduleA');
const func1 = moduleA.func1;
const func2 = moduleA.func2;
// good
import { func1, func2 } from 'moduleA';
复制代码
export
取代module.exports
。// commonJS的写法
const React = require('react');
const Breadcrumbs = React.createClass({
render() {
return <nav />;
}
});
module.exports = Breadcrumbs;
// ES6的写法
import React from 'react';
class Breadcrumbs extends React.Component {
render() {
return <nav />;
}
};
export default Breadcrumbs;
复制代码
若是模块只有一个输出值,就使用export default
,若是模块有多个输出值,就使用export
,export default
与普通的export
不要同时使用。vue
不要在模块输入中使用通配符。由于这样能够确保你的模块之中,有一个默认输出(export default
)。node
// bad
import * as myObject from './importModule';
// good
import myObject from './importModule';
复制代码
function makeStyleGuide() { ... }
export default makeStyleGuide;
const StyleGuide = {
es6: {
}
};
export default StyleGuide;
复制代码