前言
本系列文章將通過自己的一個開發工具庫的實戰經驗(踩過的坑)教大家如何開發屬於自己的一個工具庫,在這裡你可以學到Git的使用規範,基礎專案的搭建,程式碼編寫的規範,函數語言程式設計思想,TypeScript實戰,單元測試,編寫文件和釋出NPM包等等知識。
閱讀文章你可能需要以下基礎知識:
- Git的基本使用
- TypeScript
- ES6
專案原始碼
Git專案
Git分支
├── master -------------------------------- 和釋出版本程式碼保持一致
│ ├── dev -------------------------------- 開發分支
│ │ ├── feature -------------------------------- 開發新特性的分支
│ │ ├── hotfix -------------------------------- 修復BUG的分支
複製程式碼
Git提交規範
程式碼有編寫規範,Git提交的資訊當然也要有規範啦。
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
複製程式碼
type
用於說明本次提交的型別:
- feat:新功能(feature)
- fix:修補bug
- docs:文件(documentation)
- style: 格式(不影響程式碼執行的變動)
- refactor:重構(即不是新增功能,也不是修改bug的程式碼變動)
- test:增加測試
- chore:構建過程或輔助工具的變動
scope
用於說明本次改動涉及的範圍,如資料層、控制層,選填。
subject
為本次提交的簡要概述。
這裡是一個栗子:
fix(model): fix something
- fix first bug
- fix second bug
Closes #123
複製程式碼
可是有人不遵守或者無意識地不按格式填怎麼辦呢,這裡就需要工具來做驗證啦,我使用的是ghooks
和validate-commit-msg
,具體看下面。
想看更多Git提交規範知識點這裡:Commit message 和 Change log 編寫指南
專案結構
├── .vscode ------------------------------- vscode相關配置檔案
├── dist ---------------------------------- 構建後檔案的輸出目錄
├── docs ------------------------------ 文件
├── release ---------------------------------- Gulp合併打包後的檔案,用於CDN版本
├── packages ------------------------------ 存放獨立釋出的包的目錄
├── src ----------------------------------- 原始碼
│ ├── __test__ -------------------------- 存放入口檔案的測試用例
│ ├── <module> ------------------------------ 工具庫模組
│ │ ├── __test__ ---------------------- 測試該模組的測試用例
│ │ ├── index.d.ts ---------------------- 該模組的標頭檔案
│ │ ├── index.ts ---------------------- 該模組的實現程式碼
│ ├── utils.d.ts ---------------------------- 公共的標頭檔案
│ ├── utils.ts ------------------------- 匯出所有模組的檔案
├── package.json
├── .eslintignore ----------------------------- eslint忽略配置檔案
├── .eslintrc.js ------------------------- eslint配置檔案
├── .gitignore --------------------------- git忽略配置檔案
├── .npmignore ------------------------------ npm忽略配置檔案,用於釋出
├── .vcmrc ----------------------------- 用於檢驗git提交資訊是否符合格式
├── CHANGELOG.md ------------------------- 版本更變日誌
├── gulpfile.js ---------------------------- gulp
├── index.js ---------------------------- 入口檔案
├── README.md ---------------------------- README
├── tsconfig.json ---------------------------- TypeScript配置檔案
複製程式碼
package.json
{
"name": "windlike-utils", // 要釋出包的名字
"version": "2.0.7", // 版本
"description": "", // 描述
"main": "index.js", // 入口檔案
"scripts": {
"test": "jest", // 測試
"dev": "tsc -w --downlevelIteration", // 開發,檢測程式碼變化並編譯成JS
"start": "node index", // 執行入口檔案
"build": "tsc -d && gulp build", // 打包,編譯成JS並用Gulp合併壓縮
"eslint": "eslint src --ext .ts", // 檢查程式碼格式
"eslint:fix": "eslint src --ext .ts --fix",// 檢查並修復程式碼格式
"log": "conventional-changelog -p angular -i CHANGELOG.md -w -r 0" // 生成版本日誌
},
"repository": {
"type": "git",
"url": "git+https://github.com/MrWindlike/Windlike-Utils.git"
},
"keywords": [],
"author": "Windlike",
"license": "ISC",
"bugs": {
"url": "https://github.com/MrWindlike/Windlike-Utils/issues"
},
"homepage": "https://github.com/MrWindlike/Windlike-Utils#readme",
"devDependencies": {
"@types/jest": "^23.3.0",
"awesome-typescript-loader": "^3.4.0", // TS loader
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-es2015": "^6.24.1",
"babel-runtime": "^6.26.0",
"cz-conventional-changelog": "^2.1.0", // 生成版本日誌的工具
"eslint": "^5.2.0",
"eslint-plugin-typescript": "^0.12.0", // eslint檢測TS程式碼的工具
"ghooks": "^2.0.4", // git週期管理
"gulp": "^3.9.1",
"gulp-concat": "^2.6.1", // gulp合併工具
"gulp-uglify": "^3.0.0", // gulp壓縮工具
"jest": "^23.4.1", // 測試程式碼的工具
"source-map-loader": "^0.2.3",
"ts-jest": "^23.0.1",
"typescript": "^2.6.2",
"typescript-eslint-parser": "^17.0.1", // eslint檢測TS程式碼的工具
"validate-commit-msg": "^2.14.0" // 驗證git提交程式碼工具
},
"jest": { // jest配置
"roots": [
"<rootDir>/src"
],
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json",
"node"
]
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
},
"ghooks": {
"pre-commit": "npm run eslint && npm test", // 提交前檢查程式碼格式和執行測試用例
"commit-msg": "validate-commit-msg" // 提交時驗證提交資訊是否符合格式
}
}
}
複製程式碼
驗證Git提交資訊
使用ghooks
和validate-commit-msg
可以在git提交時檢查資訊。
"ghooks": {
"pre-commit": "npm run eslint && npm test", // 提交前檢查程式碼格式和執行測試用例
"commit-msg": "validate-commit-msg" // 提交時驗證提交資訊是否符合格式
}
複製程式碼
但還需要一個驗證規則的檔案.vcmrc:
{
"types": [
"feat",
"fix",
"docs",
"style",
"refactor",
"perf",
"test",
"build",
"ci",
"chore",
"revert"
],
"scope": {
"required": false,
"allowed": [
"*"
],
"validate": false,
"multiple": false
},
"warnOnFail": false,
"maxSubjectLength": 100,
"subjectPattern": ".+",
"subjectPatternErrorMsg": "subject does not match subject pattern!",
"helpMessage": "",
"autoFix": false
}
複製程式碼
這樣就可以檢驗提交資訊是否符合格式,不符合是不能提交成功的。
TypeScript配置
tsconfig.json:
{
"compilerOptions": {
"outDir": "./dist/", // 輸出目錄
"sourceMap": true, // 是否啟用sourceMap,用於程式碼除錯
"noImplicitAny": true, // 是否不能含有潛在的```any```型別
"module": "commonjs", // 編譯輸出的模組型別
"target": "es5",
"lib": [
"es2017",
"dom"
]
},
"include": [ // 需要編譯的程式碼
"./src/*"
]
}
複製程式碼
總結
這篇文章就講到這裡啦,其他的細節就不一一講啦,想了解其他的配置檔案可以到原始碼倉庫,下篇文章將講下函數語言程式設計的一些知識。