>[success] # 總結來源使用內容來自[深入Vue3+TypeScript技術棧-coderwhy大神新課](https://coderwhy.ke.qq.com/)
# 項目搭建規范
## 一. 代碼規范
### 1.1. 集成editorconfig配置
EditorConfig 有助于為不同 IDE 編輯器上處理同一項目的多個開發人員維護一致的編碼風格。
```yaml
# http://editorconfig.org
root = true
[*] # 表示所有文件適用
charset = utf-8 # 設置文件字符集為 utf-8
indent_style = space # 縮進風格(tab | space)
indent_size = 2 # 縮進大小
end_of_line = lf # 控制換行類型(lf | cr | crlf)
trim_trailing_whitespace = true # 去除行首的任意空白字符
insert_final_newline = true # 始終在文件末尾插入一個新行
[*.md] # 表示僅 md 文件適用以下規則
max_line_length = off
trim_trailing_whitespace = false
```
VSCode需要安裝一個插件:EditorConfig for VS Code

### 1.2. 使用prettier工具
Prettier 是一款強大的代碼格式化工具,支持 JavaScript、TypeScript、CSS、SCSS、Less、JSX、Angular、Vue、GraphQL、JSON、Markdown 等語言,基本上前端能用到的文件格式它都可以搞定,是當下最流行的代碼格式化工具。
1.安裝prettier
```shell
npm install prettier -D
```
2.配置.prettierrc文件:
* useTabs:使用tab縮進還是空格縮進,選擇false;
* tabWidth:tab是空格的情況下,是幾個空格,選擇2個;
* printWidth:當行字符的長度,推薦80,也有人喜歡100或者120;
* singleQuote:使用單引號還是雙引號,選擇true,使用單引號;
* trailingComma:在多行輸入的尾逗號是否添加,設置為 `none`;
* semi:語句末尾是否要加分號,默認值true,選擇false表示不加;
```json
{
"useTabs": false,
"tabWidth": 2,
"printWidth": 80,
"singleQuote": true,
"trailingComma": "none",
"semi": false
}
```
3.創建.prettierignore忽略文件
```
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*
```
4.VSCode需要安裝prettier的插件

5.測試prettier是否生效
* 測試一:在代碼中保存代碼;
* 測試二:配置一次性修改的命令;
在package.json中配置一個scripts:
```json
"prettier": "prettier --write ."
```
### 1.3. 使用ESLint檢測
1.在前面創建項目的時候,我們就選擇了ESLint,所以Vue會默認幫助我們配置需要的ESLint環境。
2.VSCode需要安裝ESLint插件:

3.解決eslint和prettier沖突的問題:
安裝插件:(vue在創建項目時,如果選擇prettier,那么這兩個插件會自動安裝)
```shell
npm i eslint-plugin-prettier eslint-config-prettier -D
```
添加prettier插件:
```json
extends: [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/typescript/recommended",
"@vue/prettier",
"@vue/prettier/@typescript-eslint",
'plugin:prettier/recommended'
],
```
### 1.4. git Husky和eslint
雖然我們已經要求項目使用eslint了,但是不能保證組員提交代碼之前都將eslint中的問題解決掉了:
* 也就是我們希望保證代碼倉庫中的代碼都是符合eslint規范的;
* 那么我們需要在組員執行 `git commit ` 命令的時候對其進行校驗,如果不符合eslint規范,那么自動通過規范進行修復;
那么如何做到這一點呢?可以通過Husky工具:
* husky是一個git hook工具,可以幫助我們觸發git提交的各個階段:pre-commit、commit-msg、pre-push
如何使用husky呢?
這里我們可以使用自動配置命令:
```shell
npx husky-init && npm install
```
這里會做三件事:
1.安裝husky相關的依賴:

2.在項目目錄下創建 `.husky` 文件夾:
```
npx huksy install
```

3.在package.json中添加一個腳本:

接下來,我們需要去完成一個操作:在進行commit時,執行lint腳本:

這個時候我們執行git commit的時候會自動對代碼進行lint校驗。
### 1.5. git commit規范
#### 1.5.1. 代碼提交風格
通常我們的git commit會按照統一的風格來提交,這樣可以快速定位每次提交的內容,方便之后對版本進行控制。

但是如果每次手動來編寫這些是比較麻煩的事情,我們可以使用一個工具:Commitizen
* Commitizen 是一個幫助我們編寫規范 commit message 的工具;
1.安裝Commitizen
```shell
npm install commitizen -D
```
2.安裝cz-conventional-changelog,并且初始化cz-conventional-changelog:
```shell
npx commitizen init cz-conventional-changelog --save-dev --save-exact
```
這個命令會幫助我們安裝cz-conventional-changelog:

并且在package.json中進行配置:

這個時候我們提交代碼需要使用 `npx cz`:
* 第一步是選擇type,本次更新的類型
| Type | 作用 |
| -------- | ------------------------------------------------------------ |
| feat | 新增特性 (feature) |
| fix | 修復 Bug(bug fix) |
| docs | 修改文檔 (documentation) |
| style | 代碼格式修改(white-space, formatting, missing semi colons, etc) |
| refactor | 代碼重構(refactor) |
| perf | 改善性能(A code change that improves performance) |
| test | 測試(when adding missing tests) |
| build | 變更項目構建或外部依賴(例如 scopes: webpack、gulp、npm 等) |
| ci | 更改持續集成軟件的配置文件和 package 中的 scripts 命令,例如 scopes: Travis, Circle 等 |
| chore | 變更構建流程或輔助工具(比如更改測試環境) |
| revert | 代碼回退 |
* 第二步選擇本次修改的范圍(作用域)

* 第三步選擇提交的信息

* 第四步提交詳細的描述信息

* 第五步是否是一次重大的更改

* 第六步是否影響某個open issue

我們也可以在scripts中構建一個命令來執行 cz:

#### 1.5.2. 代碼提交驗證
如果我們按照cz來規范了提交風格,但是依然有同事通過 `git commit` 按照不規范的格式提交應該怎么辦呢?
* 我們可以通過commitlint來限制提交;
1.安裝 @commitlint/config-conventional 和 @commitlint/cli
```shell
npm i @commitlint/config-conventional @commitlint/cli -D
```
2.在根目錄創建commitlint.config.js文件,配置commitlint
```js
module.exports = {
extends: ['@commitlint/config-conventional']
}
```
3.使用husky生成commit-msg文件,驗證提交信息:
```shell
npx husky add .husky/commit-msg "npx --no-install commitlint --edit $1"
```
- 工程化 -- Node
- vscode -- 插件
- vscode -- 代碼片段
- 前端學會調試
- 谷歌瀏覽器調試技巧
- 權限驗證
- 包管理工具 -- npm
- 常見的 npm ci 指令
- npm -- npm install安裝包
- npm -- package.json
- npm -- 查看包版本信息
- npm - package-lock.json
- npm -- node_modules 層級
- npm -- 依賴包規則
- npm -- install 安裝流程
- npx
- npm -- 發布自己的包
- 包管理工具 -- pnpm
- 模擬數據 -- Mock
- 頁面渲染
- 渲染分析
- core.js && babel
- core.js -- 到底是什么
- 編譯器那些術語
- 詞法解析 -- tokenize
- 語法解析 -- ast
- 遍歷節點 -- traverser
- 轉換階段、生成階段略
- babel
- babel -- 初步上手之了解
- babel -- 初步上手之各種配置(preset-env)
- babel -- 初步上手之各種配置@babel/helpers
- babel -- 初步上手之各種配置@babel/runtime
- babel -- 初步上手之各種配置@babel/plugin-transform-runtime
- babel -- 初步上手之各種配置(babel-polyfills )(未來)
- babel -- 初步上手之各種配置 polyfill-service
- babel -- 初步上手之各種配置(@babel/polyfill )(過去式)
- babel -- 總結
- 各種工具
- 前端 -- 工程化
- 了解 -- Yeoman
- 使用 -- Yeoman
- 了解 -- Plop
- node cli -- 開發自己的腳手架工具
- 自動化構建工具
- Gulp
- 模塊化打包工具為什么出現
- 模塊化打包工具(新) -- webpack
- 簡單使用 -- webpack
- 了解配置 -- webpack.config.js
- webpack -- loader 淺解
- loader -- 配置css模塊解析
- loader -- 圖片和字體(4.x)
- loader -- 圖片和字體(5.x)
- loader -- 圖片優化loader
- loader -- 配置解析js/ts
- webpack -- plugins 淺解
- eslit
- plugins -- CleanWebpackPlugin(4.x)
- plugins -- CleanWebpackPlugin(5.x)
- plugin -- HtmlWebpackPlugin
- plugin -- DefinePlugin 注入全局成員
- webapck -- 模塊解析配置
- webpack -- 文件指紋了解
- webpack -- 開發環境運行構建
- webpack -- 項目環境劃分
- 模塊化打包工具 -- webpack
- webpack -- 打包文件是個啥
- webpack -- 基礎配置項用法
- webpack4.x系列學習
- webpack -- 常見loader加載器
- webpack -- 移動端px轉rem處理
- 開發一個自己loader
- webpack -- plugin插件
- webpack -- 文件指紋
- webpack -- 壓縮css和html構建
- webpack -- 清里構建包
- webpack -- 復制靜態文件
- webpack -- 自定義插件
- wepack -- 關于靜態資源內聯
- webpack -- source map 對照包
- webpack -- 環境劃分構建
- webpack -- 項目構建控制臺輸出
- webpack -- 項目分析
- webpack -- 編譯提速優護體積
- 提速 -- 編譯階段
- webpack -- 項目優化
- webpack -- DefinePlugin 注入全局成員
- webpack -- 代碼分割
- webpack -- 頁面資源提取
- webpack -- import按需引入
- webpack -- 搖樹
- webpack -- 多頁面打包
- webpack -- eslint
- webpack -- srr打包后續看
- webpack -- 構建一個自己的配置后續看
- webpack -- 打包組件和基礎庫
- webpack -- 源碼
- webpack -- 啟動都做了什么
- webpack -- cli做了什么
- webpack - 5
- 模塊化打包工具 -- Rollup
- 工程化搭建代碼規范
- 規范化標準--Eslint
- eslint -- 擴展配置
- eslint -- 指令
- eslint -- vscode
- eslint -- 原理
- Prettier -- 格式化代碼工具
- EditorConfig -- 編輯器編碼風格
- 檢查提交代碼是否符合檢查配置
- 整體流程總結
- 微前端
- single-spa
- 簡單上手 -- single-spa
- 快速理解systemjs
- single-sap 不使用systemjs
- monorepo -- 工程
- Vue -- 響應式了解
- Vue2.x -- 源碼分析
- 發布訂閱和觀察者模式
- 簡單 -- 了解響應式模型(一)
- 簡單 -- 了解響應式模型(二)
- 簡單 --了解虛擬DOM(一)
- 簡單 --了解虛擬DOM(二)
- 簡單 --了解diff算法
- 簡單 --了解nextick
- Snabbdom -- 理解虛擬dom和diff算法
- Snabbdom -- h函數
- Snabbdom - Vnode 函數
- Snabbdom -- init 函數
- Snabbdom -- patch 函數
- 手寫 -- 虛擬dom渲染
- Vue -- minVue
- vue3.x -- 源碼分析
- 分析 -- reactivity
- 好文
- grpc -- 瀏覽器使用gRPC
- grcp-web -- 案例
- 待續