# 开发指引

## 开发前准备

1.  工具

    > 全局安装下面插件

        ```
        yarn global add prettier
        yarn global add jest
        yarn global add @babel/cli
        ```

2.  ide - vscode

    -   插件 | prettier
    -   jest 单测插件 | Jest Runner

## 1. 完善 package.json

1. 更改 `name`、`description`、`keywords` 字段

## 2. 完善 README.md

1. 填写 `工具名`、`一句话描述`、`使用方式`、`实现方案(选填)`、`其他说明事项(选填)`
2. 根据发布版本, 添加版本说明. 格式如下:
    > 由于初期版本变化可能比较频繁, 暂不以版本号作为版本区分.

```
更新日期: 2021年06月01日
更新内容:
  1. xxx
  2. xxx
  3. ...
```

3. `使用方式` 格式
    1. 安装: 提供 `yarn` or `npm` 其中一种安装方式.
    2. 使用:
        1. 提供命令行命令
        2. 提供参数输入表 | 无参可略过
    3. 介绍其他注意事项

## 3. 目录说明

```
.
|- README.md ------------------------ 项目说明
|- package.json --------------------- 项目描述
|- tsconfig.json -------------------- ts编译配置
|- babel.config.js ------------------ babel 编译配置 | 主要提供给 jest 使用, 源码本身还是走 tsc 编译.
|- prettier.config.js --------------- prettier 格式化插件配置
|- .gitignore ----------------------- git 忽略检查目录
|- ./config  ------------------------ 提供给项目继承用的公共配置
    |- jest.config.js ---------------
    |- jsconfig.json ----------------
    |- tsconfig.json ----------------
    |- .eslintrc.js -----------------
|- /.vscode ------------------------- vscode 配置目录
|- /docs ---------------------------- 文档目录
    |- dev.md ----------------------- 开发说明
|- /src ----------------------------- 源码目录
    |- /__test__ -------------------- 单测目录
        |- *.test.ts ---------------- 单测用例
    |- index.ts --------------------- 入口
    |- ...

```

## 4. 开发

1. 在 [./src/index.ts](../src/index.ts) 中, 实现 `Command` 类, 入口方法默认情况下为 `exec()`.
2. 入口函数

```
// 单例模式
class PackageClassName {
    constructor() {}
}
export default new PackageClassName()

// 原型模式
export default class {

}
```

      1. 差异:
         1. 原型模式导出的对象会被重复实例化, 所以如果存在方法或对象的唯一性, 请考虑通过单例模式进行工具设计.
         2. 参考: http://c.biancheng.net/view/1320.html

1. 关于单元测试
    1. 已集成 jest 单测.
    2. 由于 npm 项目采用 `tsc` 直译方式, 没有通过 webpack 进行包装, 所以, 我们的单测目录位于 `./src/__test__/**`.

## 5. 注意事项

1. `dependencies` 与 `devDependencies` 的差异

    - devDependencies：仅本地开发使用依赖
    - dependencies：实际代码运行使用依赖
    - 所以, 非在用户环境中使用的依赖, 一律使用 `yarn add [package] --dev` 方式添加

2. 我们提倡一个库只做一件事, 如果存在多种功能耦合, 尽可能的通过分包的形式, 进行解耦!

3. 考虑到项目体量的轻便性, 在这套框架内仅集成了 jest 单元测试, 包括后续, 如果不需要考虑单元测试, 也可以对单测目录及配置项进行删除.

4. 这个项目不能用 `@/*`, 因为 不会被 `tsc` 编译器转义