Full-Stack base note

前端開發 (Front-end Development)

  • 任務:使用 HTML、CSS 和 JavaScript 建立使用者介面 (UI),確保響應式設計和優質的使用者體驗 (UX)。
  • 職責
    • 響應式設計:確保網站在不同螢幕尺寸和裝置上都能正常顯示。
    • 可訪問性:讓身心障礙人士也能順利使用網站。
    • 客戶端安全:實施基本的客戶端安全措施以保護使用者資料。
    • 使用 Docker 將應用程式及其相依性打包到容器中,確保其應用程式在開發、測試和生產環境中的行為一致。

後端開發 (Back-end Development)

  • 任務:管理伺服器、資料庫以及處理資料的 API,確保後端能高效支援前端功能。
  • 職責
    • API 開發:建立和維護應用程式介面 (API),允許不同系統之間進行通訊。
    • 資料管理:高效且安全地儲存和檢索資料。
    • 系統可靠性:確保後端系統平穩運行,最小化停機時間並及時解決錯誤。

資料庫管理 (Database Management)

  • 設計和維護資料庫,以安全地儲存和檢索資料。

安全性 (Security)

  • 在應用程式各層實施加密和身份驗證等安全措施。

DevOps 與部署 (DevOps and Deployment)

  • 使用 CI/CD (持續整合/持續部署) 管道自動化和管理應用程式部署。
  • Continuous Integration (CI) 持續整合 : 會經常將程式碼變更合併到共用程式碼庫中,並自動進行測試。這有助於及早發現錯誤,提高程式碼穩定性,並避免團隊協作時出現整合衝突。
  • Continuous Deployment (CD) 持續部署 : 以 CI 為基礎,在程式碼通過所有測試後自動發佈到生產環境。這確保更新能夠快速送達用戶,無需手動審批步驟,從而支援更快的功能交付和更靈敏的錯誤修復。

測試與偵錯 (Testing and Debugging)

  • 持續測試並修復問題,以維持應用程式的高效能。

前端技術

  • HTML建構網頁內容的骨架。
  • CSS:定義網頁的版面、顏色和字型。
  • JavaScript:增加互動性,如表單驗證或動態內容更新。
  • 框架:通常使用如 ReactVue.js 等框架來簡化開發流程。

後端技術

  • 程式語言:C#、Python、Ruby 等。
  • 資料庫:SQL (如 SQL Server) 和 NoSQL (如 MongoDB) 等。

1.規劃與設計 (Planning and Design):收集需求並定義技術規格。

2.開發 (Development):建構前端使用者介面和後端邏輯。

3.整合 (Integration):將前端與後端 API 和服務連接。

4.測試 (Testing):透過全面測試驗證應用程式功能是否符合預期。

5.部署 (Deployment):啟動應用程式並持續監控其效能。

問題分解方法

  • 由上而下 (Top-down):從系統的總體概述開始,逐步將其分解為更小、更易於管理的部分。
  • 自下而上 (Bottom-up):從小的、獨立的功能模組開始建構,然後將它們整合成一個全面的解決方案。

模組化 (Modularization)

  • 將每個核心功能開發為獨立的模組,再整合到主應用程式中。這種方法使每個部分都專注於特定任務,從而簡化開發和偵錯。

常見設計模式

  • 工廠模式 (Factory Pattern):當需要根據不同條件建立不同類型的物件時使用,隱藏了物件建立的複雜細節。
  • 觀察者模式 (Observer Pattern):當一個物件的狀態改變時,需要自動通知其他多個物件。實現了一對多的依賴關係。
  • 裝飾器模式 (Decorator Pattern):在不改變物件原始碼的情況下,動態地增加新功能,提供彈性的功能擴展。
  • 單例模式 (Singleton Pattern):確保一個類別在整個應用程式中只有一個實例,例如資料庫連線或日誌記錄器,以節省資源並方便管理。

1.安裝 .NET SDK從 .NET 官方網站下載並安裝。

2.驗證安裝:在終端機執行 dotnet –version

3.安裝 VS Code 擴充功能

  • C# Dev Kit & C#:提供 C# 語言支援。
  • Microsoft Copilot:AI 輔助程式碼完成。
  • IntelliSense:提供程式碼上下文提示。

4.建立專案:在終端機中導航到目標目錄,執行 dotnet new <template-name>(例如 dotnet new consoledotnet new webapi)。

5.安裝 NuGet 套件:使用 dotnet add package <package-name> 指令,例如:

  • Newtonsoft.Json:處理 JSON 資料。
  • Dapper:輕量級資料庫 ORM。
  • Serilog:結構化日誌記錄。
  • Microsoft.EntityFrameworkCore.SqlServer:連線 SQL Server。
  • Microsoft.AspNetCore.SignalR:實現即時通訊。

6.建構與執行

  • dotnet build:編譯專案。

dotnet watch:監控檔案變更並自動重新啟動應用程式。

Program.cs:應用程式的入口點。

.csproj 檔案:包含專案設定、依賴項(NuGet 套件)和建置配置。

bin 資料夾:儲存已編譯的可執行檔和 DLL。

obj 資料夾:儲存建置過程中產生的中間暫存檔案。

專案建立

  • 建立後端 API:dotnet new webapi -o backend
  • 建立前端 UI:dotnet new blazorwasm -o frontend
  • 同時開啟兩個專案進行開發。

啟用跨域請求 (CORS)

  • 在後端 Program.cs 中,使用 builder.Services.AddCors(…) 註冊服務,並在 HTTP 請求管道中使用 app.UseCors(…) 啟用它。這是解決前後端不同來源通訊問題的關鍵。

API 呼叫與資料模型

  • 後端:使用 app.MapGet(“/api/endpoint”, …) 定義 API 端點。
  • 前端
    • 確保前端的資料模型 (C# public class) 與後端回傳的 JSON 結構完全一致。

在 Blazor 元件的 OnInitializedAsync 方法中,使用 HttpClient.GetFromJsonAsync<T>(…) 呼叫後端 API。

  • LocalStorage (長期記憶):資料會永久儲存在使用者的瀏覽器中,即使關閉瀏覽器也不會消失。適合儲存使用者偏好設定(如主題)。

  • SessionStorage (短期記憶):資料只在當前的瀏覽器分頁會話中有效,一旦分頁或瀏覽器關閉,資料就會被清除。適合儲存臨時資料(如購物車)。

實作範例
安裝dotnet add package Blazored.LocalStorage
安裝dotnet add package Blazored.SessionStorage

註冊服務 (在 Program.cs 中):builder.Services.AddBlazoredLocalStorage();
builder.Services.AddBlazoredSessionStorage();

C# 元件中使用 (StorageDemo.razor)
@page “/storage-demo”
@inject ILocalStorageService LocalStorage  // 長期記憶
@inject ISessionStorageService SessionStorage // 短期記憶 

<h3>本機儲存與會話儲存示範</h3>
<h4>長期記憶 (主題偏好)</h4>
<p>主題偏好: <strong>@themePreference</strong></p>
<button @onclick=”SetTheme”>切換主題到 ‘Dark'</button>

<hr>
<h4>短期記憶 (購物車數量)</h4>
<p>當前購物車商品數: <strong>@cartCount</strong></p>
<button @onclick=”AddItem”>增加商品 (+1)</button>
<button @onclick=”ClearCart”>清空購物車 (短期記憶)</button>

@code {
   private string themePreference = “Loading…”;
    private int cartCount = 0;

   // 定義儲存的鍵名
   private const string ThemeKey = “userTheme”;
    private const string CartKey = “tempCartCount”;

    // 1. 元件初始化時,讀取兩種記憶
   protected override async Task OnInitializedAsync()
   {
    // 讀取長期記憶:從 LocalStorage 讀取主題偏好 (string)
    // 如果找不到,使用預設值 “Light”
        themePreference = await LocalStorage.GetItemAsStringAsync(ThemeKey) ?? “Light”;

    // 讀取短期記憶:從 SessionStorage 讀取購物車數量 (int)
    // GetItemAsync<T> 會自動處理反序列化 (JSON -> C#)
        cartCount = await SessionStorage.GetItemAsync<int?>(CartKey) ?? 0;
   }

 // 2. 寫入長期記憶 (主題偏好)
   private async Task SetTheme()
   {
       themePreference = “Dark”;
    // 程式碼功能:將 ‘Dark’ 這個值永久儲存到用戶的瀏覽器中。
    // (即使關閉並重開瀏覽器,資料依然存在)
        await LocalStorage.SetItemAsStringAsync(ThemeKey, themePreference);
    }

   // 3. 寫入與更新短期記憶 (購物車)
   private async Task AddItem()
   {
       cartCount++;
    // 程式碼功能:將新的購物車數量儲存到 SessionStorage 中。
    // (一旦用戶關閉瀏覽器視窗或分頁,資料就會被自動清除)
        await SessionStorage.SetItemAsync(CartKey, cartCount);
    }

   private async Task ClearCart()
   {
       cartCount = 0;
       // 程式碼功能:移除購物車的短期記憶。
        await SessionStorage.RemoveItemAsync(CartKey);
   }
}
dotnet watch 來預覽

快取 API 回應 (Caching):將不常變動但頻繁存取的資料(如產品類別)暫存在記憶體或瀏覽器儲存中,避免重複的伺服器請求。

資料分頁 (Pagination):將大型資料集分解為小區塊進行傳輸,使用資料網格或無限滾動來動態載入,提高應用程式的回應速度。

速率限制 (Rate Limiting):控制指定時間內客戶端可以發送的請求數量,防止伺服器過載。

身份驗證令牌 (Authentication Tokens):使用 JWT 或 OAuth 等基於令牌的身份驗證系統來保護 API 存取。

授權與最小特權原則 (PoLP):僅授予使用者完成其任務所需的最低權限。

API 版本控制 (API Versioning):在 API 端點中包含版本識別碼(例如 /api/v1/),以便在不破壞舊客戶端的情況下進行升級。

使用 async/await在 Blazor 中,所有 API 呼叫都應使用 asyncawait,以防止 UI 執行緒被阻塞,確保介面流暢。

非同步請求取消 (CancellationTokenSource):

目的:當使用者快速連續觸發請求(例如在搜尋框中打字)時,取消先前的、已過時的請求,只處理最新的請求。這可以防止競態條件(舊資料覆蓋新資料)並節省網路資源。

實作流程

1.取消先前請求:在發出新請求前,呼叫 cts?.Cancel()

2.建立新訊號源cts = new CancellationTokenSource()

3.傳遞 Token:將 cts.Token 傳遞給非同步方法,如 Http.GetFromJsonAsync(…)

4.處理取消例外:使用 try-catch 區塊捕捉 OperationCanceledException

使用者輸入 “A” → 建立 cts1​ → 發出請求 1(帶 cts1​)。
使用者輸入 “AP” → 呼叫 cts1​.Cancel()(請求 1 停止) → 建立 cts2​ → 發出請求 2(帶 cts2​)。

SignalR 即時推送

  • 方法: 使用 FeedHub按讚評論 的事件主動 (Clients.All.SendAsync) 推送給所有客戶端。
  • 優化效果: 實現真正的即時通知,避免客戶端不斷輪詢伺服器,減輕伺服器負載。

分組與最小化更新

  • 方法: 伺服器端不推送完整的貼文對象,而只推送 postIdnewLikes 這兩個變動的最小數據
  • 優化效果: 減少了網路傳輸量。客戶端只需更新 DOM 樹上一個數字,而不是重新渲染整個複雜的貼文列表。

延遲加載 (Lazy Loading)

  • 方法: 每次只呼叫 API 載入 PageSize 數量的貼文,並使用 LoadMorePosts 函數來控制分批載入。

優化效果: 顯著減少了初始加載時間,提高了應用程式的可擴展性,使用者體驗更流暢。

連線失敗:通常由錯誤的伺服器 URL 或網路問題引起。

資料格式不符:前後端的 JSON 結構不一致,導致反序列化失敗(檢查 public class)。

CORS 錯誤:後端未正確配置 CORS 策略,導致瀏覽器基於安全原因封鎖跨域請求。

效能瓶頸:大量資料傳輸或低效率的查詢導致應用程式緩慢。

SSL 憑證錯誤 (ERR_SSL_PROTOCOL_ERROR)

  • 原因: Blazor WASM 在開發環境中,瀏覽器不信任後端 API 的自簽署 HTTPS 憑證。

解決方案: 在命令列執行 dotnet dev-certs https –trust 來信任憑證。如果仍失敗,請將前端呼叫後端的協定從 https 暫時改為 http,繞過瀏覽器的嚴格憑證檢查。

流程圖是規劃和理解複雜邏輯的強大工具,尤其適用於設計如登入、註冊等流程。

  • 標準符號
    1. 橢圓:標記流程的起點和終點。
    2. 矩形:表示一個流程或操作(例如「輸入憑證」)。
    3. 菱形:代表一個決策點(是/否 或 真/假)。
    4. 箭頭:指示流程的方向和順序。
  • 建立步驟
    1. 定義流程:明確起點、終點和關鍵步驟。
    2. 確定關鍵步驟:將流程分解為單獨的步驟和決策點。
    3. 繪製流程圖:使用標準符號繪製。

驗證流程圖:檢查是否有缺失、順序錯誤或不明確的決策點。

全端開發人員的任務:

Front-end development:  前端開發:

  • 使用 HTML、CSS 和 JavaScript 建立使用者介面。
  • 確保響應式設計和使用者友好的體驗。

Back-end development:  後端開發:

  • 管理資料庫、伺服器和資料處理的 API。
  • 確保後端有效地支援前端功能。

Database management:  資料庫管理:

  • 設計和維護資料庫以安全地儲存和檢索資料。

Security:  安全:

  • 實施加密和身份驗證等安全措施。

DevOps and deployment:  DevOps 與部署:

  • 使用 CI/CD 管道自動化和管理應用程式部署。

Testing and debugging:  測試和調試:

  • 不斷測試並修復問題以保持高效能。

發佈留言