修订日期 | 修订内容 | 版本号 | 修订人 |
2017.9.26 |
| V1.0 | XXX |
2017.11.15 | RN升级到0.50版本,app入口修改 | V1.1 | XXX |
一、编程规范
1) 命名规则
a) 【强制】不能用‘$’或‘_’开始/结束
b) 【强制】严禁用拼音命名,请用有含义的英文单词
c) 【强制】类名:首字母大写的驼峰形式,比如LoginPage/MsgPage
d) 【强制】方法名,参数名,成员变量,局部变量:首字母小写的驼峰形式,比如localValue / getHttpMessage() / inputUserId
e) 【强制】常量:
- 全字符大写,下划线分割,使用明确的单词,不嫌名字长。正例: MAX_STOCK_COUNT 反例: MAX_COUNT
- 先定义,后使用
- 常量类按照功能分不同文件维护,比如配置相关的放在ConfigConsts.js里。
f) 【强制】周知的可缩写的单词,使用缩写,比如userMsg 好于 userMessaage, userPic 好于userPicture
g) 【强制】文件夹:名字无论多长,都小写。
2) 格式规则
a) 【推荐】推荐使用三目运算符,替换if/else
b) 【推荐】尽量不要在if条件中加入过多的判断,这样会增加代码阅读难度和bug产生
c) 【强制】在一个 switch 块内,每个case要么通过 break/return 等来终止,要么注释说明程序将继续执行到哪一个case 为止;在一个 switch 块内,都必须包含一个default 语句并且 放在最后,即使它什么代码也没有
d) 【强制】空格的使用:
- if/for/while/switch/do等保留字与左右括号之间都必须加空格
- 任何运算符左右必须加一个空格
- 缩进采用 4 个空格,禁止使用tab 字符
- 方法参数在定义和传入时,多个参数逗号后边必须加空格
onMsgByCallAndMsg=(msg, title, type)=>{
this.setState({
callMsgAndMsg:msg
})
}
e) 换行的使用
- 运算符与下文一起换行
- 方法调用的点符号与下文一起换行
- 在多个参数超长,逗号后进行换行
- 【推荐】方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间用一个空行分割。
- 【强制】使用链式调用的时候,每个方法都要换行
const path = Path()
.moveTo(0, -radius/2)
.arc(0,radius, 1)
.arc(0,-radius, 1)
.close();
3) package.json
a) 【强制】使用npm下载组件的时候,必须在命令结尾添加 –save,确保下载的组件关联在package.json中。其他成员更新代码或者下载后,使用npmi就可以获取必要的组件。
b) 【强制】使用git或者GitHub管理代码版本时,不要上传node_module文件。
c) 【强制】必须配置readme文件,说明配置相关或者注意事项。
d) 【推荐】使用npm,推荐使用~标记版本。第三方组件可以使用最新的,RN库使用约定的版本
4) 注释规则
a) 【强制】所有js文件都要有头部注释,具体同js开发规范(必要:开发者,开发时间,文件用途)
b) 【强制】所有方法要有注释,具体同js开发规范(必要:参数说明,返回说明)
c) 【强制】所有的常量,都要有注释,说明用途
d) 【参考】注释掉的代码,要配合必要的说明。说明这些代码是之后还用,还是完全废弃,或其他原因。完全废弃的代码建议删掉,代码仓库会有备份。
e) 【参考】多人开发同一文件,每个人写的代码,添加注释的时候写明修改人。
5) 日志规则
a) 【推荐】console.log()可以作为调试的手段,但是会消耗性能,确定代码无误后建议删除。推荐使用下面的方法。
b) RN中有一个全局变量__DEV__用于指示当前运行环境是否是开发环境。可以使用下面的代码判断环境,如果是打包发布,所有的log都替换成空函数,开发时则可以正常使用。
if (!__DEV__) {
global.console= {
info: ()=> {},
log: ()=> {},
warn: ()=> {},
error: ()=> {},
};
}
6)
二、RN项目目录结构规范
以下目录结构示例中只展示js与静态资源,不包含原生代码。在components和pages文件夹中,可以为一些高内聚的模块再细分目录
├── index.js 项目入口
├──app.js 路由入口
└── app
├── components 组件,其中文件
用Component结尾
├── purecomponent 无状态组件,组件内部没有state,可以使用props进行属性值控制。
├── pages 完整页面,就是路由配置使用的页面。其中文件
用Page结尾
├── config 配置项(常量、接口地址、路由、多语言化等预置数据)
├── utils 工具项(非UI组件)
├── style 全局样式库
├── resources 资源文件夹,可以包含图片,音频,视频,静态json文件等。
├── actions redux(可选是否使用)
├── reducers redux
├── store redux
└── constant redux
三、RN页面开发规范
1) state,props
a) 【强制】代码中初始化state在constructor(props)方法中,对每个变量进行注释
b) 【强制】代码中使用setState,异步会导致问题,尽量使用回调函数。
this.setState({
//todo
},()=>{
//执行setState后执行此函数
})
c) 【强制】代码中使用props,需进行propTypes检测和defaultProps默认值初始化
static propTypes = {
color:PropTypes.string,
dotRadius: PropTypes.number,
size:PropTypes.number
};
staticdefaultProps = {
color:'#1e90ff',
dotRadius: 10,
size: 40
};
d) 【强制】代码中,除组件原有方法,其他自定义方法强制使用箭头函数;自定义方法调用的时候,需要绑定this
//原有放阿飞
constructor(props){
super(props);
};
//自定义方法
goMainPage=()=>{
};
e) 【推荐】初始化的数据,配置信息,推荐在componentWillMount中初始化
f) 【强制】代码中使用了定时器,监听,必须在组件componentWillUnmount销毁或者清除
g) 【强制】使用本地图片,必须设置宽高并进行适当适配。
h) 【强制】在RN版本小于46时,配置不同尺寸的屏幕,需要引入不同尺寸的图片,图片用@结尾。
i)
2) 样式规则
a) 【强制】样式属性大于等于三个的时候,使用StyleSheet创建样式属性。小于三个,可以使用行内样式
b) 【推荐】建立全局样式文件,管理公用样式,这点同web开发
3) var let const
a) 【强制】常量使用const。const定义的常量,不能修改,修改会报错
b) 【推荐】变量使用let。Let定义的变量,定义之前不能使用,会报错
4) 语法
a) 【强制】使用ES6语法
四、RN页面开发规范
1) 组件引用,变量定义
a) 【强制】react组件,react-native组件优先,npm组件第二,自定义组件最后
b) 【强制】变量,常量的初始化,放在组件引用之后。
c) 【推荐】没有使用的组件和变量,常量,推荐及时删除
2) 项目入口
a) 【强制】0.50版本之后,index.js为app入口,和index.js平级的app.js为程序(路由)入口
b) 【强制】RN开发,不要使用任何后端开发模式,比如MVC,MVVC等。RN推荐组件化,颗粒化,后端模式和这个原则相违背。如果使用redux框架,则使用它的结构
五、 版本升级&代码迁移策略
1) 【强制】APP在未发布或者正常使用时,请使用最新版本和组件。
2) 【强制】当低版本APP进行迭代升级时,需进行版本升级时,必须进行代码备份。同时,新建同名最新版本项目,进行相关代码迁移和功能配置。
2)
六、 其他
1) 【推荐】使用ESLint检查代码错误
七、 备用