從 0 開始手把手帶你搭建一套規(guī)范的 Vue3.5 項(xiàng)目工程環(huán)境

技術(shù)棧

基礎(chǔ)搭建

請(qǐng)確保你的電腦上成功安裝 Node.js,本項(xiàng)目使用 Vite 構(gòu)建工具,需要 Node.js 版本 >= 12.0.0。

使用 Vite 快速初始化項(xiàng)目雛形

npm init @vitejs/app
yarn create @vitejs/app

然后按照終端提示完成以下操作:
1.輸入項(xiàng)目名稱
2.選擇Vue3生態(tài)


image.png

3.安裝依賴
4.啟動(dòng)項(xiàng)目


image.png

如上圖,表示 Vite + Vue3 + TypeScript + Router + Pinia 簡(jiǎn)單的項(xiàng)目骨架搭建完畢,下面我們來為這個(gè)項(xiàng)目集成 Element Plus、Axios、Stylus/Sass/Less。
修改 Vite 配置文件

Vite 配置文件 vite.config.ts 位于根目錄下,項(xiàng)目啟動(dòng)時(shí)會(huì)自動(dòng)讀取。
本項(xiàng)目先做一些簡(jiǎn)單配置,例如:設(shè)置 @ 指向 src 目錄、 服務(wù)啟動(dòng)端口、打包路徑、代理等。
關(guān)于 Vite 更多配置項(xiàng)及用法,請(qǐng)查看 Vite 官網(wǎng) vitejs.dev/config/

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// 如果編輯器提示 path 模塊找不到,則可以安裝一下 @types/node -> npm i @types/node -D
import { resolve } from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': resolve(__dirname, 'src') // 設(shè)置 `@` 指向 `src` 目錄
    }
  },
  base: './', // 設(shè)置打包路徑
  server: {
    port: 4000, // 設(shè)置服務(wù)啟動(dòng)端口號(hào)
    open: true, // 設(shè)置服務(wù)啟動(dòng)時(shí)是否自動(dòng)打開瀏覽器
    cors: true // 允許跨域

    // 設(shè)置代理,根據(jù)我們項(xiàng)目實(shí)際情況配置
    // proxy: {
    //   '/api': {
    //     target: 'http://xxx.xxx.xxx.xxx:8000',
    //     changeOrigin: true,
    //     secure: false,
    //     rewrite: (path) => path.replace('/api/', '/')
    //   }
    // }
  }
})
規(guī)范目錄結(jié)構(gòu)
├── publish/
└── src/
    ├── assets/                    // 靜態(tài)資源目錄
    ├── common/                    // 通用類庫(kù)目錄
    ├── components/                // 公共組件目錄
    ├── router/                    // 路由配置目錄
    ├── store/                     // 狀態(tài)管理目錄
    ├── style/                     // 通用 CSS 目錄
    ├── utils/                     // 工具函數(shù)目錄
    ├── views/                     // 頁面組件目錄
    ├── App.vue
    ├── main.ts
    ├── shims-vue.d.ts
├── tests/                         // 單元測(cè)試目錄
├── index.html
├── tsconfig.json                  // TypeScript 配置文件
├── vite.config.ts                 // Vite 配置文件
└── package.json
集成 UI 框架 Element Plus

1.安裝支持 Vue3 的 UI 框架 Element Plus

npm i element-plus

2.在 main.ts 文件中掛載 Element Plus

import { createApp } from 'vue'
import App from './App.vue'

import ElementPlus from 'element-plus'
import 'element-plus/lib/theme-chalk/index.css'

createApp(App).use(ElementPlus).mount('#app')
集成 HTTP 工具 Axios

安裝 Axios(Axios 跟 Vue 版本沒有直接關(guān)系,安裝最新即可)

集成 CSS 預(yù)編譯器 Stylus/Sass/Less

1.安裝

npm i stylus -D
# or
npm i sass -D
npm i less -D

2.使用

<style lang="less ">
  ...
</style>

至此,一個(gè)基于 TypeScript + Vite + Vue3 + Vue Router + Pinia + Element Plus + Axios + Stylus/Sass/Less 的前端項(xiàng)目開發(fā)環(huán)境搭建完畢

代碼規(guī)范

隨著前端應(yīng)用逐漸變得大型化和復(fù)雜化,在同一個(gè)項(xiàng)目中有多個(gè)人員參與時(shí),每個(gè)人的前端能力程度不等,他們往往會(huì)用不同的編碼風(fēng)格和習(xí)慣在項(xiàng)目中寫代碼,長(zhǎng)此下去,勢(shì)必會(huì)讓項(xiàng)目的健壯性越來越差。解決這些問題,理論上講,口頭約定和代碼審查都可以,但是這種方式無法實(shí)時(shí)反饋,而且溝通成本過高,不夠靈活,更關(guān)鍵的是無法把控。不以規(guī)矩,不能成方圓,我們不得不在項(xiàng)目使用一些工具來約束代碼規(guī)范。
本文講解如何使用 EditorConfig + Prettier + ESLint 組合來實(shí)現(xiàn)代碼規(guī)范化。

這樣做帶來好處:

  • 解決團(tuán)隊(duì)之間代碼不規(guī)范導(dǎo)致的可讀性差和可維護(hù)性差的問題。
  • 解決團(tuán)隊(duì)成員不同編輯器導(dǎo)致的編碼規(guī)范不統(tǒng)一問題。
  • 提前發(fā)現(xiàn)代碼風(fēng)格問題,給出對(duì)應(yīng)規(guī)范提示,及時(shí)修復(fù)。
  • 減少代碼審查過程中反反復(fù)復(fù)的修改過程,節(jié)約時(shí)間。
  • 自動(dòng)格式化,統(tǒng)一編碼風(fēng)格,從此和臟亂差的代碼說再見。
集成 Prettier 配置、 ESLint 配置

官網(wǎng):prettier.io/ESLint(具體配置查看官網(wǎng))

image.png
解決 Prettier 和 ESLint 的沖突

手動(dòng)集成,會(huì)出現(xiàn)兩者沖突問題,需要用到 eslint-plugin-prettier 和 eslint-config-prettier。

  • eslint-plugin-prettier 將 Prettier 的規(guī)則設(shè)置到 ESLint 的規(guī)則中。
  • eslint-config-prettier 關(guān)閉 ESLint 中與 Prettier 中會(huì)發(fā)生沖突的規(guī)則。
    最后形成優(yōu)先級(jí):Prettier 配置規(guī)則 > ESLint 配置規(guī)則。

安裝插件:

npm i eslint-plugin-prettier eslint-config-prettier -D

在 .eslintrc.js 添加 prettier 插件:

module.exports = {
  ...
  extends: [
    'plugin:vue/essential',
    'airbnb-base',
    'plugin:prettier/recommended' // 添加 prettier 插件
  ],
  ...
}
集成 husky 和 lint-staged

我們?cè)陧?xiàng)目中已集成 ESLint 和 Prettier,在編碼時(shí),這些工具可以對(duì)我們寫的代碼進(jìn)行實(shí)時(shí)校驗(yàn),在一定程度上能有效規(guī)范我們寫的代碼,但團(tuán)隊(duì)可能會(huì)有些人覺得這些條條框框的限制很麻煩,選擇視“提示”而不見,依舊按自己的一套風(fēng)格來寫代碼,或者干脆禁用掉這些工具,開發(fā)完成就直接把代碼提交到了倉(cāng)庫(kù),日積月累,ESLint 也就形同虛設(shè)。

所以,我們還需要做一些限制,讓沒通過 ESLint 檢測(cè)和修復(fù)的代碼禁止提交,從而保證倉(cāng)庫(kù)代碼都是符合規(guī)范的。

為了解決這個(gè)問題,我們需要用到 Git Hook,在本地執(zhí)行 git commit 的時(shí)候,就對(duì)所提交的代碼進(jìn)行 ESLint 檢測(cè)和修復(fù)(即執(zhí)行 eslint --fix),如果這些代碼沒通過 ESLint 規(guī)則校驗(yàn),則禁止提交。

實(shí)現(xiàn)這一功能,我們借助 [husky](https://link.juejin.cn?

husky —— Git Hook 工具,可以設(shè)置在 git 各個(gè)階段(pre-commitcommit-msgpre-push 等)觸發(fā)我們的命令。
lint-staged —— 在 git 暫存的文件上運(yùn)行 linters。

配置 husky

使用 husky-init 命令快速在項(xiàng)目初始化一個(gè) husky 配置。

npx husky-init && npm install

這行命令做了四件事:
1.安裝 husky 到開發(fā)依賴
2.在項(xiàng)目根目錄下創(chuàng)建 .husky 目錄
3.在 .husky 目錄創(chuàng)建 pre-commit hook,并初始化 pre-commit 命令為 npm test
4.修改 package.json 的 scripts,增加 "prepare": "husky install"

上面這個(gè) pre-commit hook 文件的作用是:當(dāng)我們執(zhí)行 git commit -m "xxx" 時(shí),會(huì)先對(duì) src 目錄下所有的 .vue、.js、.ts 文件執(zhí)行 eslint --fix 命令,如果 ESLint 通過,成功 commit,否則終止 commit。
但是又存在一個(gè)問題:有時(shí)候我們明明只改動(dòng)了一兩個(gè)文件,卻要對(duì)所有的文件執(zhí)行 eslint --fix。假如這是一個(gè)歷史項(xiàng)目,我們?cè)谥型九渲昧?ESLint 規(guī)則,那么在提交代碼時(shí),也會(huì)對(duì)其他未修改的“歷史”文件都進(jìn)行檢查,可能會(huì)造成大量文件出現(xiàn) ESLint 錯(cuò)誤,顯然不是我們想要的結(jié)果。
我們要做到只用 ESLint 修復(fù)自己此次寫的代碼,而不去影響其他的代碼。所以我們還需借助一個(gè)神奇的工具 lint-staged 。

配置 lint-staged

lint-staged 這個(gè)工具一般結(jié)合 husky 來使用,它可以讓 husky 的 hook 觸發(fā)的命令只作用于 git add那些文件(即 git 暫存區(qū)的文件),而不會(huì)影響到其他文件。

1.安裝 lint-staged

npm i lint-staged -D

2.在 package.json里增加 lint-staged 配置項(xiàng)


image.png
"lint-staged": {
  "*.{vue,js,ts}": "eslint --fix"
},

這行命令表示:只對(duì) git 暫存區(qū)的 .vue、.js、.ts 文件執(zhí)行 eslint --fix。
3.修改 .husky/pre-commit hook 的觸發(fā)命令為:npx lint-staged


image.png

現(xiàn)在我們提交代碼時(shí)就會(huì)變成這樣:
假如我們修改了 scr 目錄下的 test-1.js、test-2.ts 和 test-3.md 文件,然后 git add ./src/,最后 git commit -m "test...",這時(shí)候就會(huì)只對(duì) test-1.js、test-2.ts 這兩個(gè)文件執(zhí)行 eslint --fix。如果 ESLint 通過,成功提交,否則終止提交。從而保證了我們提交到 Git 倉(cāng)庫(kù)的代碼都是規(guī)范的。

無論寫代碼還是做其他事情,都應(yīng)該用長(zhǎng)遠(yuǎn)的眼光來看,剛開始使用 ESint 的時(shí)候可能會(huì)有很多問題,改起來也很費(fèi)時(shí)費(fèi)力,只要堅(jiān)持下去,代碼質(zhì)量和開發(fā)效率都會(huì)得到提升,前期的付出都是值得的。
這些工具并不是必須的,沒有它們你同樣可以可以完成功能開發(fā),但是利用好這些工具,你可以寫出更高質(zhì)量的代碼。特別是一些剛剛接觸的人,可能會(huì)覺得麻煩而放棄使用這些工具,失去了一次提升編程能力的好機(jī)會(huì)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,360評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,559評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,742評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評(píng)論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,981評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評(píng)論 1 280
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,354評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,707評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容