為什麼技術選型 CMS 我要選 Strapi?2024 年中的預算與系統分析決策

引言:一個技術選型的起點 2024 年 6 月,我坐在會議室裡,面對著老闆和行銷總監,準備報告我對公司新系統 CMS 的技術選型建議。這不是一個輕鬆的決定——選錯了,可能浪費數百萬的開發成本;選對了,能為公司省下可觀的人力支出。 經過數週的研究與分析,作為一個架構規劃師同時也是技術決策者,我最終選擇了 Strapi 作為我們的 Headless CMS 解決方案。這篇文章將分享我的決策過程、考量因素,以及最重要的——這個選擇如何為公司省下大筆預算。 什麼是 Headless CMS? 在深入 Strapi 之前,先理解 Headless CMS 的核心概念。 傳統 CMS vs Headless CMS 傳統 CMS 將前端與後端緊密耦合,網站的外觀和內容管理綁在一起。而 Headless CMS 則專注於內容管理和 API 提供,讓前端團隊可以使用任何技術框架來消費這些 API。 Headless CMS 的核心優勢 特性 傳統 CMS Headless CMS 前後端耦合 緊密耦合 完全分離 前端技術選擇 受限於 CMS 模板 任意框架(Vue、React、Flutter) 多平台支援 僅限網頁 Web、App、IoT 皆可 擴展性 中等 極高 API 優先 否 是 為什麼選擇 Strapi?三大核心原因 原因一:前後端完全分離 Strapi 作為 Headless CMS,天生就是為了前後端分離而設計。這意味著: ...

December 23, 2025 · 3 分鐘 · Peter

15 次 Build Failed:一場 Jenkins + Flutter CI/CD 的史詩級除錯之旅

前言:當 Build Failed 成為日常 在過去的 19 個小時裡,我經歷了 15 次 build failed,產生了 15 個 fix commits。如果你覺得這很誇張,讓我告訴你更誇張的:最後一個 bug 是 git describe 在多個 tag 指向同一 commit 時會隨機返回其中一個。 是的,隨機。在 CI/CD Pipeline 裡。 這篇文章完整記錄這場除錯馬拉松,從最初的 Fastlane 版本問題,到 Discord 通知功能的實作與修復,再到 Ruby 相容性地獄,最後揭開 git 鮮為人知的行為。泡杯咖啡,這會是一段旅程。 第一章:Fastlane 與 Bundler 的糾葛 問題 1:Fastlane 版本不一致 Commit: fix(jenkins): use bundle exec for fastlane to ensure version consistency Jenkins 機器上有全域安裝的 Fastlane,但版本與 Gemfile.lock 指定的不同。這導致某些 action 行為不一致。 // Before: 使用全域 fastlane sh 'fastlane ios build' // After: 透過 Bundler 執行,確保版本一致 sh 'bundle exec fastlane ios build' 學習:在 CI 環境中,永遠使用 bundle exec 執行 Ruby 工具,確保版本與 lockfile 一致。 ...

December 21, 2025 · 5 分鐘 · Peter

Claude Code Token 不夠用?從 $20 升到 $100 還是燒光:我學到的教訓

前言:一個月燒掉 $100 的真實故事 如果你正在考慮升級 Claude Code 的訂閱方案,或者已經升級了卻發現 token 還是不夠用,那你來對地方了。 這不是一篇推銷文,而是一個真實的使用心得。 我從 Pro Plan($20/月) 開始使用 Claude Code,很快就發現 token 不夠用。心想:「升級到 Max Plan($100/月)應該就沒問題了吧?」 結果呢? Max Plan 的 token 也不夠用。 更尷尬的是,我花了大把的 token 去處理一些看似簡單的 bug,像是: 體脂率的小數點精度問題 排便次數顯示 null 和 0 的差異 這些問題聽起來簡單,實際上卻各花了大量 token 去「探索」程式碼。 直到我發現問題的根源不是 token 不夠 (Pro plan是真的不夠!),而是我沒有找到對的 Skill 來處理這類問題。 問題分析:Token 都燒去哪了? 讓我用一張圖來說明沒有使用正確 Skill 時的除錯流程: 看到問題了嗎? 這就是「漫無目的的探索」——AI 不知道該往哪裡找,所以它嘗試讀取所有可能相關的檔案,每次讀取都在消耗 token。 Token 消耗的真相 操作類型 Token 消耗 實際價值 讀取不相關的檔案 高 零 廣泛搜尋 grep/glob 中 低(通常需要多次) 隨機嘗試修復 高 可能為負(引入新 bug) 來回確認「這樣對嗎?」 中 低 我的真實案例:為了修一個體脂率顯示的小數點問題,AI 讀取了: ...

December 20, 2025 · 3 分鐘 · Peter

Cursor Browser Visual Editor 深度解析:AI 驅動的視覺化前端開發革命

前言 傳統的前端開發流程往往是這樣的:你在程式碼編輯器中修改 CSS,儲存檔案,切換到瀏覽器查看效果,發現不滿意,再切回編輯器調整⋯⋯這個來回切換的過程不僅耗時,更打斷了創意的流動。 Cursor 的 Browser Visual Editor 正是為了解決這個問題而生。 這個全新功能將網頁應用程式、程式碼庫和視覺化編輯能力整合在單一介面中,讓開發者可以直觀地操作介面元素,同時保持與程式碼的同步。本文將深入解析這項創新功能的核心概念、運作原理和實際應用場景。 什麼是 Cursor Browser Visual Editor? 核心概念 Cursor Browser Visual Editor 是一個整合在 Cursor IDE 中的視覺化編輯工具,它讓開發者能夠: 直接拖拉介面元素來調整佈局 透過側邊欄即時修改樣式屬性 使用自然語言描述想要的變更 讓 AI 自動更新對應的程式碼 這不只是一個簡單的 CSS 預覽工具,而是一個完整的**設計到程式碼(Design-to-Code)**工作流程。 省 Token 的關鍵利器 這裡要特別強調一個重要的實用價值:Visual Editor 可以大幅減少你對 AI 下 prompt 的次數,進而節省 Token 用量! 想像一下傳統的 AI 輔助開發流程: ❌ 傳統 AI 輔助方式(消耗大量 Token): 1. "請把這個按鈕的 padding 加大一點" → 消耗 Token 2. 看效果,不滿意 3. "再大一點,然後加個圓角" → 消耗 Token 4. 看效果,顏色不對 5. "背景色換成藍色" → 消耗 Token 6. 還是不滿意... 7. 反覆對話 10 次 → 消耗大量 Token 💸 ✅ Visual Editor 方式(幾乎零 Token): 1. 直接在面板上拖動 padding 滑桿 → 0 Token 2. 調整 border-radius 數值 → 0 Token 3. 點選色盤換顏色 → 0 Token 4. 即時預覽,滿意為止 → 0 Token 5. 只有複雜變更才需要 AI → 少量 Token ✅ 對於 Cursor 的付費用戶來說,這意味著: ...

December 19, 2025 · 4 分鐘 · Peter

Linux 壓縮工具完全指南:gzip、bzip2、xz、zstd、7z 效能全面比較

引言:選擇正確的壓縮工具為什麼重要? 在日常開發與維運工作中,我們經常需要壓縮檔案:備份資料庫、傳輸日誌檔、打包部署映像檔。選擇適當的壓縮工具,可能讓您的備份時間從 10 分鐘縮短到 2 分鐘,或是將 500MB 的檔案壓縮到 50MB。 本文將透過實際測試數據,深入比較常見的 Linux 壓縮工具,幫助您在不同場景下做出最佳選擇。 測試環境: macOS (Apple Silicon M1 Pro, 10 cores) 測試檔案:PostgreSQL 資料庫備份 (174 MB, my_DB_backup.sql) 測試項目:壓縮率、壓縮速度、解壓速度、特殊功能 壓縮工具快速對照表 工具 壓縮率 壓縮速度 解壓速度 多執行緒 加密 最佳場景 gzip ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ❌ ❌ 通用場景、快速壓縮 pigz ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ✅ ❌ 大檔案快速壓縮 bzip2 ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ❌ ❌ 中等壓縮需求 xz ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ✅ ❌ 最高壓縮率 zstd ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ✅ ❌ 平衡速度與壓縮率 7z ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ✅ ✅ 跨平台、加密需求 tar - - - - ❌ 打包工具(需搭配壓縮) 1. gzip:經典的壓縮工具 簡介 gzip 是 Linux 系統中最常用的壓縮工具,基於 DEFLATE 演算法(LZ77 + Huffman 編碼)。 ...

December 19, 2025 · 10 分鐘 · Peter

在 Kubernetes 上部署 OV SSL 證書:完整實戰指南

為什麼選擇 TWCA OV 證書 在生產環境中,使用自簽憑證會導致瀏覽器顯示不安全警告,影響使用者信任。雖然 Let’s Encrypt 提供免費的自動化證書,但某些企業或政府專案需要台灣在地的認證機構簽發證書以符合法規要求。 SSL 證書的三個等級 SSL 證書依據驗證強度分為三個等級: 證書類型 驗證內容 適用場景 信任標記 價格 DV (Domain Validation) 僅驗證網域所有權 個人網站、部落格 🔒 基本鎖頭 免費~低 OV (Organization Validation) 驗證組織身份 企業網站、SaaS 服務 🔒 組織名稱 中 EV (Extended Validation) 嚴格驗證企業 金融、電商、政府 🟢 綠色網址列 高 本文使用的是 TWCA OV SSL 證書,它提供: ✅ 組織身份驗證(瀏覽器可顯示公司名稱) ✅ 完整的證書鏈(受所有主流瀏覽器信任) ✅ 12 個月有效期 ✅ 台灣在地技術支援 HTTPS 與 SSL/TLS 運作原理 在深入部署之前,先理解 HTTPS 如何保護資料傳輸: 關鍵機制說明: 非對稱加密(RSA/ECDSA):只用於金鑰交換,確保 session key 安全傳輸 對稱加密(AES):實際資料傳輸使用,效能更好 證書鏈驗證(完全離線):瀏覽器使用內建的 TWCA 根憑證驗證整個證書鏈,不需要連線到 TWCA 中間人攻擊防護:因為攻擊者沒有伺服器的私鑰,無法解密通訊 💡 重要觀念: TWCA 只在簽發證書時參與,TLS 握手過程中完全不涉及。瀏覽器使用內建的根憑證庫(包含 TWCA 根憑證)進行離線驗證。 ...

December 10, 2025 · 6 分鐘 · Peter

會員資料不見?這不是我沒要求,是外包商沒做完整的 OAuth 2.0

故事的開始:會員資料集體消失事件 最近收到許多會員的反映,問題驚人地一致: 📝 「我的日記資料不見了!」 👤 「帳號被自動登出,要重新登入」 ⏳「App 一直轉圈圈,什麼都看不到」 😰 「重新開啟 App 也一樣,資料都不見了」 更詭異的是,這些問題似乎沒有規律性,有的使用者正常,有的使用者卻深受其擾。身為技術負責人,這讓我立刻警覺:這不是資料遺失,而是認證機制出問題了。 調查過程:抽絲剝繭找出真相 問題時間軸 第一步:確認資料庫完整性 我的第一個懷疑是資料庫是否真的遺失資料。登入後台查詢,發現: ✅ 關鍵發現: 所有會員的日記資料都完好無缺 這代表問題不在資料層,而是在存取權限上。 第二步:檢查使用者行為模式 整理會員回報的時間點,我發現一個規律: 會員 註冊時間 問題發生時間 間隔 會員 A 30 天前 今天 30 天 會員 B 29 天前 今天 29 天 會員 C 3 天前 正常使用 - 關鍵字:30 天 ⚡ 第三步:檢查 JWT Token 配置 翻開 Strapi 後端的配置檔,真相大白: // Strapi 預設 JWT 設定 jwt: { expiresIn: '30d' // Token 有效期:30 天 } 問題根本原因 💡 關鍵洞察: 使用者以為資料不見了,實際上只是「看不到」而已。資料仍安全地存在資料庫中,只是 Token 過期導致無法存取。 ...

December 6, 2025 · 6 分鐘 · Peter

Subagent-Driven 與 Parallel Session:AI 協作開發的兩種典範

前言:AI 協作開發的範式演進 在 AI 輔助開發工具快速演進的今天,我們已經從「程式碼自動補全」進化到「AI 主動協作」的階段。Claude Code 作為 Anthropic 推出的革命性開發工具,引入了兩種截然不同但互補的協作模式:Subagent-Driven Development 和 Parallel Session。 ...

November 30, 2025 · 22 分鐘 · Peter

Google Antigravity:AI 開發的典範轉移,從輔助編碼到自主開發

圖片來源:Google Antigravity 官方部落格 前言:當 AI 從助手變成隊友 2025 年 11 月,Google 悄悄推出了一款顛覆性的開發工具 —— Antigravity。這不是又一個「AI 程式碼補全工具」,而是一個徹底改變我們思考軟體開發方式的平台。如果說 GitHub Copilot 和 Cursor 是你的智慧助手,那麼 Antigravity 就是一支能夠自主規劃、執行和驗證的 AI 團隊。 在深入研究了官方文件、實際案例和社群回饋後,我想分享這個「代理優先」(Agent-First)開發平台的核心理念、創新功能,以及它目前仍面臨的挑戰。 核心概念:什麼是「代理優先」開發? 傳統 AI 輔助 vs. 代理優先開發 在傳統的 AI 輔助編碼中,開發者仍然是主角:你逐行寫程式碼,AI 只是在旁邊提供自動完成建議。但 Antigravity 提出了一個全新的工作模式: 你不再是程式碼的執行者,而是任務的指揮官。 這個轉變體現在: 傳統模式:「我要在第 42 行加一個函數…」(微觀管理) Antigravity 模式:「建立一個包含搜尋功能的活動網站」(任務導向) AI 代理會: 分析需求並制定計劃 自主執行所有編碼工作 測試應用程式並驗證功能 產生可審查的成果文件(Artifacts) 三個核心介面:Mission Control 架構 Antigravity 設計了三個相互配合的工作介面: Editor 與 Agent Manager 的雙介面架構 1. Agent Manager(非同步任務中心) 這是你的「任務控制中心」,可以: ...

November 22, 2025 · 5 分鐘 · Peter

Vue SPA 預渲染與 OpenGraph 完整指南:從問題到解決方案

前言 在現代 Web 開發中,Vue 單頁應用程式(SPA)帶來了優秀的使用者體驗,但同時也面臨著 SEO 和社交媒體分享的挑戰。當用戶在 Facebook、LINE 或其他社交平台分享你的網站連結時,你希望顯示的是精美的預覽卡片,而不是空白或錯誤的資訊。然而,搜尋引擎爬蟲和社交媒體爬蟲無法執行 JavaScript,導致只能抓到空白的 HTML 骨架,Open Graph 標籤也無法正確顯示。 本文將深入探討兩種預渲染策略:Run-time Prerender(動態預渲染) 和 Build-time Prerender(靜態預渲染),並分享實際的實作經驗與部署過程中遇到的挑戰。 問題發現與場景 典型的問題場景 當開發一個基於 Vue.js 3 + Strapi 的網頁平台時,可能會發現一個重要問題: 當用戶分享服務頁面(如 https://www.abc.com/service-us/6)到 Facebook 或 LINE 時,顯示的預覽資訊總是預設值,而非該服務的實際標題和描述。 使用 Facebook 的 Open Graph Debugger 測試後發現,爬蟲抓取到的 HTML 只包含基本的模板,動態生成的 meta 標籤完全沒有被識別。 SPA 的 SEO 困境 典型的 Vue SPA 在未預渲染前,HTML 長這樣: <!DOCTYPE html> <html lang="zh-TW"> <head> <meta charset="UTF-8"> <title>範例網站</title> <meta name="description" content="預設描述"> </head> <body> <div id="app"></div> <script type="module" src="/src/main.js"></script> </body> </html> 問題: Facebook 爬蟲抓不到動態產生的 Open Graph 標籤 Google 爬蟲雖然能執行 JS,但會降低 SEO 排名 分享連結到社群媒體時無法顯示預覽圖 我們需要什麼? 針對不同的路由,回傳不同的 meta 標籤: ...

November 16, 2025 · 13 分鐘 · Peter