"規範是個好東西..." - 魯迅
如下規範僅做爲參考node
命名git
文件命名採用下劃線命名法json
// good service_center.js // bad serviceCenter.js
類 & 構造函數命名api
class Person { constructor(name) { this.name = name; } } const person = new Person('小明');
方法名數組
// good function getName() { ... return this.name; } function isExist() { ... return true; }
變量命名服務器
// good let maxLength = 10; // bad let setLength = 10;
常量命名併發
註釋規範app
function addNumber() { return 3 + 2; // 5 }
function addNumber(a, b) { return a + b; } // 調用求和方法 addNumber(2, 3);
格式規範curl
其餘規範async
// good const a = 1; const b = 2; // good let count = 1; if (true) { count += 1; }
// bad function sayHi(name) { return 'How are you, ' + name + '?'; } // good function sayHi(name) { return `How are you, ${name}?`; }
// good const obj = {}; // bad const obj = new Object();
對象方法的簡寫
// bad const atom = { value: 1, addValue: function (value) { return atom.value + value; }, }; // good const atom = { value: 1, addValue(value) { return atom.value + value; }, };
對象屬性值的簡寫
const lukeSkywalker = 'Hello World'; // bad const obj = { lukeSkywalker: lukeSkywalker }; // good const obj = { lukeSkywalker };
// bad const arr = new Array(); // good const arr = [];
// bad const len = arr.length; const arrCopy = []; let i; for (i = 0; i < len; i++) { arrCopy[i] = arr[i]; } // good const arrCopy = [...arr];
// bad function getFullName(user) { const firstName = user.firstName; const lastName = user.lastName; return `${firstName} ${lastName}`; } // good function getFullName(user) { const { firstName, lastName } = user; return `${firstName} ${lastName}`; } // best function getFullName({ firstName, lastName }) { return `${firstName} ${lastName}`; }
// bad const foo = function () { }; // good function foo() { }
// bad function foo() { const that = this; return function() { console.log(that); }; } // good function foo() { return () => { console.log(this); }; }
語法原則
命名規範:
路由規範(URI)
good: /api/v1/uic/check/login bad: /api/v1/uic/checkLogin
good:/api/v1/dubhe/task_run_history bad: /api/v1/dubhe/task-run-history
good:/api/v2/dubhe/tasks bad: /api/v1.1/dubhe/tasks
HTTP Method
good: GET /api/v1/dubhe/tasks bad: GET /api/v1/dubhe/task_list
POST /api/v1/dubhe/start/task/:taskId
good:GET /api/v1/uic/users/:userId bad: GET /api/v1/uic/users?userId=1234
good: POST /api/v1/uic/users body: { "userId": 1, "userName": "用戶名", "tenantId": 1, "tenantName": "租戶名" } ◦ bad: POST /api/v1/uic/users body: { "user_id": 1, "user_name": "用戶名", "tenant_id": 1, "tenant_name": "租戶名" }
接口返回值格式
默認統一格式爲 application/json (文件下載除外)
返回體json數據中包含以下4個字段:
success : 描述接口返回成功仍是失敗,取值 true or false code: 接口返回的錯誤碼,錯誤碼的規範由各個業務系統自行約束 推薦使用英文大寫枚舉值,如: ERROR_UNAUTH ERROR_INVALID_PARAM ERROR_NO_PERMISSION message: 接口返回錯誤時的描述信息,如: param transform failed, userId should be a number. content: 接口返回成功時的數據內容, json格式
示例:
成功: { "success": true, "code": "", "message": "", "content": { "id": 1, "name": 2, "email": "12345@sina.cn" } } 注:content的內容及格式由接口實現者給出 失敗: { "success": false, "code": "ERROR_NO_PERMISSION", "message": "you have no permission", "content": "" }
◦
{ "success": true, "code": "", "message": "", "content": { "count": 20, // 數據總條數 "currentPage": 1, // 當前頁碼 "pageSize": 10, // 每頁的數據條數 "data":[ ] } } 注:data中的內容及格式由接口實現者給出
標杆API設計樣例
{ "success": true, "code": 0, "message": null, "content": [ { "functionId": 6530, "functionName": "登陸權限", "functionCode": "dsp_page", "description": null, "type": "1", "productId": 102, "groupId": null, "groupName": null, "enabled": 1, "invalid": "N", "createTime": "2018-03-21T03:13:06.000Z", "modifyTime": "2018-03-21T03:13:06.000Z" }, { "functionId": 6528, "functionName": "用戶頁面-管理", "functionCode": "user_page", "description": null, "type": "1", "productId": 85, "groupId": null, "groupName": null, "enabled": 1, "invalid": "N", "createTime": "2018-03-13T13:35:11.000Z", "modifyTime": "2018-03-13T13:35:11.000Z" } ] }
此規範約束的是package.json中的version以及git倉庫中打tag的規範。
標準的版本號必須採用 X.Y.Z 的格式,其中 X、Y、Z 爲非負的整數,且禁止在數字前方加前導零。X 是主版本號、Y 是次版本號、 Z 爲修訂號。每一個元素必須以數值來遞增。例如:1.9.0 -> 1.10.0 -> 1.11.0
FQ:
A:一旦發現本身破壞了語義化版本控制的規範,就要修正這個問題,併發行一個新的次版本號來更正這個問題,而且恢復向下兼容。即便是這種狀況,也不能去修改已發行的版本。能夠的話,將有問題的版本號記錄到文檔中,告訴使用者問題所在,讓他們可以意識到這是有問題的版本。
A:這是開發者的責任感和前瞻性的問題。不兼容的改變不該該輕易被加入到有許多依賴代碼的軟件中。升級所付出的代價必須是有意義的。要遞增主版本號來發行不兼容的版本,意味着你已經爲這些改變所帶來的影響慎重考慮過,而且評估了所涉及的成本/效益比。
操做
項目每週迭代狀況下,每次發佈時增長次版本號,若是發佈失敗從新修改後發佈則增長修訂號。
package.js { "version": "1.0.0" } Makefile tag: @cat package.json | xargs -0 node -p 'JSON.parse(process.argv[1]).version' | xargs git tag @git push origin --tags
提交版本號:
使用make命令
$make tag
或
// 刪除版本號 git tag -d 1.0.0 // 添加版本號 git tag 1.0.0 // 推送到git服務器 git push origin --tags
{ // 開啓了Node.js 和 Mocha 兩個環境,會自動識別其中的全局變量 "env": { "node": true, "mocha": true }, "plugins": [], "parserOptions": { // 使用 ES2017 的語法 "ecmaVersion": 8, "sourceType": "script", "ecmaFeatures": { } }, "rules": { // 強制駝峯法命名變量 "camelcase": ["error"], // 不容許在條件判斷語句中使用賦值語句 "no-cond-assign": ["error"], // 禁用行尾空格 "no-trailing-spaces": ["error"], // 不容許在代碼裏寫 console.xxx 語句 "no-console": ["error"], // 不容許使用 var 聲明變量 "no-var": ["error"], // 不能直接 return 賦值語句 "no-return-assign": ["error"], // 不容許給函數參數從新賦值 "no-param-reassign": ["error"], // 不容許註釋跟代碼在同一行 "no-inline-comments": ["error"], // 逗號前面不容許有空格,逗號後面必須有空格 "comma-spacing": ["error", {"before": false, "after": true}], // 強制始終使用分號結尾 "semi": ["error", "always"], // 強制始終使用大括號,就算代碼塊中只有一條語句 "curly": ["error", "all"], // 強制使用 === 和 !== "eqeqeq": ["error", "always"], // 大括號的風格,前面一個在行末,後面一個在行首 "brace-style": ["error"], // 縮進格式爲2個空格,switch語句的case子句也是縮進2個空格 "indent": ["error", 2, {"SwitchCase": 1}], // 一行代碼的最大長度,tab計算爲2個空格,忽略註釋部分 "max-len": ["error", 180, 2, {"ignoreComments": true}], // 禁止出現未被使用過的變量 "no-unused-vars": ["error"], // 可使用的地方強制使用箭頭函數 "prefer-arrow-callback": ["error"], // 強制統一使用單引號 "quotes": ["error", "single"], // 強制在關鍵字先後使用空格 "keyword-spacing": ["error"], // 冒號前面不容許有空格,冒號後面強制須要一個空格 "key-spacing": ["error"], // 分號前不容許有空格,分號後強制須要空格 "semi-spacing": ["error", {"before": false, "after": true}], // json 對象大括號先後不容許有空格 "object-curly-spacing": ["error", "never"], // 操做符先後必須有空格 "space-infix-ops": ["error"], // (左)大括號前強制空格 "space-before-blocks": ["error"] }, "globals": { } }