代码规范只是让代码更容易被理解,让多人开发时代码也能保持内部一致性。
制定代码规范的标准因团队而异,可以根据多数人的开发习惯或者是参考别人的规范
实现代码规范的方法有很多种,在React-Native中可以使用ESLint配合编译器进行代码规范审核
不必矫枉过正
编程规范
变量规范
- 代码中变量的命名均不能以下划线或符号开始,也不能以下划线或符号为结束
1
| 错误:_title / $title / title_ / title$
|
- 变量命名采用lowerCamelCase驼峰命名的方式,第一个字母必须小写
- 命名严禁使用拼音或者是拼音与英文混合的方式,正确的英文拼写和语法可以让阅读者易于理解,避免歧义
1 2
| 错误:shengchan / fenshu / bigshan 正确:production / grade / bigMountain
|
1
| 例如:userMsg 等价于 userMessaage
|
1
| 正确: studentList / userObject
|
- 常量的命名全部采用大写,单词与单词之间采用下划线进行分割。力求保证见文知意,不要害怕变量过长
1 2
| 错误:MaxValue / MAXVALUE 正确:MAX_STUDENT_GRADE
|
函数规范
1 2 3
| 错误:function test() {} test() {} 正确:test = () => {}
|
- 方法名、函数名一律采用lowerCamelCase驼峰命名的方式,第一个字母必须小写
1
| 正确:getAllUserInformation = () => {}
|
- 类名使用UpperCamelCase驼峰命名的方式,第一个字母必须大写
1
| 正确:export default class StringUtil {}
|
组件规范
1
| 正确:<TouchableOpacity onPress={this.doSomething}>
|
1 2 3
| <Father> <Children /> </Father>
|
- 组件需要设置样式的时候,如果只有一个样式可以用内联的方式写在JSX内,如果两个以上必须使用StyleSheet创建样式
- 当一个组件有多个属性需要配置的时候,务必多行书写
1 2 3 4 5 6
| <TouchableOpacity onPress={() => {}} style={} > <Children /> </TouchableOpacity>
|
- 自定义组件命名的时候,用UpperCamelCase命名。
- 自定义组件,要详细写出属性列表,并解释每个属性的意思。为每个属性初始化一个默认值
1 2 3 4 5 6 7 8 9
| FlexButton.propTypes = { press: PropTypes.func, top: PropTypes.number.isRequired, };
FlexButton.defaultProps = { press: () => {}, top: 0, };
|
- 无状态的组件,即不涉及组件内部数据、UI变化的组件。请继承自PureComponent而不是Component
格式规范
- 关键字左右需加空格,如if/for/else等关键字
- 任何运算符左右必须都有一个空格,包括赋值、逻辑运算符、加减乘除等
1 2
| 错误:grade=20 正确:grade = 20
|
- 大括号使用约定。如果大括号内为空,则写成{}即可,不需要换行。如果是非空代码块则左边括号空一格,右边闭括号需要换行,与方法名对其
1 2 3
| 例如:const getTest = () => { // do something }
|
- 单行字符数不超过120个(可在eslint中设置)超过的字符需要换行。单页代码不超过300行,超过的需要重构代码。
- 方法参数在传入的时候,多个参数逗号前必须加括号
1 2 3
| onMsgCallBack = (msg, title, name) => { // do something }
|
- 合理使用空格,将不同功能或者是不同业务逻辑的方法分开。
条件语句规范
- 简单的if/else逻辑判断,请使用三目运算符。逻辑判断请勿超过三层,如果超过了请重新思考代码逻辑。或者使用switch
- 在一个 switch 块内,每个case要么通过 break/return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个default 语句并且 放在最后,即使它什么代码也没有。
注释规范
- 变量或者是属性,可以在后面使用单行注释来说明这个变量或者属性的用途
1
| const userName = 'Jace';
|
- 类、类方法的注释不得使用//单行注释,必须使用/**/的多行注释。方法中如果需要传入参数,或者是有返回值。请在注释中详细写出。
1 2 3 4 5 6 7 8 9 10
|
const fetchAllMsg = (name, number) => { return msg };
|
- 逻辑代码中需要注释出逻辑流程
- 注释掉的代码,如果不再使用请尽快删除,以免给后续维护人员带来麻烦。如果只是暂时注释,请说明注释原因
文件规范
- 确定好项目的文件目录结构,要求文件层次清晰,功能划分明确
- 文件命名遵循lowerCamelCase方式命名。如果是某一个平台特有的文件,可以加上ios或者android的后缀作为区分
1
| 例如:index.ios.js / index.android.js
|
1 2 3 4
| /* * 登录页面 * by XXX at 2018-2-10 */
|
ESLint安装指南
在项目的根目录中运行
1 2 3 4
| ( export PKG=eslint-config-airbnb; npm info "$PKG@latest" peerDependencies --json | command sed 's/[\{\},]//g ; s/: /@/g' | xargs npm install --save-dev "$PKG@latest" )
|
之后需要安装babel-eslint,并创建.eslintrc。可以在里面写入自己的代码规则,类似于下方
1 2 3 4 5 6 7 8 9 10 11 12
| { "parser": "babel-eslint", "extends": "airbnb", "rules": { }, "parserOptions": { "ecmaFeatures": { "experimentalObjectRestSpread": true } } }
|
所有的规则可以在ESLint规则中查看,然后根据你的要求写到rules下
1 2 3
| "rules": { "no-bitwise": [0] }
|
其中:
"off"
或 0
- 关闭规则
"warn"
或 1
- 开启规则,使用警告级别的错误:warn
(不会导致程序退出)
"error"
或 2
- 开启规则,使用错误级别的错误:error
(当被触发的时候,程序会退出)