mand-mobile/site/docs/development.md

228 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 开发指南
---
### 环境
* node = 8+
* npm = 3+
### 开发流程
#### 创建组件
```shell
$ npm install # 安装依赖
$ npm run create # 新增组件, 根据提示填写组件信息
```
> 需安装[vue-cli](https://cli.vuejs.org/), v3.0+还需安装[@vue/cli-init](https://www.npmjs.com/package/@vue/cli-init)
#### 开发组件
```shell
$ npm run dev # 访问 http://localhost:4000/[组件名称]
$ npm run dev -- --component [COMPONENT NAME] # npm run dev -- --component button, 访问 http://localhost:4000
```
#### 测试组件
```shell
$ npm test # 全部测试
$ npm run test [component name] # 测试单个组件
```
#### feature/bugfix
新的大版本开发会在统一的开发分支中进行,其他单个组件增加新功能或问题修复流程如下:
```shell
$ git checkout -b [feature_xxx/fix_xxx] origin/dev
# 开发
$ git add --all
$ git commit -am "描述" # 描述参考【Commit规范】git cz
$ git pull --rebase origin dev
# 解决冲突
$ git push origin [feature_xxx/fix_xxx]
# 提交 PR 至 dev 分支, 指定相应人员 review, 根据反馈进一步修改提交
$ git checkout dev
$ git pull
```
### 代码规范
#### 目录规范
```
├── build 构建脚本
├── config 构建环境配置
├── test 测试配置
├── components 组件代码
├── _style 通用样式,图标
├── _util 通用工具方法
├── button 组件目录
├── demo 组件示例
├── test 组件单元测试用例
├── index.vue 组件核心代码
├── ... 组件其他辅助代码或子组件代码
├── README.md 组件说明文档
├── ...
├── examples 组件库示例
├── site 组件库文档站点
├── ...
```
#### 组件规范
##### 组件命名
* 组件名(kebab-case)使用小写字母,以 `-` 分割, 例如 `image-reader`
* 准确表达组件UI或功能且避免过于宽泛。
##### 组件实现
* 依赖
新增外部依赖需要与核心开发成员讨论后决定,尽量选择较为知名开源组件,且避免体积过大。
* 引用
组件内部使用相对路径引用,避免使用`alias`。如`import { extand } from '../util'`。
* 通用方法
通用逻辑和样式使用`_style/*`, `_util/*`, 避免组件代码内部通用逻辑或样式冗余【新增需讨论】
* 样式
使用`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)
##### 组件核心代码
原则上以官方[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>
```
##### 组件单元测试代码
测试工具使用`Jest` + `vue-test-utils`, 原则上各项指标覆盖率要大于`50%`
工具参考文档:
<a href="https://vuejs.org/v2/guide/unit-testing.html" target="_blank">https://vuejs.org/v2/guide/unit-testing.html</a><br>
<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>
#### 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`。一般用于featfix
* 【必填】DESCRIPTION: 内容简要描述,尽量使用英文
* 【可选】ISSUE: 改动关联的issue号码。一般用于featfix