| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | --- | 
					
						
							|  |  |  |  | title: 开发指南 | 
					
						
							|  |  |  |  | --- | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ### 环境
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-16 22:21:49 +08:00
										 |  |  |  | * node = 8+ | 
					
						
							| 
									
										
										
										
											2018-06-03 22:57:34 +08:00
										 |  |  |  | * npm = 3+ | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | ### 开发流程
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### 创建组件
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```shell | 
					
						
							|  |  |  |  | $ npm install # 安装依赖 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | $ npm run create # 新增组件, 根据提示填写组件信息 | 
					
						
							|  |  |  |  | ``` | 
					
						
							| 
									
										
										
										
											2019-08-07 16:07:00 +08:00
										 |  |  |  | > 需安装[vue-cli](https://cli.vuejs.org/), v3.0+还需安装[@vue/cli-init](https://www.npmjs.com/package/@vue/cli-init)
 | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | #### 开发组件
 | 
					
						
							|  |  |  |  | ```shell | 
					
						
							|  |  |  |  | $ npm run dev # 访问 http://localhost:4000/[组件名称] | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 23:37:51 +08:00
										 |  |  |  | $ npm run dev -- --component [COMPONENT NAME] # npm run dev -- --component button, 访问 http://localhost:4000 | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### 测试组件
 | 
					
						
							|  |  |  |  | ```shell | 
					
						
							|  |  |  |  | $ npm test # 全部测试 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | $ npm run test [component name] # 测试单个组件 | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | #### feature/bugfix
 | 
					
						
							| 
									
										
										
										
											2018-12-10 23:53:25 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 新的大版本开发会在统一的开发分支中进行,其他单个组件增加新功能或问题修复流程如下: | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | ```shell | 
					
						
							| 
									
										
										
										
											2018-12-10 23:53:25 +08:00
										 |  |  |  | $ git checkout -b [feature_xxx/fix_xxx] origin/dev | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | # 开发
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | $ git add --all | 
					
						
							|  |  |  |  | $ git commit -am "描述" # 描述参考【Commit规范】git cz | 
					
						
							| 
									
										
										
										
											2018-12-10 23:53:25 +08:00
										 |  |  |  | $ git pull --rebase origin dev | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | # 解决冲突
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | $ git push origin [feature_xxx/fix_xxx] | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-08 12:06:12 +08:00
										 |  |  |  | # 提交 PR 至 dev 分支, 指定相应人员 review, 根据反馈进一步修改提交
 | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-10 23:53:25 +08:00
										 |  |  |  | $ git checkout dev | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | $ git pull | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | ### 代码规范
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### 目录规范
 | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | ├── build              构建脚本 | 
					
						
							|  |  |  |  | ├── config             构建环境配置 | 
					
						
							|  |  |  |  | ├── test               测试配置 | 
					
						
							|  |  |  |  | ├── components         组件代码 | 
					
						
							|  |  |  |  |     ├── _style         通用样式,图标 | 
					
						
							|  |  |  |  |     ├── _util          通用工具方法 | 
					
						
							|  |  |  |  |     ├── button         组件目录 | 
					
						
							|  |  |  |  |         ├── demo       组件示例 | 
					
						
							|  |  |  |  |         ├── test       组件单元测试用例 | 
					
						
							|  |  |  |  |         ├── index.vue  组件核心代码 | 
					
						
							|  |  |  |  |         ├── ...        组件其他辅助代码或子组件代码 | 
					
						
							|  |  |  |  |         ├── README.md  组件说明文档 | 
					
						
							|  |  |  |  |     ├── ... | 
					
						
							|  |  |  |  | ├── examples           组件库示例 | 
					
						
							| 
									
										
										
										
											2018-12-28 14:54:22 +08:00
										 |  |  |  | ├── site               组件库文档站点 | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | ├── ... | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #### 组件规范
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### 组件命名
 | 
					
						
							|  |  |  |  | * 组件名(kebab-case)使用小写字母,以 `-` 分割, 例如 `image-reader`。 | 
					
						
							|  |  |  |  | * 准确表达组件UI或功能且避免过于宽泛。 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### 组件实现
 | 
					
						
							|  |  |  |  | * 依赖 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   新增外部依赖需要与核心开发成员讨论后决定,尽量选择较为知名开源组件,且避免体积过大。 | 
					
						
							|  |  |  |  | * 引用 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   组件内部使用相对路径引用,避免使用`alias`。如`import { extand } from '../util'`。 | 
					
						
							|  |  |  |  | * 通用方法 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   通用逻辑和样式使用`_style/*`, `_util/*`, 避免组件代码内部通用逻辑或样式冗余【新增需讨论】 | 
					
						
							| 
									
										
										
										
											2018-06-03 22:57:34 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | * 样式 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-03 22:57:34 +08:00
										 |  |  |  |   使用`stylus`; 单位统一使用`px`; 所有图标使用内置svg图标, 详情见组件`Icon`。 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 注意:通用样式,工具方法的详细使用文档参考Wiki,[Style](https://github.com/didi/mand-mobile/wiki/Style),[Utils](https://github.com/didi/mand-mobile/wiki/Utils),[Scroll](https://github.com/didi/mand-mobile/wiki/Scroll),[FormatValue](https://github.com/didi/mand-mobile/wiki/FormatValue) | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | ##### 组件核心代码
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 原则上以官方[vue-sytle-guide](https://vuejs.org/v2/style-guide/#Component-instance-options-order-recommended)为标准,常用部分如下: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```html | 
					
						
							|  |  |  |  | <template> | 
					
						
							|  |  |  |  |   <!-- 根元素以mfe-[组件名]作为类名 --> | 
					
						
							|  |  |  |  |   <!-- 多个动态属性需分为多行 --> | 
					
						
							|  |  |  |  |   <!-- 统一使用指令缩写 : @ --> | 
					
						
							|  |  |  |  |   <div | 
					
						
							|  |  |  |  |     class="md-button" | 
					
						
							|  |  |  |  |     :class="[type]" | 
					
						
							|  |  |  |  |   > | 
					
						
							|  |  |  |  |     <!-- 其他组件名称和prop属性使用kebab-case,且避免使用自闭合 --> | 
					
						
							|  |  |  |  |     <my-component greeting-text="hi"></my-component> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     <!-- 尽量将v-for/v-if提取到单独template中 --> | 
					
						
							|  |  |  |  |     <!-- v-for 必须增加 key --> | 
					
						
							|  |  |  |  |     <template v-if="foo"> | 
					
						
							|  |  |  |  |       Hello A | 
					
						
							|  |  |  |  |     <template> | 
					
						
							|  |  |  |  |     <template v-else> | 
					
						
							|  |  |  |  |       Hello B | 
					
						
							|  |  |  |  |     <template> | 
					
						
							|  |  |  |  |   </div> | 
					
						
							|  |  |  |  | </template> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <script> | 
					
						
							|  |  |  |  | import MyComponent from '../my-component' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // options须严格按照如下顺序,其他可参考vue-style-guide | 
					
						
							|  |  |  |  | export default { | 
					
						
							|  |  |  |  |   // 必须以"md-[组件名]"作为前缀,避免与html元素冲突 | 
					
						
							|  |  |  |  |   name: 'md-button', | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   components: { | 
					
						
							|  |  |  |  |     [MyComponent.name]: MyComponent | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   // props须以明细方式书写 | 
					
						
							|  |  |  |  |   // 统一采用事件触发,避免使用props传入回调方法 | 
					
						
							|  |  |  |  |   props: { | 
					
						
							|  |  |  |  |     // js中prop属性需用驼峰 | 
					
						
							|  |  |  |  |     greetingText: { | 
					
						
							|  |  |  |  |       type: String, | 
					
						
							|  |  |  |  |       default: 'primary' | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   // data必须为函数 | 
					
						
							|  |  |  |  |   data () { | 
					
						
							|  |  |  |  |     return { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   computed: { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   watch: { | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   // LiftCircle Hook, | 
					
						
							|  |  |  |  |   /* | 
					
						
							|  |  |  |  |   beforeCreate | 
					
						
							|  |  |  |  |   created | 
					
						
							|  |  |  |  |   beforeMount | 
					
						
							|  |  |  |  |   mounted | 
					
						
							|  |  |  |  |   beforeUpdate | 
					
						
							|  |  |  |  |   updated | 
					
						
							|  |  |  |  |   activated | 
					
						
							|  |  |  |  |   deactivated | 
					
						
							|  |  |  |  |   beforeDestroy | 
					
						
							|  |  |  |  |   destroyed | 
					
						
							|  |  |  |  |   errorCaptured | 
					
						
							|  |  |  |  |    */ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   methods: { | 
					
						
							|  |  |  |  |     // 私有方法以'$_'开头 | 
					
						
							|  |  |  |  |     $_privateMethod () { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     // 监听事件方法以'$_on'开头,如 $_onButtonClick | 
					
						
							|  |  |  |  |     $_onSthEvent (event) { | 
					
						
							|  |  |  |  |       // 事件名称无需增加on | 
					
						
							|  |  |  |  |       this.$emit('active', 'hello') | 
					
						
							|  |  |  |  |     }, | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     // 对外暴露方法 | 
					
						
							|  |  |  |  |     publicMethod () { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | </script> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <style lang="stylus" scoped> | 
					
						
							|  |  |  |  |   .md-button | 
					
						
							|  |  |  |  |     xxx | 
					
						
							|  |  |  |  | </style> | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | ##### 组件单元测试代码
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-10 23:53:25 +08:00
										 |  |  |  | 测试工具使用`Jest` + `vue-test-utils`, 原则上各项指标覆盖率要大于`50%` | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 工具参考文档: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <a href="https://vuejs.org/v2/guide/unit-testing.html" target="_blank">https://vuejs.org/v2/guide/unit-testing.html</a><br> | 
					
						
							| 
									
										
										
										
											2018-12-10 23:53:25 +08:00
										 |  |  |  | <a href="https://jestjs.io/docs/getting-started.html" target="_blank">https://jestjs.io</a><br> | 
					
						
							|  |  |  |  | <a href="https://vue-test-utils.vuejs.org" target="_blank">https://vue-test-utils.vuejs.org</a> | 
					
						
							| 
									
										
										
										
											2018-03-27 15:52:31 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | #### Commit规范
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | commit信息应符合如下规则, 建议使用工具`comitzen`(`git cz`)代替`git commit` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ```shell | 
					
						
							|  |  |  |  | [TYPE](SCOPE):DESCRIPTION#[ISSUE]  # 如 feat(button):add type 'ghost' for form usage #1234 | 
					
						
							|  |  |  |  | ``` | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | * 【必填】TYPE: 类型描述。包括`feat`(功能),`fix`(修复),`doc`(文档),`build`(工程化),`example`(示例, 仅用于修改examples/*) | 
					
						
							|  |  |  |  | * 【可选】SCOPE: 影响的组件,比如`button`。一般用于feat,fix | 
					
						
							|  |  |  |  | * 【必填】DESCRIPTION: 内容简要描述,尽量使用英文 | 
					
						
							|  |  |  |  | * 【可选】ISSUE: 改动关联的issue号码。一般用于feat,fix | 
					
						
							|  |  |  |  | 
 |