2026/04/18

【Delphi 現代化轉型】Day 2:內戰 — Boss 移殖引爆的防毒軟體的免疫攻擊

作者:吳祐賓





Boss 要怎麼裝進 Delphi 環境?

 

在 Delphi 專案中,每次要加入第三方元件,最花時間的不是寫程式,而是反覆手動調整 Search Path 和 Library Path。有了 Boss 之後,這件事從可能花上幾小時,縮短到 30 秒就能完成。

 

Boss for Delphi
Boss for Delphi and Lazarus from HashLoad github


進入 HashLoad Boss 首頁,由 readme.md 得知有兩種 Boss 安裝方法,原文是這樣的:

 

📦 Installation

  • Download setup
  • Just type boss in the terminal
  • (Optional) Install a Boss Delphi IDE complement

Or you can use the following the steps below:

  1. Download the latest version of the Boss
  2. Extract the files to a folder
  3. Add the folder to the system path
  4. Run the command boss in the terminal

 

看不懂沒關係,我講給你聽。

 

原則上 Boss 和 Delphi / Lazarus 各自獨立的系統,互不規範與限制,Boss 除了安裝 Github 3rd 元件外,會順帶把 3rd 元件路徑自動加入到該專案檔(.dproj)裡,開發者就不用再人工去設定 Search PathLibrary Path

 

知道這個前提後,可以知道:

 

  1. Boss 可獨立作業
  2. Boss 要能夠在 "命令提示字元 (CMD) " 下工作 

 

Boss 為什麼必須安裝在 RAD Studio 的 bin 目錄裡

 

進入 "https://github.com/hashload/boss/releases" 下載 Boss 程式並解壓縮。

 


 

 

Boss 只是普通 EXE 執行檔,不需要也沒有額外的安裝程式。

要能夠隨開命令提示字元就能夠操作 Boss,只能夠手工處理,通常你會先建立新資料夾,把 Boss 放到此資料夾,最後再設定系統環境路徑 (Path 系統變數) ...

 

非常囉嗦! 

 

如果你具備系統管理員身份,你就按以下步驟做就好了! 如果你連系統管理員身份都沒有...你還是看前面非常囉嗦的流程吧。

 

RAD Studio 安裝目錄下的 bin 資料夾,在安裝之初就有被加入到 Windows Path 變數中,所以上述只需一句話就安裝好 Boss 了:

 

把下載來的 boss.exe 放到 RAD Studio 的 bin 目錄裡。

註1:有多個 Delphi 時,任一 bin 目錄都可以,效果相同)

 

為了讓 Boss 使用起來最方便,我自己是把 boss.exe 複製到 RAD Studio 的 bin 目錄,這樣每次開 CMD 就能直接執行,不用額外設定環境變數。  

 

另外 Optional: Boss Delphi IDE complement,雖然能綁定到 Delphi IDE,但已被 npm 訓練習慣的我已經不會偏好此味,有興趣的同好可以自行研究。 

 

 

首次執行 Boss

 

首次執行 Boss,不帶任何參數,Boss 會自動安裝它所需要的環境,之後你可以使用 Boss --help 呼叫手冊閱讀。

 


 

 help 指令很重要,可以看 Boss 有哪些指令與指令說明:

 

boss --help
boss <command> --help 

 

Boss 有更高的機率是被防毒軟體擋下

 

事情總是不會如我們的預期,每每在開始 Boss 時,第一個出來 Say Hello 的永遠是防毒軟體!

 

 


 

Delphi 的二進位檔(尤其是開源工具)常被防毒軟體(如 Windows Defender 或防毒軟體)誤判,沒想到連 Go 語言寫的 Boss 程式也會被誤判。記得要允許 Boss 執行。

 

 

建置環境時間將從數小時變成 30 秒

 

測試時可先建立新專案,本篇建立了 New VCL Console Application,放置在 D:\D\vclDemos\horseDemos 路徑。 

 


 

在專案目錄執行 boss init ,奇妙的事發生了。boss 會啟用精靈介面,引導你設定此專案專案需要吃哪些外部套件,初期只要逐步 Enter 使用預設值即可。

 

完成後該目錄下就會建立 boss.json,這就是 boss 的初始化程序。

 

以前你手動在 IDE 處理的 Search Path 和 Library Path 可能要花上幾小時, 在完成 Boss 初始化後,只需要 30 秒就可以完成了!

 

省下這個時間,代表著新專案能更快上工、團隊成員交接更快,更減少了因路徑設定錯誤造成的延誤。

 

透過 Boss,把原本繁瑣的重複工作自動化,讓開發者把時間花在真正重要的程式邏輯上。這也是本系列想打造更現代化 Delphi 開發流程最重要的一小步。

 

 

下一篇,我們來看這套工具如何把空無一物的專案資料夾,瞬間變成具備生產力的專案內容。 

2026/04/17

【Delphi 現代化轉型】Day 1:決戰版控夢魘—用 Boss 解決 3rd 元件的版控地獄

作者:吳祐賓

 


 

 

昨天又被 3rd Party 元件版本問題搞得有點煩。

以前大家習慣全域裝一套元件,所有專案共用,結果不同專案要不同版本時就亂成一團。

如果你曾經歷過以下事情:

 

  • Delphi 7 升級到 XE 以上
  • DevExpress VCL 或 Github 開放專案 (如 mORMot, Spring4D等) 元件底層大改版

 

那你一定會感受到來自工程師的怨念。絕對!


Delphi Boss 套件庫工具 -- 將 npm 概念加入 Delphi


Boss Logo -- from Github


Boss 這工具就是專門來處理這件事的。它讓每個專案都能有自己獨立的元件版本,概念很像 Node.js 的 node_modules。

 

例如:A 專案和 B 專案同時用到 C 的 3rd 元件,但 C 的 2.0 和 3.0 的函式名稱大改變,以前沒有 Boss 時,通常我們只會選擇其一,然後就用到逼不得已再升級(降級)。

 

現在使用 Boss,你就可以在專案中安裝 3rd 元件的指定版本,每個專案都各自安放獨立的 3rd 資料夾。

 

  • 好處:可維護性提高,不需要每次開專案都擔心缺失元件的問題
  • 代價:元件原始碼會因每個專案都有一份,重複檔案會造成硬碟空間佔用

 

除非你是程式碼潔癖癌末患者,我認為現在硬碟動不動就幾個 TB 的時代,用空間換版本更替掃雷時間,這投報率太高,你不用看看嗎?

 

 

2026/03/19

倉頡五代升級攻略:Win 10/11 使用者的完美解決方案 (2026 加入一鍵更換、含倉頡三代升級)

作者:吳祐賓

 

 

你使用倉頡打字的時候,有沒有感受到奇怪的味道:

* 晚上的「晚」永遠都排在第二個字

* 「卜竹竹手一」打不出「産」?而「木中中女」打不出「樓」?

 

這代表你也是微軟倉頡四代的受災戶

 

在學習倉頡五代後,一直覺得微軟倉頡和新倉頡的倉頡四代碼表很不友善,一直到最近看到倉頡之友的【替換微軟倉頡碼表,盡享倉頡補完計劃的樂趣】,才知道原來微軟倉頡也可以更新碼表,終於能享受到輸入文字的樂趣了!

 

首先,本篇文章適用範圍:Windows 10 2004 版以上。記得,Windows 更新有時會覆蓋原來倉頡四代的碼表,記得要再回來更新 (2026/03/18 文末追加:一鍵更換 DLC)

 

 

倉頡碼表下載點

 

下載:MSCJData_Cangjie 開頭字樣檔案

例如:

 

 

給倉頡三代的使用者 (習慣打法為:「木中田女」=樓;「戈土心」=應) 

 

倉頡三代補完計劃替換碼表下載地址:https://github.com/Arthurmcarthur/Cangjie3-Plus/releases

 

 

GitHub 上 Cangjie3 倉頡三代碼表 20230909 版本的釋出與下載頁面截圖

 

 

給倉頡五代的使用者 (習慣打法為:「木中中女」=樓;「戈人土心」=應)

 

倉頡五代補完計劃替換碼表下載地址:https://github.com/Jackchows/Cangjie5/releases

 


GitHub Jackchows/Cangjie5 專案 Releases 頁面,顯示 v4.1-beta 最新版本與更新內容

 

安裝步驟

 

  1. 任務管理器裏結束兩個Microsoft IME進程。
  2. 進入 C:\Windows\System32\zh-hk 目錄,刪除
    • ChtCangjie.sdc
    • ChtCangjie.spd
    • ChtCangjieExt.lex
    三個文件(刪除前請備份),然後將此處提供的 ChtCangjieExt.lex,複製到該目錄。




  3. 打開「包含香港增補字符集字元(HKSCS)」開關。

 

 

完成上述步驟後請重新開機,接下來就可以好好體驗倉頡五代所帶來的暢快輸入感!

 

相信更多愛用倉頡的愛好者不滿足於預設的內容。不過因為我個人沒用到進階設定,想要了解更多細節的倉頡愛好者,歡迎再閱讀補完計畫說明檔。


總結

 

使用倉頡補完計畫優點

 

  • 字碼編排最貼近符合倉頡歷代改版標準。
  • 可以使用倉頡五代輸入方式。 
  • 重難(ZX)符號輸入完整呈現。
  • 還有微軟倉頡獨門快速鍵 100% 保留,例如:
    Ctrl+, ,
    Ctrl+' 、
    Ctrl+. 。
    Ctrl+; ;
    Ctrl+Shift+; :

    `+ +
    `- -
    `/ /
    `/ 向下鍵 ÷
    `* 向下鍵 ×
    `+ 向下鍵 ±

    Ctrl+[ 【 向下鍵 「...
    Ctrl+] 】 向下鍵 」...

    Ctrl+Alt+, 叫出特殊符號表 (輸入法整合器) 

 

使用倉頡補完計畫缺點


  • Z開頭的符號碼無法使用,只能使用微軟輸入法的符號快速輸入鍵輸入。 (20220904 MSCJData 版本已解決此問題)
  • 由於微軟倉頡的排序邏輯寫死在程序中,與碼表沒有關聯。補完計畫在調整此問題已將部首、筆畫、兼容區字符移除,RIME 則無此問題

 

整體來說優點大於缺點,能暢快享受輸入文字的樂趣,在這邊分享給大家。

 

2026/03/03 附記:

為什麼我執意要使用微軟輸入法引擎?

1. PIME 容易當機 (Python 不知道為什麼就閃退) 

2. 小小輸入法在 WinUI (Win App 2.0) 是不能用的,它只能在傳統應用程式下使用

3. 其它的自由倉頡、RIME 等輸入法引擎,操作習慣都要重新熟悉,新設備也需要另外安裝。但熟悉微軟輸入法引擎下,新環境我只需要忍耐字碼位置就好,比較不會換了新設備就變智缺化 (笑)

 

 

【2026/03/19 重大更新】一鍵修復 Windows 內建倉頡(三代/五代)選字排序、補完缺字!

 


 

 

上述人工步驟在每次被 Window Update 陰了後,就很懶得重複做,於是我讓 AI 寫了批次檔來做自動更新,原始碼已在 Github 開源供各位取用

 

Github 專案網址:https://github.com/Eden5Wu/Windows-Cangjie-Updater 


三大特色

  • 自動升權:因為會修改註冊檔,所以會要求使用者提供系統管理員權限 
  • 互動式選單:官方有四款需求導向目錄,為此寫了選單,預設為「台灣優先」
  • 自動備份 :腳本會自動備份舊碼表,改壞了就換回來即可


原本是寫 bat 批次檔,但倉三和倉五來源目錄皆以中文命名,剛好又是 bat 的罩門,為避免另外說明造成你我困擾,我決定改為 PowerShell (ps1) 來處理


視 bat 為本命的愛好者,也可以在上述 Github 中下載 bat 來使用,程式碼固定為「台灣優先」,有需要再自行修改

 

 

實現一鍵安裝的倉頡更新,感覺真是太好啦!

若是哪天又被天殺的微軟「更新」蓋掉,只要再對  .ps1 檔案按右鍵 ->「用 PowerShell 執行」來安裝,3 秒鐘就修復完成!

 

真是爽快!

 

常見問題

💡 Q:執行時一閃而過,或是出現「禁止執行指令碼」的紅字報錯?

A: 這是因為 Windows 預設基於安全考量鎖定了 PowerShell 腳本執行。請照以下步驟解鎖:

  1. 按下 Win + X 鍵,選擇 「終端機 (系統管理員)」。(就是Windows PowerShell)

  2. 貼上指令:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 並按 Enter。

  3. 輸入 Y 並按確認。

完成後再次對著腳本按「右鍵 -> 使用 PowerShell 執行」即可正常運作

 


 

2026/03/04

2026 年,使用 Intel 迷你 PC 打造 AI 伴侶,使用 SillyTavern + ollama-ipex-llm

 作者:吳祐賓

 

SillyTavern 預載的 Seraphina 角色卡
可供初次載入的聊天對象

 

 

 

2025 年,我寫了篇【告別 AI 訂閱費?我的 Intel 迷你電腦 AI 本機實戰(LM Studio / Ollama / IPEX-LLM)】,在 2026 年來看,實在是太困難了,後來重建的時候發現它變簡單了。

 

一、環境準備

先在 D 槽或不需系統管理員權限的位置,建立一個資料夾, 例如:IPEX_LLAMA

 

二、安裝 SillyTavern

首先要安裝 node.js,安裝 LTS 版本即可

SillyTavern Github

看是要直接從網站打包 zip 下載,還是使用以下指令安裝 SillyTavern 都可以。

git clone https://github.com/SillyTavern/SillyTavern -b release 

 

執行【Start.bat】啟動 SillyTavern。啟動後,瀏覽器會自動開啟 http://127.0.0.1:8000


三、安裝 Ollama-IPEX-LLM

Intel 使用 IPEX-LLM 讓 Arc / Iris XE 顯示晶片能夠儲存並運算 GGUF 模型

附帶一提,

IPEX-LLM專案已於2026年1月28日被Intel官方archive(設為唯讀) 

目前 Ollama-IPEX-LLM 不僅堪用且好用,待日後若使用其它替代方案,會再另寫新文章

 

Ollama-IPEX-LLM Github 

步驟 1: 下載免安裝連結

https://github.com/ipex-llm/ipex-llm/releases/tag/v2.3.0-nightly

下載後解壓縮到一個資料夾中 

步驟 2:  啟動 Ollama Serve

打開命令提示字元(cmd),並輸入指令 cd /d PATH\TO\EXTRACTED\FOLDER 進入解壓縮後的資料夾
在視窗中執行 start-ollama.bat 即可啟動 Ollama Serve

 

四、安裝模型

回到原來命令列,使用以下方式設置模型:

ollama run openhermes:7b-mistral-v2.5-q4_K_M

 

* 只要支援中文的模型,內容都會被和諧,講不出垃圾話,還是原生的英文最沒有拒絕回答的傾向,雖然新版模型文字上很優雅,但 OpenHermes 還是最合我的味道

題外話, NVIDIA RTX 2060 6G 下

經測試,q4_K_M 約 4.13 G,適合 6G 顯卡使用

q5_K_M 約 5.1 G,6G 會稍微吃緊

效能比 3050 8G 要好,當然 8 G 的話能吃的上下文就更多了 

 

五、 完成連接

 


 

 

  1. 回到 SillyTavern 瀏覽器頁面。
  2. 點擊上方插頭圖示 (API Connections)。
  3. API 類型選擇 Ollama。
  4. API URL 確認為 http://127.0.0.1:11434。
  5. 點擊 Connect,燈號變綠即大功告成!


AI 伴侶角色卡與設定內容未完待續...

 

 

 

 

2025/12/17

Horse: DataSnap 平替方案

 作者:吳祐賓

 

 

Horse: DataSnap 平替方案

 

評估:

1. 開放原始碼,不會來陰招,在套件裡安插後門來監視你

2. MIT 授權,避免無謂的糾紛 

 

Horse 借鏡 Express.js 設計概念所開發出的 WebAPI 框架

它基於 Boss 之上

Boss 是受 npm 啟發的 Delphi 套件管理工具,用來輕鬆安裝 Horse 等開源套件,可視為 GetIt 的平替

缺點就是 Boss 這名字很大眾,很難找到相關資料

 

Boss 安裝

Boss 安裝檔

https://github.com/hashload/boss/releases 

操作環境,應是泛 Win32 平台都可使用,目前在 Windows Server 2012 下仍能執行 (v3)

Boss Github

https://github.com/HashLoad/boss

 

Horse 安裝 

https://github.com/HashLoad/horse

boss install horse

 

如果不想用 Boss,怎麼安裝 Horse?

官方推薦用 Boss,因為最方便,但有簡單的手動方式:

  1. 去 Horse 的 GitHub 頁面:https://github.com/HashLoad/horse
  2. 點擊綠色的 Code 按鈕 → Download ZIP,下載整個專案壓縮檔。
  3. 解壓縮後,找到裡面的 src 資料夾(這就是 Horse 的核心原始碼)。
  4. 在你的 Delphi 專案中:
    • 把 src 資料夾複製到你的專案目錄下(或任何你喜歡的位置)。
    • 在 Delphi IDE 裡:Project → Options → Delphi Options → Library → Library path,加入這個 src 資料夾的完整路徑。
  5. 之後在你的 .dpr 或 unit 裡直接 uses Horse; 就能用了。

(官方文件也提到過類似方式:「Download the latest version of Horse and include the src/ folder in your project's Library Path.」)

 

Horse 專案超簡單就能用 Delphi IDE 的 F9 直接執行和 debug!因為它本質上是個 Console Application(控制台程式),啟動後會開一個 HTTP server,一直運行聽取請求(不會自動結束)。

步驟-by-步驟教學(從零開始):

  1. 在 Delphi IDE 建立新專案

    • File → New → Other → Console Application(選擇 Delphi 的 Console Application)。
    • 存檔到你喜歡的資料夾,例如 Project1.dpr。
  2. 加入 Horse 的 src 路徑(如果你是手動安裝):

    • Project → Options → Delphi Options → Library → Library path。
    • 加入你下載的 Horse src 資料夾完整路徑(例如 C:\Horse\src)。
    • OK 存檔。
  3. 寫程式碼(取代預設的 .dpr 內容): 把下面這段最簡單的範例貼到你的 .dpr 檔案(整個取代原本的 begin..end):

    pascal
    uses
      Horse;  // 這行很重要

    begin
      // 註冊一個路由:GET /ping 回傳 pong
      THorse.Get('/ping',
        procedure(Req: THorseRequest; Res: THorseResponse)
        begin
          Res.Send('pong');
        end);

      // 啟動 server,監聽 9000 port
      THorse.Listen(9000);

      // 這行會讓程式保持運行(可選,但建議加)
      Writeln('Server is running on http://localhost:9000');
      Writeln('Press ENTER to stop...');
      Readln;
    end.

 

執行(F9)

  • 直接按 F9(或 Run → Run)。
  • 程式會編譯,然後在 IDE 的輸出視窗顯示:

Server is running on http://localhost:9000
Press ENTER to stop... 

 

Debug(除錯)怎麼做?

完全跟一般 Delphi 程式一樣,超方便:

  • 在程式碼上設斷點(點左邊灰色區域,紅點出現)。
    • 例如在 Res.Send('pong'); 這行設斷點。
  • F9 啟動。
  • 用瀏覽器發請求到 /ping。
  • 當請求進來觸發那段程式碼時,IDE 會自動停在斷點!
  • 你可以用 F8(step over)、F7(step into)、觀察變數(Watch)、Req.Query、Req.Body 等。
  • 因為是多執行緒(Horse 用 Indy 或其他處理請求),但 Delphi IDE 對多執行緒 debug 支援很好,斷點一樣會命中。

小Tips:

  • 如果你用 Boss 安裝,會自動把 src 加到專案,步驟更少。
  • 想加 JSON、CORS 等功能?之後用 Boss 安裝 middleware(如 boss install horse-jhonson)。
  • 正式部署時,可以編譯成 Windows Service 或 Linux daemon,但開發時 Console 就夠了。

 

Horse 專案**完全可以編譯成 Windows Service** 來正式部署!這樣就能在背景自動運行、不依賴使用者登入、開機自啟動,非常適合生產環境的 Web API 服務。

### 步驟-by-步驟教學:

1. **建立 Service 專案**:
   - 在 Delphi IDE:File → New → Other → Delphi Projects → Service Application。
   - 這會產生一個新的專案,包含一個 TService 類別(例如 MyService: TService)。
   - 存檔專案(例如 HorseService.dproj)。

2. **加入 Horse 原始碼**:
   - 同樣手動或用 Boss 安裝 Horse 的 src 資料夾。
   - Project → Options → Library path → 加入 Horse src 路徑。

3. **寫程式碼**(在 Service 的 unit 中):
   - 在你的 Service unit(例如 Unit1.pas)加入 `uses Horse;`。
   - 把原本 Console 的程式碼移到 Service 的事件裡:
     ```pascal
     unit Unit1;

     interface

     uses
       Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
       Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, Horse;

     type
       TMyHorseService = class(TService)
         procedure ServiceCreate(Sender: TObject);
         procedure ServiceStart(Sender: TService; var Started: Boolean);
         procedure ServiceStop(Sender: TService; var Stopped: Boolean);
         procedure ServiceDestroy(Sender: TObject);
       private
         { Private declarations }
       public
         function GetServiceController: TServiceController; override;
         { Public declarations }
       end;

     var
       MyHorseService: TMyHorseService;

     implementation

     {$R *.dfm}

     procedure ServiceController(CtrlCode: DWord); stdcall;
     begin
       MyHorseService.Controller(CtrlCode);
     end;

     function TMyHorseService.GetServiceController: TServiceController;
     begin
       Result := ServiceController;
     end;

     procedure TMyHorseService.ServiceCreate(Sender: TObject);
     begin
       // 可在這裡初始化一些東西
     end;

     procedure TMyHorseService.ServiceStart(Sender: TService; var Started: Boolean);
     begin
       // 註冊路由
       THorse.Get('/ping',
         procedure(Req: THorseRequest; Res: THorseResponse)
         begin
           Res.Send('pong');
         end);

       // 啟動 Horse server(非阻塞)
       THorse.Listen(9000);  // 或你想要的 port

       Started := True;  // 告訴 Windows 服務已啟動
     end;

     procedure TMyHorseService.ServiceStop(Sender: TService; var Stopped: Boolean);
     begin
       // 停止 Horse server(Horse 較新版本有 Stop 方法,若沒有可忽略或用其他方式)
       // THorse.Stop;  // 如果你的 Horse 版本支援
       Stopped := True;
     end;

     procedure TMyHorseService.ServiceDestroy(Sender: TObject);
     begin
       // 清理資源
     end;

     end.
     ```

4. **編譯與安裝 Service**:
   - 編譯專案(Ctrl+F9),產生 .exe 檔(例如 HorseService.exe)。
   - 以**管理員權限**開啟命令提示字元,執行:
     ```
     HorseService.exe /install
     ```
     - 這會自動註冊到 Windows Services(用 sc.exe 或內建方式)。
   - 去「服務」管理員(services.msc),找到你的服務(名稱預設是專案名,可在 TService 的 Name/Description 屬性改)。
   - 設定啟動類型為「自動」,然後啟動服務。

5. **卸載 Service**(如果需要):
   ```
   HorseService.exe /uninstall
   ```

### 注意事項:
- **不要用 Writeln 或 Readln**:Service 沒有 console,這些會出錯(有些人遇過 I/O error 105,就是因為這個)。改用 TService.LogMessage('Server running...') 記錄到 Event Log。
- **多執行緒安全**:Horse 本身多執行緒,Service 也支援,沒問題。
- **Debug**:開發時,先用 Console 版測試。正式 debug Service 可以用 Attach to Process(Run → Attach to Process),或加參數讓它跑成 Console(進階技巧)。
- **推薦工具**:HashLoad 有個 horse-wizard(GitHub 上),可以直接產生 WinService 版的 Horse 專案模板,超方便!搜尋 "HashLoad horse-wizard" 下載用。
- **防火牆**:記得開 port(例如 9000)。

這樣部署後,你的 Horse API 就變成真正的背景服務了,穩定又專業!如果遇到特定錯誤(如 Access Violation),通常是 DataModule 初始化順序問題,把 Create 移到 ServiceStart 裡試試。

<未完待續> 

2025/08/23

EXARC (Express ARC JS Starter Kit) 為 Delphi 開發者打造的現代化 Web 開發框架

EXARC (Express ARC JS Starter Kit)
-- 為 Delphi 開發者打造的現代化 Web 開發框架

🎯 給熟悉 DataSnap、MVC、WebBroker 的您

如果您曾經使用過 Delphi DataSnap REST 的代理自動生成功能,或是體驗過 Delphi MVC Web Framework 的路由機制,那麼 EXARC 將會讓您感到非常熟悉。它將 Delphi 開發中最優雅的概念帶到了現代 JavaScript 生態系統中。


🔄 從 Delphi 到 JavaScript:相似的開發哲學

DataSnap REST 的現代化演進

還記得 Delphi DataSnap 如何自動為您的伺服器方法生成用戶端代理嗎?EXARC 採用了相同的理念:

Delphi DataSnap EXARC 相似度
伺服器方法定義 Express 路由定義 ✅ 相同概念
自動生成用戶端代理 自動生成 apiProxy.js ✅ 相同機制
型別安全的呼叫 語義化的 async 呼叫 ✅ 相同體驗
內建認證支援 JWT 認證中介軟體 ✅ 相同功能
// Delphi DataSnap 伺服器方法
function TServerMethods.EchoMessage(const AMessage: string): string;
begin
  Result := 'Echo: ' + AMessage;
end;

// 自動生成的用戶端代理呼叫
ClientModule.ServerMethods.EchoMessage('Hello');
// EXARC Express 路由定義
app.get('/api/echomsg/:msg', (req, res) => {
    res.json({ echoed: req.params.msg });
});

// 自動生成的前端代理呼叫
await apiProxy.echomsg('Hello');

MVC Web Framework 的路由理念

熟悉 Delphi MVC 的路由屬性嗎?EXARC 採用了相似但更簡潔的方式:

// Delphi MVC Controller
[MVCPath('/api/users')]
[MVCHTTPMethod([httpGET])]
function GetUserList: TObjectList<TUser>;
// EXARC Express 路由
app.get('/api/users/list', (req, res) => {
    res.json(getUserList());
});
// 自動生成: apiProxy.usersList()

💡 為什麼 Delphi 開發者會愛上 EXARC?

1. 熟悉的開發模式

您已經習慣了 Delphi 的「定義一次,處處可用」理念:

  • DataSnap: 定義伺服器方法 → 自動生成用戶端代理
  • EXARC: 定義 Express 路由 → 自動生成前端代理
  • 結果: 相同的開發體驗,但擁抱現代 Web 技術

2. 強型別思維的延續

雖然是 JavaScript,但 EXARC 透過 JSDoc 和自動生成機制,提供了接近強型別的開發體驗:

/**
 * 建立使用者資料
 * @param {Object} userData - 使用者資訊
 * @param {string} userData.name - 使用者姓名
 * @param {string} userData.email - 電子郵件
 * @returns {Promise<Object>} 建立結果
 */
app.post('/api/users/create', (req, res) => {
    // 業務邏輯實作
});

// 前端呼叫時會有清楚的參數提示
await apiProxy.usersCreate({
    name: "John Doe",
    email: "john@example.com"
});

3. 內建的測試和除錯工具

就像 Delphi IDE 的整合除錯環境,EXARC 提供內建的 API 測試器:

  • 自動掃描所有 API 端點(類似 DataSnap 的伺服器方法瀏覽器)
  • 即時參數輸入和測試(類似 Delphi 的 Method Invoker)
  • 即時回應查看(類似 REST Debugger)

🚀 技術架構對比

從 WebBroker 到 Express.js

概念 Delphi WebBroker EXARC Express.js
HTTP 伺服器 TWebModule + HTTP.sys Node.js + Express
路由處理 WebActionItem app.get/post/put/delete
中介軟體 WebModule Events Express Middleware
靜態檔案 DocumentRoot express.static
會話管理 TWebSession JWT Token

從 DataSnap 到 EXARC

// Delphi DataSnap 架構
TServerContainer -> TDSServer -> TServerMethods
                              -> Auto-generated Client Proxy
// EXARC 架構
Express Router -> API Routes -> Auto-generated apiProxy.js
                            -> Dynamic API Invoker

🔧 實際開發對比

Delphi DataSnap 開發流程

// 1. 定義伺服器方法
function TServerMethods.GetCustomerOrders(CustomerID: Integer): TJSONArray;
begin
  // 實作業務邏輯
end;

// 2. 編譯專案,自動更新用戶端代理

// 3. 用戶端呼叫
ClientModule.ServerMethods.GetCustomerOrders(123);

EXARC 開發流程

// 1. 定義 Express 路由
app.get('/api/customers/:id/orders', (req, res) => {
    const customerId = req.params.id;
    // 實作業務邏輯
    res.json(getCustomerOrders(customerId));
});

// 2. 儲存檔案,自動更新前端代理

// 3. 前端呼叫
await apiProxy.customersOrders(123);

相似度:95%!


🌟 EXARC 相比 Delphi 的優勢

1. 現代化的生態系統

  • 豐富的套件庫: npm 生態系統 vs GetIt Package Manager
  • 跨平台部署: Linux/Windows/macOS vs Windows 主要
  • 容器化支援: Docker 原生支援 vs 需要額外配置

2. 前端技術選擇自由

  • 多框架支援: React, Vue, 原生 JS vs 主要是 Delphi 用戶端
  • 響應式設計: 內建 Mobile-first 設計
  • 現代 UI 框架: Tailwind, Bootstrap 等

3. 開發工具整合

  • VS Code 完整支援: IntelliSense, 除錯, Git 整合
  • 熱重載: 程式碼變更即時生效
  • DevTools: 強大的瀏覽器除錯工具

4. 部署和維運

  • 雲端原生: 天然支援 AWS, Azure, GCP
  • CI/CD 整合: GitHub Actions, GitLab CI 等
  • 監控和日誌: 豐富的 APM 工具

🎯 遷移建議:從 Delphi 到 EXARC

階段一:概念對應

  • DataSnap 伺服器方法 → Express 路由
  • ClientDataSet → JSON 資料處理
  • WebBroker Actions → Express 中介軟體
  • ISAPI/CGI → Node.js HTTP Server

階段二:逐步遷移

  1. API 層先行: 將 DataSnap REST 服務改寫為 Express API
  2. 保持資料庫: 繼續使用現有的 SQL Server/Oracle/FireDAC
  3. 前端現代化: 逐步將 VCL/FMX 用戶端改為 Web 介面
  4. 認證統一: 從 Session-based 遷移到 JWT

階段三:現代化升級

  • 導入 TypeScript (可選)
  • 整合現代 CSS 框架
  • 實作 PWA 功能
  • 加入自動化測試

📊 成本效益分析

Delphi 開發 vs EXARC 開發

項目 Delphi 生態 EXARC + Node.js
授權成本 Delphi Professional: $1,500+ 完全免費
伺服器授權 Windows Server 授權 Linux 免費
部署成本 IIS + Windows Docker + 雲端 (更便宜)
維護成本 需要 Delphi 專家 JavaScript 開發者更易找
學習曲線 對 Delphi 開發者: 低 中等 (但概念相似)

🛠️ 實作範例:從 DataSnap 到 EXARC

Delphi DataSnap 範例

unit ServerMethodsUnit;

interface

uses
  SysUtils, Classes, DSServer, DSAuth, DataSnap.DSProviderDataModuleAdapter,
  Datasnap.DSClientMetadata, Data.FireDACJSONReflect, Data.DB;

type
  TServerMethods = class(TDSServerModule)
  private
  public
    function GetUserProfile(UserID: Integer): TJSONObject;
    function UpdateUserProfile(UserID: Integer; ProfileData: TJSONObject): Boolean;
  end;

implementation

function TServerMethods.GetUserProfile(UserID: Integer): TJSONObject;
begin
  // 實作取得使用者資料邏輯
  Result := TJSONObject.Create;
  Result.AddPair('id', TJSONNumber.Create(UserID));
  Result.AddPair('name', 'John Doe');
end;

function TServerMethods.UpdateUserProfile(UserID: Integer; ProfileData: TJSONObject): Boolean;
begin
  // 實作更新使用者資料邏輯
  Result := True;
end;

EXARC 對應實作

// server.js
const express = require('express');
const app = express();

app.use(express.json());

// 對應 TServerMethods.GetUserProfile
app.get('/api/users/:id/profile', (req, res) => {
    const userId = parseInt(req.params.id);
    
    // 實作取得使用者資料邏輯
    const userProfile = {
        id: userId,
        name: 'John Doe',
        email: 'john@example.com'
    };
    
    res.json(userProfile);
});

// 對應 TServerMethods.UpdateUserProfile
app.put('/api/users/:id/profile', (req, res) => {
    const userId = parseInt(req.params.id);
    const profileData = req.body;
    
    // 實作更新使用者資料邏輯
    const success = updateUserProfile(userId, profileData);
    
    res.json({ success: success });
});

app.listen(3000);

自動生成的前端代理

// apiProxy.js (自動生成)
export const apiProxy = {
    /**
     * 取得使用者資料
     * @param {number} id - 使用者 ID
     * @returns {Promise<Object>} 使用者資料
     */
    usersProfile: async (id) => {
        return handleApiCall(api.get, `users/${id}/profile`);
    },

    /**
     * 更新使用者資料
     * @param {number} id - 使用者 ID  
     * @param {Object} data - 更新資料
     * @returns {Promise<Object>} 更新結果
     */
    usersProfileUpdate: async (id, data) => {
        return handleApiCall(api.put, `users/${id}/profile`, data);
    }
};

// 使用方式 (類似 DataSnap 用戶端代理)
const profile = await apiProxy.usersProfile(123);
const result = await apiProxy.usersProfileUpdate(123, { name: 'Jane Doe' });

🎉 結論:擁抱現代化,保持熟悉感

EXARC 為 Delphi 開發者提供了一條平滑的現代化遷移路徑:

保留 Delphi 的優雅設計理念 - 自動化、強型別思維、整合開發體驗
擁抱現代 Web 技術 - JavaScript 生態、雲端原生、跨平台部署
降低學習成本 - 相似的概念映射、熟悉的開發流程
提升競爭力 - 更低的成本、更大的人才庫、更好的擴展性

立即開始您的現代化之旅

# 30 秒體驗 EXARC
npx degit Eden5Wu/EXARC my-modern-api
cd my-modern-api && npm install && npm run dev

# 訪問 http://localhost:8893/apiProxyInvoker.html
# 體驗類似 DataSnap Method Invoker 的測試工具!

從 Delphi 到 EXARC,不是放棄過去,而是站在巨人的肩膀上擁抱未來。 🚀


📞 技術支援

  • GitHub: Eden5Wu/EXARC
  • 遷移指南: [專為 Delphi 開發者準備的詳細文檔]
  • 範例專案: [DataSnap 到 EXARC 的完整遷移範例]

讓我們一起將 Delphi 的優雅帶入現代 Web 開發! 💪

EXARC (Express ARC JS Starter Kit) 革命性的前後端開發框架

 EXARC (Express ARC JS Starter Kit) 革命性的前後端開發框架


🚀 告別重複工作,專注核心價值

EXARC 是一個基於 Express.js 的輕量級後端開發模板,專為追求高效開發體驗的團隊而設計。它徹底改變了傳統的前後端開發模式,讓您只需專注於業務邏輯的實現,其餘一切交給自動化處理。


💡 核心理念:後端驅動,前端自動同步

以後端為唯一真實來源 (Backend as the Single Source of Truth)

傳統開發中,前後端 API 介面需要分別維護,容易造成不同步問題。EXARC 創新地將這個流程完全自動化:

  • 後端定義路由 → 前端 API 代理自動生成
  • API 文件自動更新 → 測試工具即時同步
  • 零手動配置 → 開箱即用的完整解決方案

🎯 解決的核心痛點

1. 前後端介面不同步

  • 傳統方式:手動維護前端 fetch/axios 請求,容易與後端脫節
  • EXARC 方式:後端路由變更,前端代理自動更新

2. 重複的樣板程式碼

  • 傳統方式:每個 API 都需要寫相似的請求處理邏輯
  • EXARC 方式:一次定義,處處可用的語義化 API 呼叫

3. API 測試與文件維護

  • 傳統方式:需要額外工具如 Postman,文件容易過時
  • EXARC 方式:內建動態 API 調用器,測試與文件自動同步

4. 認證機制複雜性

  • 傳統方式:前後端認證邏輯分散,難以維護
  • EXARC 方式:統一的 JWT 認證流程,可一鍵切換啟用/停用

⚡ 核心特性

🔄 自動化 API 代理生成

// 後端:只需定義 Express 路由
app.get('/api/users/profile', (req, res) => {
    res.json({ user: 'profile data' });
});

// 前端:自動生成語義化呼叫
const profile = await apiProxy.usersProfile();

🧪 動態 API 測試器

  • 自動讀取後端路由,生成互動式測試介面
  • 支援 JSDoc 註解解析,提供完整的參數說明
  • 智能判斷輸入類型(JSON/純文字),零配置使用

🔐 彈性認證系統

  • 基於 JWT 的無狀態認證
  • 環境變數一鍵切換認證開關
  • 前後端獨立控制登入 UI 顯示

🌐 多框架支援

內建完整的範例,支援主流前端技術:

  • 原生 JavaScript - 輕量級實作
  • React - 現代組件化開發
  • Vue.js - 漸進式框架整合
  • jQuery Mobile - 移動端快速原型

📈 開發效率提升

傳統開發流程 vs EXARC 流程

階段 傳統方式 EXARC 方式 時間節省
API 定義 後端路由 + 前端請求函式 僅需後端路由 50%
介面同步 手動更新前端代碼 自動生成同步 90%
API 測試 配置 Postman 等工具 內建動態測試器 70%
文件維護 手動更新 API 文件 JSDoc 自動解析 80%

實際開發體驗

// 🎯 EXARC:四步驟完成 API 開發

// 1. 後端定義路由(唯一需要手寫的部分)
app.post('/api/orders/create', (req, res) => {
    const order = createOrder(req.body);
    res.json({ success: true, order });
});

// 2. 自動生成前端代理(無需任何操作)
// ✨ 伺服器重啟時自動更新 apiProxy.js

// 3. 前端直接使用(語義化呼叫)
const result = await apiProxy.ordersCreate(orderData);

// 4. 動態測試器自動更新(無需任何操作)
// ✨ 訪問 /apiProxyInvoker.html 即可測試

🏗️ 架構優勢

智能文件解析

  • 自動掃描 Express 路由堆疊
  • 將 REST 路徑轉換為駝峰式函式名稱
  • JSDoc 註解自動提取並生成文件

零配置哲學

  • 使用 degit 一鍵複製專案模板
  • npm run dev 即可啟動完整開發環境
  • 內建 nodemon 配置,避免無限重啟問題

生產就緒

  • 環境變數管理
  • 嚴格的 JWT 認證中介軟體
  • 完整的錯誤處理機制

🎨 適用場景

完美適合

  • 快速原型開發 - 將想法迅速轉化為可用產品
  • 中小型專案 - 需要高效開發流程的商業應用
  • API 優先設計 - 重視前後端分離的現代化項目
  • 團隊協作 - 需要統一開發規範的多人項目

技術團隊

  • 全端工程師 - 一人完成前後端開發
  • 前端開發者 - 快速建立後端 API 支援
  • 後端開發者 - 無需關心前端 API 調用細節
  • 專案經理 - 需要快速交付 MVP 的敏捷團隊

🚀 快速開始

30 秒啟動專案

# 1. 複製模板
npx degit Eden5Wu/EXARC my-awesome-project

# 2. 安裝依賴
cd my-awesome-project && npm install

# 3. 啟動開發
npm run dev

# 4. 開始編碼!
# 後端:編輯 server.js 新增 API
# 前端:直接使用 apiProxy.methodName()
# 測試:訪問 http://localhost:8893/apiProxyInvoker.html

📊 為什麼選擇 EXARC?

對比其他解決方案

特性 EXARC 傳統 Express Next.js API tRPC
學習曲線 ⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
自動化程度 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
開發速度 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ⭐⭐⭐
靈活性 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐
內建測試 ⭐⭐⭐⭐⭐ ⭐⭐

🎯 結語

EXARC 不只是一個開發框架,更是一種開發哲學的體現。

它相信開發者的時間應該花在創造價值上,而不是重複性的基礎設施建設。通過極致的自動化和智能化,EXARC 讓您能夠:

  • 🎯 專注業務邏輯 - 將創意直接轉化為代碼
  • 提升開發效率 - 用更少的時間交付更多價值
  • 🛡️ 降低維護成本 - 自動同步機制避免技術債務
  • 🚀 加速產品迭代 - 從想法到部署的最短路徑

選擇 EXARC,選擇更智慧的開發方式。


📞 立即開始

  • GitHub: Eden5Wu/EXARC
  • 快速開始: npx degit Eden5Wu/EXARC your-project-name
  • 授權: MIT License
  • 支援: Issues & Discussions on GitHub

讓 EXARC 成為您下一個專案的加速器! 🚀