
1, .husky文件

由于代碼校驗(yàn)工具需要每次手動使用命令執(zhí)行,才會格式化項(xiàng)目代碼,這樣很容易讓人忘記執(zhí)行就把代碼提交了。
husky的作用就是在代碼提交之前觸發(fā)git hook(git在客戶端的鉤子),然后執(zhí)行pnpm run format來自動的格式化我們的代碼。
-
eslint文件
image.png
eslint 它的目標(biāo)是提供一個插件化的JavaScript代碼檢測工具。雖然項(xiàng)目里使用了TypeScript,但TypeScript也是JavaScript的超集,所以也是可以使用eslint 進(jìn)行檢查的。eslintrc.js里面的配置很多就不細(xì)細(xì)解讀了
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
jest: true,
},
/* 指定如何解析語法 */
parser: 'vue-eslint-parser',
/** 優(yōu)先級低于 parse 的語法解析配置 */
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: '@typescript-eslint/parser',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true,
},
},
/* 繼承已有的規(guī)則 */
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
plugins: ['vue', '@typescript-eslint'],
/*
* "off" 或 0 ==> 關(guān)閉規(guī)則
* "warn" 或 1 ==> 打開的規(guī)則作為警告(不影響代碼執(zhí)行)
* "error" 或 2 ==> 規(guī)則作為一個錯誤(代碼不能執(zhí)行,界面報錯)
*/
rules: {
// eslint(https://eslint.bootcss.com/docs/rules/)
'no-var': 'error', // 要求使用 let 或 const 而不是 var
'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允許多個空行
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-unexpected-multiline': 'error', // 禁止空余的多行
'no-useless-escape': 'off', // 禁止不必要的轉(zhuǎn)義字符
// typeScript (https://typescript-eslint.io/rules)
'@typescript-eslint/no-unused-vars': 'error', // 禁止定義未使用的變量
'@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore
'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 類型
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-namespace': 'off', // 禁止使用自定義 TypeScript 模塊和命名空間。
'@typescript-eslint/semi': 'off',
// eslint-plugin-vue (https://eslint.vuejs.org/rules/)
'vue/multi-word-component-names': 'off', // 要求組件名稱始終為 “-” 鏈接的單詞
'vue/script-setup-uses-vars': 'error', // 防止<script setup>使用的變量<template>被標(biāo)記為未使用
'vue/no-mutating-props': 'off', // 不允許組件 prop的改變
'vue/attribute-hyphenation': 'off', // 對模板中的自定義組件強(qiáng)制執(zhí)行屬性命名樣式
},
};
.eslintignore 文件是一個忽略文件,主要是為了忽略對于哪些文件不需要進(jìn)行代碼校驗(yàn)。比如node_modules文件、打包后的dist文件等;
# Eslint 會忽略的文件
.DS_Store
node_modules
dist
dist-ssr
*.local
.npmrc
3.prettier.config.js、prettierignore文件

有了eslint,為什么還要有prettier? eslint針對的是javascript,他是一個檢測工具,包含js語法以及少部分格式問題,在eslint看來,語法對了就能保證代碼正常運(yùn)行,格式問題屬于其次;
而prettier屬于格式化工具,它看不慣格式不統(tǒng)一,所以它就把eslint沒干好的事接著干,另外,prettier支持
包含js在內(nèi)的多種語言。
總結(jié)起來,eslint和prettier這倆兄弟一個保證js代碼質(zhì)量,一個保證代碼美觀。
prettier.config.js內(nèi)主要配置如下:
/** 配置項(xiàng)文檔:https://prettier.io/docs/en/configuration.html */
module.exports = {
/** 每一行的寬度 */
printWidth: 120,
/** Tab 鍵的空格數(shù) */
tabWidth: 2,
/** 在對象中的括號之間是否用空格來間隔 */
bracketSpacing: true,
/** 箭頭函數(shù)的參數(shù)無論有幾個,都要括號包裹 */
arrowParens: "always",
/** 換行符的使用 */
endOfLine: "auto",
/** 是否采用單引號 */
singleQuote: false,
/** 對象或者數(shù)組的最后一個元素后面不要加逗號 */
trailingComma: "none",
/** 是否加分號 */
semi: false,
/** 是否使用 Tab 格式化 */
useTabs: false
}
prettierignore和eslintignore 類似,忽略以下不需要格式化的文件
# Prettier 會忽略的文件
.DS_Store
node_modules
dist
dist-ssr
*.local
.npmrc
4.環(huán)境變量的配置

項(xiàng)目開發(fā)過程中,至少會經(jīng)歷開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境(即正式環(huán)境)三個階段。不同階段請求的狀態(tài)(如接口地址等)不盡相同,若手動切換接口地址是相當(dāng)繁瑣且易出錯的。于是環(huán)境變量配置的需求就應(yīng)運(yùn)而生,我們只需做簡單的配置,把環(huán)境狀態(tài)切換的工作交給代碼。
開發(fā)環(huán)境 (development)
顧名思義,開發(fā)使用的環(huán)境,每位開發(fā)人員在自己的dev分支上干活,開發(fā)到一定程度,同事會合并代碼,進(jìn)行聯(lián)調(diào)。
測試環(huán)境 (stagting)
測試同事干活的環(huán)境啦,一般會由測試同事自己來部署,然后在此環(huán)境進(jìn)行測試
生產(chǎn)環(huán)境(production)
生產(chǎn)環(huán)境是指正式提供對外服務(wù)的,一般會關(guān)掉錯誤報告,打開錯誤日志。(正式提供給客戶使用的環(huán)境。)
注意:一般情況下,一個環(huán)境對應(yīng)一臺服務(wù),也有的公司開發(fā)與測試環(huán)境是一臺服務(wù)!!!
.env.development配置如下
# 自定義的環(huán)境變量(命名必須以 VITE_ 開頭)
## 后端接口公共路徑(如果解決跨域問題采用反向代理就只需寫公共路徑)
VITE_BASE_API = '/api/v1'
## 路由模式 hash 或 html5
VITE_ROUTER_HISTORY = 'hash'
## 開發(fā)環(huán)境地址前綴(一般 '/','./' 都可以)
VITE_PUBLIC_PATH = '/'
.env.production
# 自定義的環(huán)境變量(命名必須以 VITE_ 開頭)
## 后端接口公共路徑(如果解決跨域問題采用 CORS 就需要寫全路徑)
# VITE_BASE_API = 'https://mock.mengxuegu.com/mock/63218b5fb4c53348ed2bc212/api/v1'
VITE_BASE_API = 'https://www.fastmock.site/mock/761e2dda2b8890ab86c928a74e8f6538/api/v1'
## 路由模式 hash 或 html5
VITE_ROUTER_HISTORY = 'hash'
## 打包路徑(就是網(wǎng)站前綴,例如部署到 https://un-pany.github.io/v3-admin-vite/ 域名下,就需要填寫 /v3-admin-vite/)
VITE_PUBLIC_PATH = '/v3-admin-vite/'
以獲取VITE_BASE_API 為例,我們在service.ts內(nèi)動態(tài)獲取baseURL

配置運(yùn)行命令package.json
"scripts":{
"dev": "vite --open",
"build:test":"vue-tsc && vite build --mode stagting",
"build:pro": "vue-tsc && vite build --mode production",
"preview":"vite preview""
}
通過import.meta.env獲取環(huán)境變量
運(yùn)行pnpm run dev 和 pnpm run build:pro
import.meta.env.VITE_BASE_API 分別為 '/api/v1' 和 'https://www.fastmock.site/mock/761e2dda2b8890ab86c928a74e8f6538/api/v1',以達(dá)到環(huán)境區(qū)分目的。
