武夷 | 搞定自動化 API 文件

SmingPro武夷發表於2020-03-27

稿定設計匯出-20200327-150301.png

放在前言

為什麼要做自動化 API 文件?

先來看我們內部程式碼的一張圖,我們在做業務的過程中,最苦惱的有 3 件事:

  • 產品頻頻疊加需求
  • 業務程式碼塊缺少註釋,鬼知道原業務程式碼是在幹嘛
  • 介面層缺少文件,很多介面也會因為頻繁變更,從而導致文件的維護是一件相當費時的事情。


為了將這些很煩躁很苦惱的事解決掉(當然不鼓勵大家砍產品哈,主要是解決痛點 2、3 兩件事)可以選擇將註釋自動化生成 API 文件。

image.png


如何做?


實際上,現如今我們有很多自動生成 API 文件的選擇性,這裡主要講 apidocjs 是如何做的,其它自動生成 API 文件工具大同小異,只是 UI 頁面 & 註釋內容存在差異化,大家根據自己喜好選擇即可。

第一趴: apidocjs

  • 安裝
// 專案安裝
npm install --save-dev apidoc

// 全域性安裝
npm install -g apidoc
複製程式碼
  • 建立 apidoc.json
{
    "name": "文件中心",
    "version": "1.0.0",
    "description": "~",
    "title": "文件中心",
    "url": "http://localhost.com:2333",
    "preview-url": "http://localhost.com:2333/apidoc/index.html"
}

複製程式碼
  • 配置 package.json
"apidoc": {
  "title": "文件中心",
  "url": "http://localhost.com:2333"
}
...
"scripts": {
  ...,
  "apidoc": "apidoc -i src/ -o public/apidoc/"
}
複製程式碼
  • 說明 apidoc 命令列引數
引數 描述
-f, --file-filters 可以通過正則來選擇對哪些檔案進行監聽 .cs .dart .erl .go .java .js .php .py .rb .ts.

舉例 ( 監聽.js & .ts 檔案):
apidoc -f ".*\\.js$" -f ".*\\.ts$"
-i, --input 需要 apidoc 監聽的目錄

舉例:
apidoc -i myapp/
-o, --output 輸出目錄

舉例:
apidoc -o apidoc/
-t, --template 使用模板輸出檔案。您可以建立和使用自己的模板。
舉例:
apidoc -t mytemplate/
  • API 示例

apidockjs 很有趣的是它的 @apiDefine(抽離公共塊) @apiUse(使用公共塊) 
@apiDefine 定義公共程式碼塊,然後可以通過@apiUse使用。
@apiUse 使用@apiDefine定義好的程式碼塊。

		/**
     * @apiDefine CommonSuccess 成功響應欄位公共部分
     * @apiSuccess {Number} errcode The success res code.
     * @apiSuccess {Strng} message The res message.
     */
    /**
     * @api {get} /user/test
     * @apiDescription 測試
     * @apiGroup User
     * @apiUse CommonSuccess
     * @apiSuccessExample {json} Success-Response:
     * HTTP/1.1 200 OK
     *  {
     *      "errcode" : 0,
     *      "message": "",
     *      "data" : [{
     *          "name" : "userName",
     *          "email" : "userEmail"
     *      }]
     *  }
     * @apiSampleRequest http://localhost.com/user/test
     * @apiVersion 1.0.0
     */
    @get('/test')
    async test() {
        this.ctx.body = {
            status: 200
        };
    }
複製程式碼
  • 使用

執行 yarn apidoc 

image.png


public/apidoc 目錄下也生成了靜態檔案。
image.png


預覽 index.html 

image.png

第二趴: cz-conventional-changelog

  • 安裝
// 在專案中安裝
npm i commitizen cz-conventional-changelog --save-dev
複製程式碼
  • package.json 配置
"scripts": {
  ...,
	"commit": "git-cz"
}
"config": {
  ...,
  "commitizen": {
    "path": "cz-conventional-changelog"
  }
}
複製程式碼
  • 示例


image.png

第三趴: 自動 run 起來


配置 package.json 

"scripts": {
  "commit": "git-cz",
  "fast-commit": "npm run apidoc && npm run lint && git add public && git-cz",
  "apidoc": "apidoc -i src/ -o public/apidoc/",
  "lint": "tslint --fix -p tsconfig.json -t stylish",
  ...
}
複製程式碼


這樣配置後感覺就像四驅車配置了火箭馬達,爽翻了天。不管三七二十一,先自動生成文件,再做 tslint 最後完成 git commit 規範。

image.png


適合什麼階段搞?


我們要去分析現階段團隊痛點是什麼?

  • 是程式碼太爛可讀性差?
  • 是業務上沒有較好的突破點?
  • 是測試在做功能測試很麻木?
  • 是技術棧不統一換崗學習成本高?

……
我們的第一力量一定是搞團隊的痛點,剩下的力量就去搞比如說 API 文件、自動化構建工具、視覺化圖表等等。
如果你說現在痛點我也在搞,但還想搞一搞這些前端基礎建設,可以不?
答案是肯定的,你可以將基建當做自己技術成長的一部分,做好技術沉澱。

稿定設計匯出-20200306-165424.gif

稿定設計匯出-20200228-160253.gif

附:

{
    "name": "open",
    "version": "1.0.0",
    "apidoc": {
        "title": "文件中心",
        "url": "http://localhost:2333"
    },
    "dependencies": {
        "egg-view-assets": "^1.5.0",
        "egg-view-nunjucks": "^2.2.0",
        "midway": "^1.0.0"
    },
    "devDependencies": {
        "@types/mocha": "^5.2.7",
        "@types/node": "^10.5.5",
        "commitizen": "^4.0.3",
        "cross-env": "^6.0.0",
        "cz-conventional-changelog": "^3.1.0",
        "midway-bin": "1",
        "ts-node": "^8.3.0",
        "tslint": "^5.9.1",
        "tslint-midway-contrib": "1",
        "typescript": "^3.5.0",
        "umi": "2.10.7",
        "umi-plugin-ga": "^1.1.3",
        "umi-plugin-react": "^1.1.1"
    },
    "engines": {
        "node": ">=10.16.0"
    },
    "scripts": {
        "commit": "npm run apidoc && npm run lint && git add public && git-cz",
        "apidoc": "apidoc -i src/ -o public/apidoc/",
        "debug": "cross-env NODE_ENV=local midway-bin debug --ts",
        "lint": "tslint --fix -p tsconfig.json -t stylish",
        "cov": "midway-bin cov --ts",
        "ci": "midway-bin cov --ts",
        "build": "midway-bin build -c",
        "start": "cross-env NODE_ENV=local midway-bin dev --ts --port=10000"
    },
    "config": {
        "build": {
            "deps": "isolation"
        },
        "docker": {
            "os": 7
        },
        "commitizen": {
            "path": "cz-conventional-changelog"
        }
    },
    "midway-bin-build": {
        "include": [
            "app/public",
            "app/view",
            "config/manifest.json"
        ]
    },
    "prettier": {
        "singleQuote": true
    },
    "license": "MIT"
}

複製程式碼

相關文章