# Develop
开发文档,如何从头开始开发一个组件
## 1. Prepare
下载源代码 [`https://github.com/jdthfe/eui/tree/master`](https://github.com/jdthfe/eui/tree/master)
安装依赖
```bash
yarn install
```
切换一个新分支
## 2. Lint
为了规范开发,代码使用了严格的 `eslint` 、`prettier` 和 `stylelint`。推荐使用辅助插件,达到保存文件时自动格式化代码的效果。
以 vscode 为例
1. 安装并启用扩展 `Eslint` 、`Prettier - Code formatter` 、`stylelint`(选择工作区启用,防止影响其他项目)
2. 基于 vscode,增加如下配置
```json
{
// 增加测试快照可读性
"files.associations": { "*.ts.snap": "html" },
// 储存时自动格式化
"editor.formatOnSave": true,
// 允许在如下语言中提示错误和自动修复
"eslint.validate": [
"javascript",
"javascriptreact",
{ "language": "typescript", "autoFix": true },
{ "language": "typescriptreact", "autoFix": true }
],
// 关联 prettier & stylelint
"prettier.stylelintIntegration": true
}
```
3. `ctrl` + `p` | `command` + `p` ,输入 `>reload window`,重载窗口
4. 完成!可以通过保存来自动格式化文件了
## 3. New
**辅助开发所使用的脚本,详细说明请查看 [scripts.md](./scripts.md)**
本地启动项目
```
yarn dev
```
新建一个组件
```
yarn new
```
假设新组建名字为 `Learn`,下面将会依次介绍生成的文件
---
`src/Learn/index.tsx`
```tsx
import React from 'react';
// 辅助 className 拼接 https://github.com/JedWatson/classnames#readme
import classnames from 'classnames';
import { LearnProps } from './PropsType';
// 组件通用前缀
import { prefix } from '../_util/';
const prefixCls = `${prefix}-learn`;
// 如果组件中包含其他组件,禁止从 src/index 中引入
// 应该直接从同级引入。eg:
// import TouchFeedback from '../TouchFeedback';
// 引入通用变量
// import { Variable } from '../../_util/';
// const { transitionFade } = Variable;
// Function Component
const Learn = (props: LearnProps) => {
// 如果某属性为选填,请赋初始值。必填属性不赋值
// api 脚本会读取此处的初始值在 readme 中生成表格
const { prop = 'default', className, children, ...restProps } = props;
const cls = classnames(prefixCls, className);
return (
{prop} | {children}
);
};
export default Learn;
```
有关函数组件的格式和写法,请参考 `MessageBox`、`Toast` 组件
---
`src/Learn/PropsType.tsx`
```tsx
// 组件需要继承 return 的最外层元素的属性
// 在 index.tsx 文件中,可以通过鼠标悬停在对应元素上,来查看属性全称
// 默认是 div 的属性
export interface LearnProps extends React.DetailedHTMLProps, HTMLDivElement> {
// 属性的描述必须用 /** contentn */ 注释,并且使用英文
/** description */
prop?: string;
}
```
有关函数组件属性的格式和写法,请参考 `MessageBox`、`Toast` 组件
有关封装用组件属性的格式和写法,请参考 `TouchFeedback`、`Cover` 组件
---
`src/Learn/style/index.scss`
```scss
// 组件样式,组件内禁止使用特定 px 值,必须引用变量。方便修改
@import '../../style/mixin';
$learn-prefix: $preifx + '-learn';
.#{$learn-prefix} {
text-decoration: underline;
}
```
---
`src/Learn/demo/index.tsx`
demo 文件用于展示、说明和测试组件效果,建议提供覆盖组件中所有 api 的样例
```tsx
import React from 'react';
// 如果组件中包含其他组件,请按如下方式引入
import { Learn } from '@src/index';
const Demo = () => {
return (
children
children
);
};
export default Demo;
```
---
`src/Learn/demo/readme.md`
`src/Learn/demo/readme.zh-CN.md` 请在对应语言的文档中使用对应语言
如果需要新增语言
1. 所有存在 `*.zh-CN.md` 的文档都需要新增对应语言文档。
2. 全局搜索 `!tag new language`,增加新语言代码。
```md
(标题会自动添加于此,请到 site/\_util/componentIndex.tsx 中完善组件的其他语言名称)
description
(demo 源码会自动添加在 ## Demo 之下,请勿删除 ## Demo)
## Demo
other description
## API
| Properties | Descrition | Type | Default | Required |
| ---------- | ----------- | -------- | ----------- | -------- |
| prop | description | `string` | `'default'` | `false` |
(运行 yarn api 之后会生成新的 api table 在此,请复制并粘贴到其他语言中修改)
```
---
`src/Learn/__testS__/demo.test.tsx`
通用测试,生成 demo 文件运行之后的快照。一般不需要修改
```tsx
import webDemoTest from '@tests/shared/demoTest';
webDemoTest('Learn');
```
---
`src/Learn/__testS__/index.test.tsx`
对 demo 测试中未覆盖到处进行补充
```tsx
describe('Learn', () => {
// Supplement uncovered test
it('trigger event correctly', () => {
expect(true).toBe(true);
});
});
```
## 4. Test
运行 `yarn test Learn` 可以测试单组件,并且生成覆盖率报告在 `src/Learn/__testS__/coverage` 中
请参照覆盖率报告,补充组件的测试直到覆盖率大于 90%
测试写法可以参照已有组件,在此不再赘述
提交之前务必运行 `yarn test` 测试全部组件,确保测试通过
页面 build 部署、npm 提交等均由 `Travis` 脚本自动完成,详细配置在 `.travis.yml` 中
## 5. Prod
```bash
yarn prod
```
将生成打包完成的组件,用以本地使用或者单独发布