<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>喂！我是 Wei</title>
    <link>https://ray-blog-nine.vercel.app</link>
    <description>Front-End Engineering &amp; Web Development</description>
    <language>zh-TW</language>
    <lastBuildDate>Wed, 24 Jun 2026 06:49:45 GMT</lastBuildDate>
    <atom:link href="https://ray-blog-nine.vercel.app/rss.xml" rel="self" type="application/rss+xml"/>
    
    <item>
      <title>前端 CI/CD 與正式環境除錯：從 Pull Request 到事故排查</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-24-frontend-cicd-production-debugging</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-24-frontend-cicd-production-debugging</guid>
      <description>整理前端工程流程面試題：Git workflow、CI quality gates、preview deployment、source map、error tracking、Web Vitals、feature flag 與正式環境事故處理。</description>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>CI/CD</category>
      <category>正式環境除錯</category>
    </item>

    <item>
      <title>即時資料怎麼選？Polling、SSE、WebSocket 比較</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-23-realtime-polling-sse-websocket</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-23-realtime-polling-sse-websocket</guid>
      <description>整理即時通訊面試題：短輪詢、長輪詢、Server-Sent Events、WebSocket 的差異、重連、心跳、訊息順序與適用場景。</description>
      <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>即時通訊</category>
      <category>WebSocket</category>
    </item>

    <item>
      <title>前端系統設計：如何拆元件、資料流與大型專案架構？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-22-frontend-system-design</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-22-frontend-system-design</guid>
      <description>用大型列表與 Dashboard 情境整理前端系統設計面試：需求澄清、元件邊界、狀態分類、API、快取、錯誤處理、效能、測試與可觀測性。</description>
      <pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>前端架構</category>
      <category>System Design</category>
    </item>

    <item>
      <title>無障礙不是加 ARIA：語意化 HTML、鍵盤操作與焦點管理</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-21-web-accessibility-interview</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-21-web-accessibility-interview</guid>
      <description>整理前端無障礙面試題：semantic HTML、ARIA、keyboard navigation、focus management、表單 label、圖片替代文字與常見檢測方式。</description>
      <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>Accessibility</category>
      <category>HTML</category>
    </item>

    <item>
      <title>CSS 與 RWD 面試整理：Flexbox、Grid、定位與層疊脈絡</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-19-css-layout-rwd-interview</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-19-css-layout-rwd-interview</guid>
      <description>整理 CSS 面試常見題：Flexbox 與 Grid、position、stacking context、盒模型、RWD、media query、container query 與跨瀏覽器處理。</description>
      <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>CSS</category>
      <category>RWD</category>
    </item>

    <item>
      <title>Web 安全面試整理：XSS、CSRF、CORS 與 CSP</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-18-web-security-xss-csrf-cors</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-18-web-security-xss-csrf-cors</guid>
      <description>從前端角度整理 XSS、CSRF、CORS、CSP、Cookie 屬性與敏感資料處理，說明常見攻擊方式、防護方法和容易混淆的差異。</description>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>Web 安全</category>
      <category>瀏覽器</category>
    </item>

    <item>
      <title>瀏覽器輸入網址後發生什麼事？從 DNS 到畫面渲染</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-16-browser-url-rendering-process</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-16-browser-url-rendering-process</guid>
      <description>整理瀏覽器原理面試題：DNS、TCP/TLS、HTTP request、cache、HTML parsing、DOM/CSSOM、render tree、layout、paint 與 JavaScript 阻塞。</description>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>瀏覽器原理</category>
      <category>網路</category>
    </item>

    <item>
      <title>前端測試怎麼分層？Unit、Integration、E2E 的取捨</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-15-frontend-testing-strategy</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-15-frontend-testing-strategy</guid>
      <description>整理前端測試面試題：單元測試、整合測試、E2E 的差異，React Testing Library 與 Playwright 的角色，以及哪些流程值得優先測試。</description>
      <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>自動化測試</category>
      <category>Playwright</category>
    </item>

    <item>
      <title>JavaScript Event Loop：Promise 和 setTimeout 誰先執行？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-13-javascript-event-loop-interview</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-13-javascript-event-loop-interview</guid>
      <description>從 Call Stack、Web APIs、microtask、macrotask 解釋 JavaScript Event Loop，整理 Promise、queueMicrotask、setTimeout 的執行順序與常見面試題。</description>
      <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>JavaScript</category>
      <category>Event Loop</category>
    </item>

    <item>
      <title>TypeScript 面試必懂：any、unknown、never、泛型與型別收斂</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-12-typescript-type-system-interview</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-12-typescript-type-system-interview</guid>
      <description>整理 TypeScript 面試高頻題：any 與 unknown、never、union、generic、utility types、type narrowing，以及如何替 API response 建立安全型別。</description>
      <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>TypeScript</category>
      <category>型別系統</category>
    </item>

    <item>
      <title>前端工程師面試題：RESTful API 裡 PUT 和 PATCH 差在哪？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-11-frontend-interview-restful-put-patch</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-11-frontend-interview-restful-put-patch</guid>
      <description>整理 RESTful API 面試常見題：PUT 與 PATCH 的語意差異、idempotent、request body 設計，以及前端串接時如何避免覆蓋資料。</description>
      <pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>API 設計</category>
      <category>RESTful</category>
    </item>

    <item>
      <title>前端工程師面試題：請說明一次 Code Review 經驗，你通常會看什麼？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-10-frontend-interview-code-review</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-10-frontend-interview-code-review</guid>
      <description>整理 Code Review 面試題：如何描述實際 review 經驗、review 時會看哪些層面，以及如何寫出有建設性的 review comment。</description>
      <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>Code Review</category>
      <category>團隊協作</category>
    </item>

    <item>
      <title>前端工程師面試題：Docker 怎麼部署 Discord Bot？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-09-frontend-interview-docker-discord-bot</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-09-frontend-interview-docker-discord-bot</guid>
      <description>整理 Docker 部署 Discord Bot 的實務回答：Dockerfile、.dockerignore、環境變數、volume、restart policy、logs 與部署注意事項。</description>
      <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>Docker</category>
      <category>Discord Bot</category>
    </item>

    <item>
      <title>前端工程師面試題：HLS 是什麼？前端怎麼播放串流影片？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-08-frontend-interview-hls</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-08-frontend-interview-hls</guid>
      <description>整理 HLS 串流面試題：m3u8、影片分段、adaptive bitrate streaming、瀏覽器支援、hls.js，以及直播延遲與 CDN 的常見追問。</description>
      <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>影音串流</category>
      <category>HLS</category>
    </item>

    <item>
      <title>前端工程師面試題：React Key 為什麼重要？useEffect dependency array 為什麼重要？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-07-frontend-interview-react-key-useeffect</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-07-frontend-interview-react-key-useeffect</guid>
      <description>整理 React 面試常見基礎題：key 如何影響元件身份、index 當 key 的問題，以及 useEffect dependency array 漏寫可能造成的 stale closure 與同步錯誤。</description>
      <pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>React</category>
      <category>Hooks</category>
    </item>

    <item>
      <title>前端工程師面試題：5000 筆列表卡頓，你會怎麼優化？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-06-frontend-interview-list-performance</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-06-frontend-interview-list-performance</guid>
      <description>整理大量列表卡頓時的排查與優化思路：先量測瓶頸，再從 virtualized list、分頁、memo、後端查詢與互動降載處理。</description>
      <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>效能優化</category>
      <category>大量列表</category>
    </item>

    <item>
      <title>前端工程師面試題：MobX、Redux、Zustand 怎麼選？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-05-frontend-interview-state-management</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-05-frontend-interview-state-management</guid>
      <description>整理 React 狀態管理面試題：先區分 local state、server state、URL state、global client state，再比較 Redux、MobX、Zustand 的取捨。</description>
      <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>狀態管理</category>
      <category>React</category>
    </item>

    <item>
      <title>前端工程師面試題：useMemo 和 useCallback 差在哪？什麼時候不該用？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-04-frontend-interview-react-memo-hooks</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-04-frontend-interview-react-memo-hooks</guid>
      <description>整理 React 效能面試常見題：useMemo、useCallback、React.memo 的差異、使用時機、常見誤區，以及和 re-render 的關係。</description>
      <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>React</category>
      <category>效能優化</category>
    </item>

    <item>
      <title>前端工程師面試題：React Router v5 升級 v6 改了哪些？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-03-frontend-interview-react-router-v5-v6</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-03-frontend-interview-react-router-v5-v6</guid>
      <description>整理 React Router v5 到 v6 的升級重點：Routes、element、useNavigate、Navigate、Outlet、nested routes，以及升級時常見踩坑。</description>
      <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>React Router</category>
      <category>React</category>
    </item>

    <item>
      <title>前端工程師面試題：CSR、SSR、SSG 差在哪？Next.js 為什麼適合 SEO？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-02-frontend-interview-rendering-seo</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-02-frontend-interview-rendering-seo</guid>
      <description>整理前端面試常見的渲染策略題：CSR、SSR、SSG、ISR 的差異、hydration 的概念，以及 Next.js 為什麼比純 React SPA 更適合 SEO。</description>
      <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>渲染與 SEO</category>
      <category>Next.js</category>
    </item>

    <item>
      <title>前端工程師面試題：Scrum 是什麼？工程師在 Sprint 裡做什麼？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-01-frontend-interview-scrum</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-06-01-frontend-interview-scrum</guid>
      <description>整理 Scrum 在前端面試中的回答方式：角色、事件、產出物、Sprint 流程，以及工程師實際參與開發時要注意的協作重點。</description>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>團隊協作</category>
      <category>Scrum</category>
    </item>

    <item>
      <title>前端工程師面試題：JWT 是什麼？OAuth 流程怎麼跑？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-05-31-frontend-interview-auth-jwt-oauth</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-05-31-frontend-interview-auth-jwt-oauth</guid>
      <description>整理前端面試最常出現的認證與授權題：JWT 的結構、優缺點、安全注意事項，以及 OAuth Authorization Code Flow 的完整流程。</description>
      <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>認證授權</category>
      <category>JWT OAuth</category>
    </item>

    <item>
      <title>前端工程師面試題：後端 API 回應很慢，你會怎麼協助排查？</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-05-30-frontend-interview-api-debug</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-05-30-frontend-interview-api-debug</guid>
      <description>整理 API 效能排查面試題：前端如何用 Network、Performance、payload size、trace id、重複 request 和渲染成本協助定位問題。</description>
      <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
      <category>前端面試系列</category>
      <category>API 排查</category>
      <category>效能優化</category>
    </item>

    <item>
      <title>Discord Bot 監控與告警：Bot 掛掉時自動發通知到頻道</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-04-03-discord-bot-monitoring-alert</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-04-03-discord-bot-monitoring-alert</guid>
      <description>Bot 在半夜崩潰，隔天才發現？這篇實作兩層防線：用 heartbeat 讓 Bot 定時報活、用 Discord Webhook 在崩潰當下直接推告警，讓你第一時間知道 Bot 狀態。</description>
      <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Node.js</category>
      <category>監控</category>
      <category>Webhook</category>
    </item>

    <item>
      <title>Harness Engineering：AI Agent 的系統設計</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-04-02-harness-engineering-intro</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-04-02-harness-engineering-intro</guid>
      <description>當 AI 從單次回答走向長流程任務，Prompt 就不夠用了。這篇從「為什麼需要 Harness」出發，拆解它和傳統自動化的根本差異、五個核心元件，以及 Feedback Loop 為什麼是讓 AI 系統真正可靠的關鍵。</description>
      <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>Harness Engineering</category>
      <category>AI Agent</category>
      <category>Prompt Engineering</category>
      <category>AI 系統設計</category>
    </item>

    <item>
      <title>Discord Bot 串接 Groq：打造高速 AI 對話助理</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-04-01-discord-bot-groq-ai-chat</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-04-01-discord-bot-groq-ai-chat</guid>
      <description>實作 /ask 與 /reset：用 groq-sdk 串接 Llama 模型，做每個頻道獨立的多輪對話上下文，並補上錯誤處理與 token 成本控制。</description>
      <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Groq</category>
      <category>AI</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot 排程任務：node-cron 做每日公告與資料重置</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-31-discord-bot-cron-scheduler</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-31-discord-bot-cron-scheduler</guid>
      <description>用 node-cron 讓 Bot 定時主動發訊息，並把每日簽到在凌晨自動重置；同時整理時區、重複啟動與容器部署時的排程陷阱。</description>
      <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>node-cron</category>
      <category>Docker</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot Autocomplete：Slash Command 即時搜尋實戰</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-30-discord-bot-autocomplete-search</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-30-discord-bot-autocomplete-search</guid>
      <description>深入實作 Discord Autocomplete：在使用者輸入 option 的同時即時回傳建議，並用 /help command 做指令查詢。</description>
      <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Autocomplete</category>
      <category>Slash Commands</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot Modal：用彈出表單做完整回饋流程</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-29-discord-bot-modal-feedback</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-29-discord-bot-modal-feedback</guid>
      <description>用 ModalBuilder 和 TextInputBuilder 建一個可用的 /feedback 系統：使用者填表、Bot 發 Embed 到管理頻道、資料同步寫入 Google Sheets。</description>
      <pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Modal</category>
      <category>Google Sheets API</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>從本機到伺服器：Discord Bot 的 Docker 部署完整流程</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-28-discord-bot-docker-deploy</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-28-discord-bot-docker-deploy</guid>
      <description>用 process.on 攔截未捕獲的例外讓 Bot 自動重啟，以及用 Docker 做 dev/prod 雙環境部署，包含時區設定與 key 檔案的安全處理。</description>
      <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Docker</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Google Sheets 當後端？Discord Bot 的輕量資料層</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-27-discord-bot-architecture</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-27-discord-bot-architecture</guid>
      <description>用第一個實際功能串起整個 Bot 架構：用 Google Sheets 做資料層，建立每日簽到系統。管理員不用學 SQL，打開試算表就能操作。</description>
      <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Google Sheets API</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot Embed：用 EmbedBuilder 打造結構化訊息</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-26-discord-bot-embeds</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-26-discord-bot-embeds</guid>
      <description>discord.js v14 的 EmbedBuilder 完整指南：color、author、title、description、fields、thumbnail、image、footer、timestamp 一次全搞懂，加上即時預覽工具直接試玩。</description>
      <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot 下拉選單：StringSelectMenu 完整設計</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-25-discord-bot-select-menu</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-25-discord-bot-select-menu</guid>
      <description>discord.js v14 的 StringSelectMenu 怎麼建立靜態與動態選項、isStringSelectMenu() 事件處理，以及和 Button 的搭配使用場景。</description>
      <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>SelectMenu</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot 按鈕互動：ActionRow、ButtonBuilder 與事件處理</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-24-discord-bot-button-interactions</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-24-discord-bot-button-interactions</guid>
      <description>discord.js v14 怎麼在訊息裡附上按鈕：ActionRowBuilder 與 ButtonBuilder 的組合方式、ButtonStyle 的差異，以及 isButton() 事件怎麼路由到對應 handler。</description>
      <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Button</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>從一條指令到完整互動系統：Slash Commands 設計拆解</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-23-discord-bot-slash-commands</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-23-discord-bot-slash-commands</guid>
      <description>深入拆解 discord.js v14 的 Slash Commands 設計：指令定義、option 類型、靜態與動態選項、PermissionFlagsBits 權限控制，以及用 isButton / isStringSelectMenu / isChatInputCommand 實作三層互動分流。</description>
      <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Slash Commands</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>Discord Bot 怎麼從零開始：申請、設定、第一個 Slash Command</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-22-discord-bot-setup</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-22-discord-bot-setup</guid>
      <description>完全從零開始：到 Discord Developer Portal 申請 Bot、設定權證與 Intents、邀請 Bot 進伺服器、設定環境變數，最後用 discord.js 寫出第一個 Slash Command。</description>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>Discord.js</category>
      <category>Bot</category>
      <category>Node.js</category>
    </item>

    <item>
      <title>用 Vercel AI SDK v6 在 Next.js 加上 AI 聊天助手（免費用 Groq）</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-20-vercel-ai-sdk-chat</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-20-vercel-ai-sdk-chat</guid>
      <description>從零整合 Vercel AI SDK，搭配 Groq 免費 API，在 Next.js 部落格實作 streaming 聊天介面。解釋為什麼要用 SDK 而不是直接呼叫 API，以及實作過程中需要注意的 API 設計細節。</description>
      <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>Vercel AI SDK</category>
      <category>Groq</category>
      <category>React</category>
      <category>TypeScript</category>
    </item>

    <item>
      <title>個人 Blog 需要 GitHub Actions CI 嗎？我試了之後的結論</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-19-github-actions-ci</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-19-github-actions-ci</guid>
      <description>我在這個 Blog 加了 GitHub Actions CI，然後做了一個實驗。這篇記錄我從中得出的結論：Vercel 已經夠了，還有什麼時候才真正需要 CI。</description>
      <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
      <category>CI/CD</category>
      <category>GitHub Actions</category>
      <category>Next.js</category>
      <category>DevOps</category>
    </item>

    <item>
      <title>用 Canvas 做刮刮樂：destination-out 的原理與實現</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-11-scratch-card-canvas</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-11-scratch-card-canvas</guid>
      <description>透過 Canvas 的 globalCompositeOperation: destination-out，用三個核心步驟實現支援滑鼠與觸控的刮刮樂元件。</description>
      <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
      <category>前端</category>
      <category>Canvas</category>
      <category>React</category>
      <category>TypeScript</category>
    </item>

    <item>
      <title>用 requestAnimationFrame 實作可中途停止的轉盤</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-10-spin-wheel-raf</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-10-spin-wheel-raf</guid>
      <description>CSS transition 做不到中途停止。這篇從這個限制出發，說明 requestAnimationFrame 的逐幀控制思維，以及如何設計動態緩停算法，讓玩家可以自行決定何時停轉。</description>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>React</category>
      <category>Animation</category>
      <category>requestAnimationFrame</category>
    </item>

    <item>
      <title>從 jQuery 到 TypeScript：打造轉盤抽獎元件</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-09-spin-wheel-typescript</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-09-spin-wheel-typescript</guid>
      <description>記錄一個外包轉盤抽獎遊戲的重構歷程，從 jQuery DOM 操作，改寫成以 TypeScript 管理狀態、Canvas API 繪製輪盤、React 封裝互動元件。</description>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <category>JavaScript</category>
      <category>TypeScript</category>
      <category>React</category>
      <category>Canvas</category>
    </item>

    <item>
      <title>Next.js Blog 不靠後端的全文搜尋</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-08-nextjs-blog-search</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-08-nextjs-blog-search</guid>
      <description>介紹如何在 Next.js Blog 中實作純前端全文搜尋，不需要後端 API，直接在 Client Component 過濾文章。</description>
      <pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>搜尋</category>
      <category>React</category>
    </item>

    <item>
      <title>Next.js Blog 實作文章目錄（TOC）</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-07-nextjs-blog-toc</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-07-nextjs-blog-toc</guid>
      <description>介紹如何在 Next.js Blog 中從 MDX 文章自動產生 TOC 目錄，並用 IntersectionObserver 追蹤當前閱讀位置。</description>
      <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>MDX</category>
      <category>TOC</category>
    </item>

    <item>
      <title>Next.js Blog 加入程式碼高亮（Shiki + rehype-pretty-code）</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-06-nextjs-code-highlight</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-06-nextjs-code-highlight</guid>
      <description>介紹如何在 Next.js Blog 中加入程式碼高亮，使用 Shiki 與 rehype-pretty-code 提供更好的技術文章閱讀體驗。</description>
      <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>MDX</category>
      <category>Shiki</category>
      <category>rehype-pretty-code</category>
    </item>

    <item>
      <title>在 Next.js 使用 MDX 撰寫技術文章</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-05-nextjs-mdx-blog</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-05-nextjs-mdx-blog</guid>
      <description>介紹如何在 Next.js 專案中加入 MDX，建立可以撰寫技術文章的 Blog 系統。</description>
      <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>MDX</category>
      <category>Blog</category>
    </item>

    <item>
      <title>我是如何用 Next.js 打造這個技術 Blog</title>
      <link>https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-04-nextjs-blog-architecture</link>
      <guid isPermaLink="true">https://ray-blog-nine.vercel.app/dashboard/posts/2026-03-04-nextjs-blog-architecture</guid>
      <description>記錄這個 Blog 的技術架構，以及如何用 Next.js 開始建立自己的技術筆記網站。</description>
      <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <category>Blog</category>
    </item>
  </channel>
</rss>