現在網路資源豐富﹐許多學習資源大多在網路上可以獲得﹐不過很多東西需要自行拼湊。在我學習Vue 的過程中﹐如何讓 Asp.net core web api 和 Vue 能互相搭配且開發順暢﹐著實在網路上研究了許久﹐這類整合開發的文章比較少﹐希望我這篇筆記能對大家有所助益。
首先這篇文章的靈感來自於 Vue CLI 和 ASP.NET Core Web API 專案整合步驟 1 2 3 (poychang.net) 這篇文章﹐該篇內容描述前端使用Vue Cli 建置與 Visual Studio 2019 建立的 Asp.net Core Web Api 如何做整合﹐內容中對於 Visual studio Web Api 專案中如何設定及基本 Vue-Cli 專案的設定已很清楚﹐在按表操課後實際開發時又碰到不少問題﹐所以做下心得筆記給自己留下印記。
我個人在開發過程中遭遇的問題﹐其實大部分來自於對 Vue 的不夠熟悉﹐所以對於 Vue Cli 已經很熟的朋友可以直接跳過這篇文章。在這裏我將使用微軟官網EF Core MVC的範例程式(教學課程:在 ASP.NET MVC Web 應用程式中開始使用 EF Core | Microsoft Learn)﹐將原本的MVC 進行改寫﹐原本的架構是純MVC與DB
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691935922.png.png)
修改後會是將對資料庫的部分抽離另建一個Web Api 專案並且以 Repository patten 的方式建立﹐原本微軟的MVC 專案改為Web Api 專案並以 Vue-Cli 來建置前端。
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691935953.png.png)
所以今天所要討論的主軸就是以下這一部分
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691935985.png.png)
環境與軟體
在開始之前先將環境與相關軟體做個列表
開發環境:Windows 10/11
開發工具:Visual Studio 2022 & Visual Studio Code
相關軟體
nvm-windows:node.js 版本管理工具(建議﹐但非必要﹐請參考(在原生 Windows 上設定 NodeJS | Microsoft Learn)
node.js:開發 Vue.js 必要
專案建置
首先我建了一個方案 ContosoUniversity﹐當中方案資料夾Service下的部分是前面所提到把對 DB 的部分抽出並依 Repository patten 製作的﹐不過這不是這次討論的範圍﹐方案中有建置一個ContosoUniversityWebApiSPA 專案﹐這個專案才是根據Vue CLI 和 ASP.NET Core Web API 專案整合步驟 1 2 3 (poychang.net) 文章建置﹐其中的ClientApp 就是 Vue-Cli 專案所在﹐Vie專案編譯後的檔案會輸出至 wwwroot﹐專案建置過程不再重複敘述。
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936090.png.png)
這個專案還未全部完成﹐但一些基本功能已經有了﹐對於專案開發過程會碰到的問題也大致都有了﹐所以先紀錄過程中一些問題如何解決。
如何step by step Debug
我設定的場情是全端工程師﹐同時要處理前後端程式(老闆真的只會讓你處理前端或後端嗎?)。根據之前web api 專案中 launchSettings.json 的設定及Program.cs的調整﹐現在執行F5 所看到的並不是 swagger 而是直接開啟網站畫面。在開發過程中對於 web api專案個人習慣還是使用swagger 介面﹐要進行整體的測試則改由VS Code 進行﹐所以我還原了 launchSettings.json原本設定﹐而Program.cs 不變但需要加入 CORS 的設定
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936105.png.png)
http://localhost:8080 這是Vue專案使用 npm run serve 時用的port 。在Web API 專案端的開發是屬後端跟平常都一樣﹐所以其它沒有什麼特別需要設定﹐但有一點要注意﹐後端要吐給前端資料的規格要先確定好﹐由其是全後端是分開由不同人作業﹐這樣才能後續作業一致。
Vue 專案
安裝套件
現在場景轉到 Vue-cli 專案﹐資料夾中的ClientApp 就是Vue 專案所在﹐請使用VS Code 開啟。在這個專案中會用到一些套件 axios, bootstrap, fontawesome﹐先安裝好以下套件
npm install axios@1.4.0 --save
npm install bootstrap@5.3.0
npm install --save @popperjs/core
npm install --save-dev @fortawesome/fontawesome-free
設定 Debug launch.json
在Debug 時會啟用瀏覽器﹐點擊vs code 左側的 Run and Debug 圖示﹐如果這個專案中還沒有 launch.json 檔案﹐應該會看到以下畫面
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936167.png.png)
這表示還未設定 Debug 的環境﹐此時可以按下畫面上「Run and Debug」的按鍵﹐這時可以看到右側出現要我們選擇 debug用的瀏覽器
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936194.png.png)
假如要選擇一般人常用的 Chrome﹐那麼就點選Web App (Chrome)﹐之後vs code 會產生launch.json 檔案﹐內容會是如下
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936207.png.png)
如果像我個人喜歡用 Edge 的﹐可以在目前上方的Launch Ch..點擊一下﹐在下拉的清單中選擇 Add Configuration…
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936224.png.png)
在 launch.json 的畫面上會出現下拉清單畫面讓你挑選想要加入的項目
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936239.png.png)
這裏要加入的是 Edge 瀏覽器﹐所以選擇了Edge: Launch﹐選擇後launch.json自動幫我們加上了Edge必要的設定
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936259.png.png)
這時再回來看 Run and Debgu 上方的Launch Ch這個下拉選單﹐可以看到現在有 Launch Edge 和 Launch Chrome against localhost 兩項﹐如果想使用 Edge 進行Debug則是在這裏選擇 Launch Edge﹐然後點擊左側的綠色三角型(Start Debugging) 或者按下 F5 就會以Edge 開啟執行﹐如果要改用 Chrome﹐那麼改選擇Launch Chrome就可以了。
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936270.png.png)
Vue 的step by step
Debug時如果可以step by step 那是最好的﹐上述launch.json 已設定完成﹐現在試試找一支Vue的程式在程式中設個中斷點﹐然後在 vs code 的 Terminal執行npm run serve 後﹐現在可以按下 F5 進入debug模式﹐在瀏覽器執行到有設定中斷點的程式﹐這時發現中斷點沒有起任何作用。
停止Debug模式﹐並停止vue程式的執行﹐打開 vue.config.js 加入以下的設定
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936290.png.png)
存檔後﹐現在重新執行 npm run serve 後再進入 Debug模式﹐這次執行就能正常停止在中斷點的位置。
Web Api網址的設定
在這個專案中﹐Vue的程式執行 npm run build 編譯後是輸出到wwwroot﹐這是 vue.config.js 中的設定﹐也就是說vue編譯後的程式和web api 專案是同一個專案中﹐發佈時是一起的
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936309.png.png)
所以在Vue程式中呼叫到該專案中的web api 可以這麼寫 “api/Student/QueryData”
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936319.png.png)
但是這樣是由 Web api 專案執行時沒有問題﹐現在改由 npm run serve 啟動vue的開發伺服器﹐這時是執行http://localhost:8080 進入前端的debug﹐這和web api 的網站不同﹐所以在web api Program.cs中必須加入CORS的設定﹐那麼Vue這一端該如何做呢?將網址改為web api 的網址?雖然這樣可以執行﹐但如果要將Vue程式做build打包到wwwroot﹐必須先將網址改回來才行﹐萬一呼叫的API很多﹐那應該會改到厭世也可能改錯吧。
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936329.png.png)
Asp.net core web api 專案有appsettings.json 和 appsettings.Development.json 環境之分的設定檔﹐Vue也有類似的。
系統在開發﹑測試到上線﹐正常會有許多環境﹐不同的環境會需要不同的參數值﹐例如開發﹑測試的環境連線的資料庫一定和正式環境的資料庫不同﹐所以連線字串就不同﹐又或者開發﹑測試呼叫的API會和正式環境的API來源不同﹐所以URL的設定也不同。如果在各個環境切換時都要改一次參數資料﹐那麼這個功就很無聊﹐很沒效率﹐而且頻繁的修改可能還會改錯。
在 Vue 中如何做才能省事呢?這就使用 .evn.* 的檔案。例如 Vue 呼叫 Web API﹐開發環境和正式環境的 Web Api URL一定不同﹐我們不希望將網址寫死在代碼中﹐要不然每當要佈署時都要修改程式那可會是一個大工程﹐還可能會遺漏。這時可以建立環境變數﹐建立的方式是在根之下建立 .env 檔案
檔案名稱 | 說明 |
.env | #在所有環境中被載入 |
.env.自行定義名稱 | #定義中的環境載入 |
建立後還需要在 package.json 檔案中建立對應的模式
例如﹐現在有二個環境﹐開發環境﹐docker環境
檔案名稱 | 說明 | 內容 |
.env.local | #開發環境 | VUE_APP_API_LOCAL = "https://localhost:7144/api" VUE_APP_PAGE_SIZE = 3 |
.env.docker | #docker環境 | VUE_APP_API_LOCAL = "/api" VUE_APP_PAGE_SIZE = 5 |
從內容看﹐這二個檔案中的內容 VUE_APP_API_LOCAL 的變數值是不同的﹐環境變數名稱有個規則﹐變數名稱的開頭必須是VUE_APP_﹐這樣vue cli 才能抓到變數。
在Vue檔案中要使用環境變數的規則為 process.env.變數名稱
![](https://dotblogsfile.blob.core.windows.net/user/nethawk/9573ebb5-9390-455b-b775-f6446c5787eb/1691936776.png.png)
接著打開 package.json﹐檔案中可以找到以下的片段
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
現在加入以下設定
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"serve:local": "vue-cli-service serve --mode local",
"build:local": "vue-cli-service build --mode local",
"serve:docker": "vue-cli-service serve --mode docker",
"build:docker": "vue-cli-service build --mode docker",
"lint": "vue-cli-service lint"
},
之後如果要使用的話﹐原本要build打包時的指令 npm run build 可以改為如下
npm run build:local # build 開發環境
npm run build:docker # build docker 環境
若要進行debug﹐原本的 serve 指令 npm run serve 就改為以下指令
npm run serve:local # 執行開發環境
在完成上述的設定後﹐Asp.net core Web Api 專案按F5 進入debug 模式﹐Vue 專案下執行npm run serve:local ﹐在 vs code 按下F5 進入 Vue 的debug模式﹐現在在Vue程式中下中斷點可以在vue 程式 step by step 進行除錯﹐若Asp.net core web api 專案中也有下中斷點﹐同樣可以在 web api 專案中 step by step 進行除錯。
好了﹐其實不複雜﹐相關的設定都到位後﹐相信開發起來會更順手。