<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>2026/08 on BenzHub</title><link>https://benzhub.github.io/archives/2026/08/</link><description>Recent content in 2026/08 on BenzHub</description><generator>Hugo</generator><language>zh-TW</language><lastBuildDate>Mon, 31 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://benzhub.github.io/archives/2026/08/index.xml" rel="self" type="application/rss+xml"/><item><title>shadcn/ui:複製貼上、你擁有原始碼的元件庫 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/031-shadcn-ui/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/031-shadcn-ui/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《無樣式元件庫》我們認識了 &lt;strong&gt;Radix + TailwindCSS&lt;/strong&gt; 這個「一個管行為、一個管樣式」的黃金組合——但每次都要自己逐一安裝原語、拼裝子元件、寫一堆 &lt;code&gt;data-*&lt;/code&gt; class,實在繁瑣。這一篇的主角 &lt;strong&gt;shadcn/ui&lt;/strong&gt; 就是解法:它把「&lt;strong&gt;Radix + Tailwind + &lt;code&gt;cva&lt;/code&gt; + &lt;code&gt;cn()&lt;/code&gt;&lt;/strong&gt;」整套打包成可&lt;strong&gt;複製貼上&lt;/strong&gt;、你&lt;strong&gt;完全擁有原始碼&lt;/strong&gt;的元件。它不是你 &lt;code&gt;npm install&lt;/code&gt; 的套件,而是用 CLI 把元件複製進你自己的 repo,從此想怎麼改都行。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workflows 持久化執行入門:崩潰也不重來 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/031-workflows-intro/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/031-workflows-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;Queues 批次、重試與 DLQ&lt;/strong&gt;》,我們把訊息佇列的容錯練到了生產級。但 Queues 有個天生的邊界:&lt;strong&gt;訊息即狀態,無法跨步驟保存進度,也不能睡眠等待&lt;/strong&gt;。當一件工作需要「&lt;strong&gt;跨越多個步驟、每步獨立保存結果、就算中途崩潰也能從斷點續跑&lt;/strong&gt;」時,你需要的是另一種更強的原語——&lt;strong&gt;Cloudflare Workflows&lt;/strong&gt; 提供的 &lt;strong&gt;durable execution(持久化執行)&lt;/strong&gt;。這一篇,我們就從零寫出第一個 Workflow,搞懂它為什麼「崩潰也不用重來」。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Queues 批次、重試與 DLQ:生產級容錯調校 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/030-queues-batch-retry-dlq/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/030-queues-batch-retry-dlq/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;Queues 訊息佇列入門&lt;/strong&gt;》,我們把 &lt;strong&gt;producer → queue → consumer&lt;/strong&gt; 的最小骨架搭了起來,學會用 &lt;code&gt;send()&lt;/code&gt; 送、用 &lt;code&gt;queue()&lt;/code&gt; handler 收。但那只是「能跑」;要在&lt;strong&gt;生產環境&lt;/strong&gt;穩穩扛住流量,你還需要三樣東西:懂得調&lt;strong&gt;批次(Batch)&lt;strong&gt;與&lt;/strong&gt;併發(Concurrency)&lt;strong&gt;來平衡吞吐與延遲、用&lt;/strong&gt;指數退避(Exponential Backoff)&lt;strong&gt;聰明重試、以及設一張接住失敗訊息的安全網——&lt;strong&gt;Dead Letter Queue(DLQ,死信佇列)&lt;/strong&gt;。這一篇,我們就把這些&lt;/strong&gt;容錯&lt;/strong&gt;能力一次補齊。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>無樣式元件庫:Headless UI、Radix、React Aria | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/030-headless-libraries/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/030-headless-libraries/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《元件庫》我們比較了 daisyUI、Flowbite 這些&lt;strong&gt;有樣式&lt;/strong&gt;元件庫——它們直接給你配好色的成品外觀,快,但外觀受制於預設。這一篇要走另一條路:&lt;strong&gt;無樣式(headless)&lt;/strong&gt; 元件庫只借「行為與無障礙邏輯」,視覺百分之百由你用 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 自己刷。我們會拆解為何 &lt;strong&gt;headless + Tailwind&lt;/strong&gt; 是黃金組合,比較 Tailwind 官方的 &lt;strong&gt;Headless UI&lt;/strong&gt;、業界最常見的 &lt;strong&gt;Radix UI&lt;/strong&gt;、以及無障礙最強的 Adobe &lt;strong&gt;React Aria&lt;/strong&gt;,並動手做出 Dropdown 與 Dialog。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Queues 訊息佇列入門:Worker 非同步解耦第一步 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/029-queues-intro/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/029-queues-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;DO 實戰:多人協作&lt;/strong&gt;》,我們把 &lt;strong&gt;Durable Objects&lt;/strong&gt; 的所有積木串成一個完整的即時系統,替「儲存資料」這條主線收了尾。這一篇,我們正式踏進&lt;strong&gt;非同步與工作流&lt;/strong&gt;的新章節:當一個請求要做的事太重、或有大量彼此獨立的背景工作要跑時,同步處理會拖垮回應速度。&lt;strong&gt;Cloudflare Queues&lt;/strong&gt; 就是那個「削峰填谷」的緩衝機制——它讓你的 &lt;strong&gt;Worker&lt;/strong&gt; 學會把耗時工作丟進&lt;strong&gt;訊息佇列(Message Queue)&lt;/strong&gt;,再由獨立的 &lt;strong&gt;consumer&lt;/strong&gt; 非同步批次消化,producer 與 consumer 徹底&lt;strong&gt;解耦&lt;/strong&gt;,又快又穩。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 元件庫比較:daisyUI、Flowbite、Preline 怎麼選 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/029-component-libraries/</link><pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/029-component-libraries/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們把 &lt;code&gt;cn()&lt;/code&gt;、&lt;code&gt;cva&lt;/code&gt; 這些&lt;strong&gt;最佳實踐&lt;/strong&gt;工具鏈織成了現代元件的骨架。這一篇往上一層:當你不想每個 Button、Modal 都從零刻起,&lt;strong&gt;元件庫(Component Libraries)&lt;/strong&gt; 就是別人已經替你組好、可以直接取用的成品。但市面上光是「有樣式」的 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 元件庫就有好幾套——官方付費的 Tailwind Plus、純 CSS 的 &lt;strong&gt;daisyUI&lt;/strong&gt;、帶互動的 &lt;strong&gt;Flowbite&lt;/strong&gt; 與 Preline。它們定位不同、取捨不同,選錯了地基,後面會很痛。這篇帶你把它們一次比清楚。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DO 實戰:多人協作聊天室從零打造 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/028-do-realtime-collab/</link><pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/028-do-realtime-collab/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;DO RPC 與跨物件呼叫&lt;/strong&gt;》,我們讓 &lt;strong&gt;Durable Object&lt;/strong&gt; 學會彼此型別安全地呼叫協作。這一篇是 &lt;strong&gt;DO&lt;/strong&gt; 的收尾實戰:我們要把前面學到的所有積木——&lt;strong&gt;WebSocket Hibernation&lt;/strong&gt; 廣播、&lt;strong&gt;SQLite Storage&lt;/strong&gt; 存訊息、&lt;strong&gt;Alarms&lt;/strong&gt; 排程清理、以及單執行緒一致性——全部串起來,用「&lt;strong&gt;每個房間一個 DO&lt;/strong&gt;」的架構,從零逐段 build 出一個真正能用的&lt;strong&gt;即時協作聊天室&lt;/strong&gt;。你會看到房間怎麼路由、連線怎麼管理與廣播、訊息怎麼持久化與回放、以及 **presence(在線名單)**怎麼同步。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 最佳實踐:clsx、tailwind-merge 與 cva 工具鏈 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/028-best-practices/</link><pubDate>Fri, 28 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/028-best-practices/</guid><description>&lt;blockquote&gt;
&lt;p&gt;一路學到這裡,你已經會抽元件、會處理暗色模式,能寫出規模化的 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 介面了。但「能跑」和「好維護」之間,還隔著一整套慣例:class 該怎麼排序才不製造 diff 噪音?條件式樣式怎麼寫才乾淨?兩個衝突的 class 誰勝出?變體一多怎麼管?這篇要把這些散落的經驗法則收攏成一套完整的&lt;strong&gt;最佳實踐&lt;/strong&gt;工具鏈——&lt;code&gt;prettier-plugin-tailwindcss&lt;/code&gt;、&lt;code&gt;clsx&lt;/code&gt;、&lt;code&gt;tailwind-merge&lt;/code&gt;、&lt;code&gt;cva&lt;/code&gt;,以及把它們縫在一起的 &lt;code&gt;cn()&lt;/code&gt; 工具,帶你把前面所學織成一套經得起團隊協作的工作流。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DO RPC 與跨物件呼叫:型別安全取代 fetch 手動路由 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/027-do-rpc/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/027-do-rpc/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;DO WebSocket Hibernation&lt;/strong&gt;》,我們讓 &lt;strong&gt;Durable Object&lt;/strong&gt; 能扛住成千上萬條長連線又不燒錢。這一篇,我們處理系統長大後的下一個問題:當 &lt;strong&gt;DO&lt;/strong&gt; 越來越多,它們之間、以及 &lt;strong&gt;Worker&lt;/strong&gt; 與 &lt;strong&gt;DO&lt;/strong&gt; 之間,該如何「互相呼叫、協調」?答案是 &lt;strong&gt;RPC(Remote Procedure Call,遠端程序呼叫)&lt;/strong&gt;。只要你的類別 &lt;code&gt;extends DurableObject&lt;/code&gt;,就能在上面定義 &lt;strong&gt;public 方法&lt;/strong&gt;,呼叫端拿到 &lt;strong&gt;stub&lt;/strong&gt; 後就像呼叫本地函式一樣 &lt;code&gt;await stub.method(args)&lt;/code&gt;,享有完整 &lt;strong&gt;TypeScript&lt;/strong&gt; 型別推斷——徹底取代過去用 &lt;code&gt;fetch&lt;/code&gt; 手動拼 URL、手動解析的繁瑣路由。你會學到 RPC 的型別安全、&lt;code&gt;structured clone&lt;/code&gt; 序列化規則、&lt;code&gt;RpcTarget&lt;/code&gt;、以及用 &lt;code&gt;WorkerEntrypoint&lt;/code&gt; 做 &lt;strong&gt;Service Bindings&lt;/strong&gt; 的 Worker↔Worker RPC。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 元件抽象模式:@apply、@utility 與框架元件三選一 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/027-component-patterns/</link><pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/027-component-patterns/</guid><description>&lt;blockquote&gt;
&lt;p&gt;一路學到這裡,你已經能寫出響應式、有狀態、還會明暗切換的介面——但你八成也發現一件事:同一顆按鈕、同一張卡片的那串 &lt;strong&gt;utility class&lt;/strong&gt;,在每個頁面都要再抄一遍,又臭又長還容易不一致。這篇 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 要解決的正是這個規模化痛點:&lt;strong&gt;重複的 class 該怎麼收斂?&lt;/strong&gt; 我們會把三種抽象策略——&lt;strong&gt;框架元件&lt;/strong&gt;、&lt;code&gt;@apply&lt;/code&gt;、v4 的 &lt;code&gt;@utility&lt;/code&gt;——攤開來對比,講清楚何時該抽象、何時該保持 utility inline,並釐清 &lt;code&gt;@apply&lt;/code&gt; 的正確與濫用時機。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DO WebSocket Hibernation:讓閒置連線省下計費 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/026-do-websocket-hibernation/</link><pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/026-do-websocket-hibernation/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;DO Alarms 定時器&lt;/strong&gt;》,我們替 &lt;strong&gt;Durable Object&lt;/strong&gt; 裝上了可靠、可重試的定時器,讓它能在未來某刻自己醒來做事。這一篇,我們碰 &lt;strong&gt;DO&lt;/strong&gt; 最招牌的能力:&lt;strong&gt;長時間持有 WebSocket 連線&lt;/strong&gt;。但有個關鍵陷阱——用「一般的 &lt;strong&gt;WebSocket&lt;/strong&gt;」寫法,DO 會為了等訊息而&lt;strong&gt;全程醒著計費&lt;/strong&gt;,就算連線整天閒著也一樣。&lt;strong&gt;Cloudflare&lt;/strong&gt; 為此設計了 &lt;strong&gt;WebSocket Hibernation(休眠)&lt;/strong&gt;:用 &lt;code&gt;ctx.acceptWebSocket&lt;/code&gt; 接受連線後,DO 能在空閒時&lt;strong&gt;釋放記憶體、暫停計費,但連線不斷&lt;/strong&gt;。你會學到 &lt;code&gt;acceptWebSocket&lt;/code&gt;、&lt;code&gt;webSocketMessage/Close/Error&lt;/code&gt; handlers、用 &lt;code&gt;serializeAttachment&lt;/code&gt; 跨休眠保存狀態,以及用 &lt;code&gt;getWebSockets()&lt;/code&gt; 廣播——讓大量閒置連線也能省下絕大部分成本。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 暗色模式:dark: 變體、v4 切換策略與 FOUC 完整解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/026-dark-mode/</link><pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/026-dark-mode/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前面幾篇我們把介面練得會隨螢幕伸縮、會回應使用者的每個動作,但畫面始終停在明亮的淺色底上。現代網站幾乎都得提供&lt;strong&gt;暗色模式(Dark Mode)&lt;/strong&gt;,讓使用者在夜間或偏好深色時獲得舒適的閱讀體驗。這一篇 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 的暗色模式,要用 &lt;code&gt;dark:&lt;/code&gt; 變體搭配三種策略(跟隨系統的 &lt;code&gt;media&lt;/code&gt;、手動切換的 &lt;code&gt;class&lt;/code&gt;、屬性驅動的 &lt;code&gt;data-*&lt;/code&gt;),再帶你用 &lt;strong&gt;v4&lt;/strong&gt; 的 &lt;code&gt;@custom-variant&lt;/code&gt; 打造一鍵切換、能記住偏好、又不會閃爍的明暗系統,讓你的介面在白天與黑夜都同樣好看。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DO Alarms 定時器:讓每個物件自己醒來做事 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/025-do-alarms/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/025-do-alarms/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;DO SQLite Storage&lt;/strong&gt;》,我們讓 &lt;strong&gt;Durable Object&lt;/strong&gt; 能建表、查詢、做原子交易,成了一個有結構的有狀態服務。但它還缺一種能力:&lt;strong&gt;在未來某個時間點「自己醒來」做事&lt;/strong&gt;。這一篇,我們深入 &lt;strong&gt;Cloudflare&lt;/strong&gt; 的 &lt;strong&gt;DO Alarms&lt;/strong&gt;——每個 &lt;strong&gt;Durable Object&lt;/strong&gt; 私有的&lt;strong&gt;定時器&lt;/strong&gt;。你會學到 &lt;code&gt;ctx.storage.setAlarm&lt;/code&gt; / &lt;code&gt;getAlarm&lt;/code&gt; / &lt;code&gt;deleteAlarm&lt;/code&gt; 與 &lt;code&gt;alarm()&lt;/code&gt; handler、如何用「在 alarm 內重新排程」實作&lt;strong&gt;週期性任務&lt;/strong&gt;、靠平台的&lt;strong&gt;自動重試&lt;/strong&gt;做到可靠執行、用&lt;strong&gt;去抖動批次聚合&lt;/strong&gt;省下大量寫入,並徹底分清 &lt;strong&gt;Alarms&lt;/strong&gt;(每實例)與 &lt;strong&gt;Cron Triggers&lt;/strong&gt;(全域)的差別。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 狀態變體:hover、group、peer 與 v4 has-* 全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/025-state-variants/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/025-state-variants/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們讓版面「隨螢幕大小伸縮」,但一個真正好用的介面還有另一半靈魂:&lt;strong&gt;同一個按鈕&lt;/strong&gt;,滑鼠移上去要變色、按下去要凹陷、鍵盤 focus 時要有外框、被禁用時要變灰。這一篇 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 的狀態變體(State Variants),要用 &lt;code&gt;hover:&lt;/code&gt;、&lt;code&gt;focus:&lt;/code&gt;、&lt;code&gt;active:&lt;/code&gt;、&lt;code&gt;disabled:&lt;/code&gt; 這組互動與表單前綴,加上 &lt;code&gt;group-*&lt;/code&gt;(父子連動)、&lt;code&gt;peer-*&lt;/code&gt;(兄弟連動),以及 &lt;strong&gt;v4&lt;/strong&gt; 新增的 &lt;code&gt;has-*&lt;/code&gt;(父依子)、&lt;code&gt;not-*&lt;/code&gt;、&lt;code&gt;in-*&lt;/code&gt; 與 &lt;code&gt;aria-*&lt;/code&gt;/&lt;code&gt;data-*&lt;/code&gt; 屬性變體,讓&lt;strong&gt;介面隨著使用者的每一個動作活起來&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DO SQLite Storage:每個物件內建的資料庫 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/024-do-sqlite-storage/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/024-do-sqlite-storage/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;Durable Objects 入門&lt;/strong&gt;》,我們用最簡單的 &lt;code&gt;ctx.storage.get&lt;/code&gt;/&lt;code&gt;put&lt;/code&gt; 讓計數器把值存下來。但那只是冰山一角——&lt;strong&gt;Cloudflare&lt;/strong&gt; 的每個 &lt;strong&gt;Durable Object&lt;/strong&gt; 其實都&lt;strong&gt;內建一個完整的 SQLite 資料庫&lt;/strong&gt;,能跑同步 &lt;strong&gt;SQL&lt;/strong&gt;、建索引、做原子&lt;strong&gt;交易&lt;/strong&gt;,而且讀寫延遲趨近於零。這一篇,我們深入 &lt;code&gt;ctx.storage&lt;/code&gt;:分清 &lt;strong&gt;KV-style API&lt;/strong&gt;(&lt;code&gt;get&lt;/code&gt;/&lt;code&gt;put&lt;/code&gt;)與 &lt;strong&gt;SQL API&lt;/strong&gt;(&lt;code&gt;ctx.storage.sql.exec&lt;/code&gt;)、學會用 &lt;code&gt;transactionSync&lt;/code&gt; 做原子交易、用 &lt;code&gt;new_sqlite_classes&lt;/code&gt; 啟用 SQLite backend,並把最重要的一個決策講透:&lt;strong&gt;DO+SQLite 與 D1 到底該怎麼分工&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 響應式設計:斷點、mobile-first 與容器查詢全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/024-responsive-design/</link><pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/024-responsive-design/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前面 23 篇我們把單一畫面「排得整齊、看得漂亮、用起來順手」,但真實世界的網頁必須同時面對手機、平板、桌機三種天差地遠的螢幕。這一篇 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 的響應式設計(Responsive Design),要用 &lt;code&gt;sm:&lt;/code&gt;、&lt;code&gt;md:&lt;/code&gt;、&lt;code&gt;lg:&lt;/code&gt;、&lt;code&gt;xl:&lt;/code&gt;、&lt;code&gt;2xl:&lt;/code&gt; 這組斷點(breakpoint)前綴,加上 &lt;strong&gt;mobile-first&lt;/strong&gt;(行動優先)哲學、v4 內建的 max-* 區間變體、任意斷點 &lt;code&gt;min-[...]&lt;/code&gt;,以及依「容器寬度」而非視窗寬度響應的容器查詢(container query)&lt;code&gt;@container&lt;/code&gt;,讓&lt;strong&gt;同一份程式碼,在所有螢幕上都呈現最佳樣貌&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Durable Objects 入門:邊緣上的有狀態協調 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/023-durable-objects-intro/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/023-durable-objects-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;D1 Time Travel 與備份&lt;/strong&gt;》我們為資料庫補上最後一道防線,也就此告別「資料表」的世界。這一篇,我們踏進 &lt;strong&gt;Cloudflare&lt;/strong&gt; 上更強大的&lt;strong&gt;有狀態運算&lt;/strong&gt;基元——&lt;strong&gt;Durable Objects(持久物件)&lt;/strong&gt;。無狀態的 &lt;strong&gt;Worker&lt;/strong&gt; 擅長處理獨立請求,卻無法讓多個用戶端「對同一份狀態」達成一致。&lt;strong&gt;Durable Objects&lt;/strong&gt; 用一個關鍵保證解決這件事:對同一個名稱,全球只有&lt;strong&gt;一個&lt;/strong&gt;活躍實例,並以&lt;strong&gt;單執行緒序列化&lt;/strong&gt;執行,天然消除競態條件。這篇是 DO 系列首篇,我們先把「什麼是 DO、為何需要它、怎麼取得並呼叫它」講透,寫出你的第一個計數器。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 互動性:cursor、scroll-snap、field-sizing 全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/023-interactivity/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/023-interactivity/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前幾篇我們把元素「排得整齊、看得漂亮」,這一篇要讓介面真正「用起來順手」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的互動性(Interactivity)工具,涵蓋 &lt;code&gt;cursor-*&lt;/code&gt;(游標樣式)、&lt;code&gt;pointer-events-*&lt;/code&gt;(指標事件穿透)、&lt;code&gt;select-*&lt;/code&gt;(文字選取)、&lt;code&gt;resize-*&lt;/code&gt;(縮放把手)、&lt;code&gt;scroll-smooth&lt;/code&gt; 與 &lt;code&gt;snap-*&lt;/code&gt;(滾動吸附輪播)、&lt;code&gt;touch-*&lt;/code&gt;(觸控行為)、以及 v4 新增的 &lt;code&gt;field-sizing-content&lt;/code&gt;(自動長高)、&lt;code&gt;scheme-*&lt;/code&gt;(配色宣告)、&lt;code&gt;accent-*&lt;/code&gt;(強調色)、&lt;code&gt;caret-*&lt;/code&gt;(游標色)、&lt;code&gt;will-change-*&lt;/code&gt;(渲染提示)與 &lt;code&gt;appearance-none&lt;/code&gt;(移除原生外觀)。這一組看似瑣碎的細節工具,正是把介面從「能操作」打磨到「好操作」的關鍵——&lt;strong&gt;讓每一次點擊、滑動、輸入都恰到好處&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>D1 Time Travel 與備份:時間點還原與災難復原 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/022-d1-time-travel/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/022-d1-time-travel/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;D1 Sessions API 與讀取複本&lt;/strong&gt;》,我們讓全球讀取又快又不失一致。但資料庫的日常從來不缺意外——手滑一個 &lt;code&gt;DROP TABLE&lt;/code&gt;、跑錯一條沒加 &lt;code&gt;WHERE&lt;/code&gt; 的 &lt;code&gt;UPDATE&lt;/code&gt;、一個壞掉的 &lt;strong&gt;migration&lt;/strong&gt; 把 schema 搞砸。這時你需要的是「時光倒流」。&lt;strong&gt;Cloudflare D1&lt;/strong&gt; 內建的 &lt;strong&gt;Time Travel(時間點還原)&lt;/strong&gt; 永遠啟用、免費,能把資料庫還原到&lt;strong&gt;過去 30 天&lt;/strong&gt;內任一時刻;搭配 &lt;code&gt;wrangler d1 export&lt;/code&gt;/&lt;code&gt;import&lt;/code&gt; 的&lt;strong&gt;匯出匯入&lt;/strong&gt;與 &lt;strong&gt;R2&lt;/strong&gt; 長期封存,就能建立起完整的&lt;strong&gt;備份、還原與災難復原&lt;/strong&gt;防線。這篇我們把 Time Travel 的 &lt;code&gt;info&lt;/code&gt;/&lt;code&gt;restore&lt;/code&gt;、書籤撤銷、匯出匯入,到災難復原流程一次講透,為 D1 系列收尾。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 表格與清單：table、list 響應式排版全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/022-tables-lists/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/022-tables-lists/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇讓元素「動起來、變好看」，這一篇要把視線轉向&lt;strong&gt;內容本身的結構化呈現&lt;/strong&gt;。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的表格與清單工具，涵蓋 &lt;code&gt;border-collapse&lt;/code&gt;／&lt;code&gt;border-separate&lt;/code&gt;（邊框合併或分離）、&lt;code&gt;border-spacing&lt;/code&gt;（儲存格間距）、&lt;code&gt;table-layout&lt;/code&gt;（&lt;code&gt;table-auto&lt;/code&gt;／&lt;code&gt;table-fixed&lt;/code&gt; 決定欄寬策略）、&lt;code&gt;caption-side&lt;/code&gt;（表格說明位置），以及清單的 &lt;code&gt;list-style-type&lt;/code&gt;（項目符號樣式）、&lt;code&gt;list-inside&lt;/code&gt;／&lt;code&gt;list-outside&lt;/code&gt;（符號位置）、&lt;code&gt;list-image&lt;/code&gt;（自訂圖片符號）。搭配 &lt;code&gt;overflow-x-auto&lt;/code&gt;、&lt;code&gt;divide-y&lt;/code&gt;、&lt;code&gt;truncate&lt;/code&gt; 這些老朋友，你就能打造出既專業又響應式的資料表與美化清單——&lt;strong&gt;讓內容從「能看」升級到「好讀」&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>D1 Sessions API 與讀取複本:全球低延遲讀取 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/021-d1-sessions-api/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/021-d1-sessions-api/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;D1 Migrations&lt;/strong&gt;》我們學會了像 &lt;strong&gt;Git&lt;/strong&gt; 一樣安全地演進資料表結構。但當你的應用擴張到全球、讀取流量湧入,新的問題浮現:主要資料庫(&lt;strong&gt;Primary&lt;/strong&gt;)在美國西部,新加坡的使用者每次讀取都要繞半個地球,延遲高得惱人。&lt;strong&gt;D1&lt;/strong&gt; 的 &lt;strong&gt;讀取複本(Read Replication)&lt;/strong&gt; 讓你在全球六個地區部署唯讀副本,使用者就近讀取;而 &lt;strong&gt;Sessions API&lt;/strong&gt; 則是啟用複本的鑰匙,並透過 &lt;strong&gt;書籤(Bookmark)&lt;/strong&gt; 機制,在「低延遲」與「一致性」這對天生矛盾之間取得平衡。這篇我們把 &lt;code&gt;env.DB.withSession()&lt;/code&gt; 的 &lt;code&gt;first-primary&lt;/code&gt; / &lt;code&gt;first-unconstrained&lt;/code&gt; 兩種模式、&lt;code&gt;read-your-writes&lt;/code&gt;(讀取自身寫入)、書籤的跨請求傳遞,以及成本與一致性的權衡一次講透。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 過渡與動畫：transition、animate 全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/021-transitions-animations/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/021-transitions-animations/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇讓元素學會了放大、旋轉、翻面，這一篇讓這些動作真正「流暢起來」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的過渡與動畫系統分成兩大支柱：&lt;strong&gt;transition&lt;/strong&gt;（過渡）負責把狀態切換（如 hover 變色、按鈕縮放）變得平順，由屬性（property）、時長（duration）、緩動（ease）、延遲（delay）四要素組成；&lt;strong&gt;animate&lt;/strong&gt; 則提供自主循環的動畫，內建 &lt;code&gt;animate-spin&lt;/code&gt;、&lt;code&gt;animate-ping&lt;/code&gt;、&lt;code&gt;animate-pulse&lt;/code&gt;、&lt;code&gt;animate-bounce&lt;/code&gt; 四種常用效果，並可透過 &lt;strong&gt;@theme&lt;/strong&gt; 搭配 &lt;code&gt;@keyframes&lt;/code&gt; 定義專屬動畫。而 &lt;strong&gt;v4&lt;/strong&gt; 更帶來 &lt;code&gt;@starting-style&lt;/code&gt; 進場動畫、&lt;code&gt;transition-discrete&lt;/code&gt; 離散屬性過渡，以及 &lt;code&gt;motion-safe&lt;/code&gt;／&lt;code&gt;motion-reduce&lt;/code&gt; 無障礙變體，讓動效既漂亮又體貼。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>D1 Migrations:用版本控制管理資料表結構 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/020-d1-migrations/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/020-d1-migrations/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;D1 入門:Serverless SQLite&lt;/strong&gt;》我們學會了在 Workers 裡用 SQL 建表、查資料、做交易。但真實專案的資料表結構不會一次定案:今天加個 &lt;code&gt;posts&lt;/code&gt; 表、明天幫 &lt;code&gt;users&lt;/code&gt; 加個欄位、後天補幾個索引。如果每次都手動 &lt;code&gt;wrangler d1 execute&lt;/code&gt; 一堆 SQL、還要用人腦記「本地套過沒、遠端套過沒」,遲早會亂。這就是 &lt;strong&gt;D1 Migrations(資料庫遷移)&lt;strong&gt;要解決的問題——它讓你像 &lt;strong&gt;Git&lt;/strong&gt; 管理程式碼一樣,把 &lt;strong&gt;schema&lt;/strong&gt; 的每一次變更變成&lt;/strong&gt;有編號、可追蹤、可重播、跨環境一致&lt;/strong&gt;的版本。這篇我們把 &lt;code&gt;wrangler d1 migrations create&lt;/code&gt; / &lt;code&gt;list&lt;/code&gt; / &lt;code&gt;apply&lt;/code&gt; 一路走完,含遷移檔命名順序、&lt;code&gt;--local&lt;/code&gt; vs &lt;code&gt;--remote&lt;/code&gt;、種子資料、CI 自動遷移,以及和 &lt;strong&gt;Drizzle ORM&lt;/strong&gt; 搭配的思路。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 變形 Transform：scale、rotate、3D 全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/020-transforms/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/020-transforms/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇替畫面裝上了「鏡頭」，這一篇讓元素真正「動起來」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的變形（&lt;strong&gt;Transform&lt;/strong&gt;）系統涵蓋 &lt;code&gt;scale&lt;/code&gt;（縮放）、&lt;code&gt;rotate&lt;/code&gt;（旋轉）、&lt;code&gt;translate&lt;/code&gt;（位移）、&lt;code&gt;skew&lt;/code&gt;（傾斜）四種 2D 變形，以及 &lt;code&gt;transform-origin&lt;/code&gt;（變形原點），讓你不改動版面就能放大、旋轉、位移、傾斜任何元素。而 &lt;strong&gt;v4&lt;/strong&gt; 更新增了一整套原生 3D 變形工具——&lt;code&gt;perspective&lt;/code&gt;、&lt;code&gt;rotate-x/y/z&lt;/code&gt;、&lt;code&gt;translate-z&lt;/code&gt;、&lt;code&gt;transform-3d&lt;/code&gt;、&lt;code&gt;backface&lt;/code&gt;——過去要靠自訂 CSS 才能做的卡片翻轉、3D 傾斜，現在用純 class 就能完成。搭配過渡（transition），變形正是 hover 放大、翻轉卡片、滑入動畫等互動效果的核心引擎。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>D1 入門:Serverless SQLite,在邊緣用 SQL 查資料,免管理資料庫 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/019-d1-intro/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/019-d1-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;R2 物件儲存&lt;/strong&gt;》我們把「大型檔案」搬上了雲,但很多應用真正需要的其實是&lt;strong&gt;結構化的關聯式資料&lt;/strong&gt;:使用者表、訂單表、商品表,要能用 &lt;strong&gt;SQL&lt;/strong&gt; 做 &lt;code&gt;JOIN&lt;/code&gt;、&lt;code&gt;WHERE&lt;/code&gt;、交易——這是 KV 和 R2 都不擅長的。這一塊,Cloudflare 交給了 &lt;strong&gt;D1&lt;/strong&gt;:一個底層是 &lt;strong&gt;SQLite&lt;/strong&gt;、跑在**邊緣(edge)**的 &lt;strong&gt;Serverless&lt;/strong&gt; 關聯式資料庫。這篇我們從什麼是 D1、怎麼用 &lt;code&gt;wrangler d1 create&lt;/code&gt; 建庫 + binding、&lt;code&gt;wrangler d1 execute&lt;/code&gt; 建表,到查詢核心 &lt;code&gt;prepare&lt;/code&gt; / &lt;code&gt;bind&lt;/code&gt; / &lt;code&gt;first&lt;/code&gt; / &lt;code&gt;all&lt;/code&gt; / &lt;code&gt;run&lt;/code&gt;、&lt;code&gt;batch&lt;/code&gt; 交易、參數化查詢防注入,以及本地 vs 遠端的差別,一路帶你在 Workers 裡用熟悉的 SQL 查資料。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 濾鏡：blur、backdrop-blur 毛玻璃全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/019-filters/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/019-filters/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇替版面點上了「光影」，這一篇替畫面裝上「鏡頭」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的濾鏡系統涵蓋 &lt;code&gt;filter&lt;/code&gt; 系列（&lt;code&gt;blur&lt;/code&gt; 模糊、&lt;code&gt;brightness&lt;/code&gt;／&lt;code&gt;contrast&lt;/code&gt; 明暗、&lt;code&gt;grayscale&lt;/code&gt;／&lt;code&gt;sepia&lt;/code&gt; 去色、&lt;code&gt;saturate&lt;/code&gt; 飽和度、&lt;code&gt;hue-rotate&lt;/code&gt; 色相、&lt;code&gt;invert&lt;/code&gt; 反色、&lt;code&gt;drop-shadow&lt;/code&gt; 輪廓陰影）與 &lt;code&gt;backdrop-filter&lt;/code&gt; 系列（&lt;code&gt;backdrop-blur&lt;/code&gt; 等，做出&lt;strong&gt;毛玻璃&lt;/strong&gt;效果）。這些工具讓你不改圖片檔本身，就能即時調色、模糊、做出玻璃擬態與影像級質感。v4 對這套系統做了關鍵簡化——濾鏡工具會自動組合、不再需要額外加 &lt;code&gt;filter&lt;/code&gt; class。這一篇會帶你替版面加上最後一層「鏡頭濾鏡」。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>R2 物件儲存:S3 相容、零 egress,存大檔不再被流量費坑 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/018-r2-storage/</link><pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/018-r2-storage/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;KV 進階:一致性與快取&lt;/strong&gt;》收尾時我們留了一個問題:KV 單值上限只有 &lt;strong&gt;25 MiB&lt;/strong&gt;,而且它根本不是為「大型二進位檔案」設計的。那圖片、影片、使用者上傳的文件這些又大又重的東西該存哪?答案就是 &lt;strong&gt;Cloudflare R2&lt;/strong&gt;——一個 &lt;strong&gt;S3 相容(S3-compatible)&lt;/strong&gt;、而且&lt;strong&gt;零 egress 費用&lt;/strong&gt;的物件儲存(object storage)。這篇我們從什麼是 R2、怎麼建 bucket + binding、&lt;code&gt;get&lt;/code&gt; / &lt;code&gt;put&lt;/code&gt; / &lt;code&gt;list&lt;/code&gt; / &lt;code&gt;delete&lt;/code&gt; 到 multipart 大檔上傳、&lt;code&gt;httpMetadata&lt;/code&gt;、presigned URL 直傳、公開存取與自訂網域,一路帶你把大檔搬上 R2,不再被流量費坑。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 陰影與效果：shadow、opacity、mix-blend 全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/018-shadows-effects/</link><pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/018-shadows-effects/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇替版面描好了「邊」與「角」，這一篇替每個區塊點上「光」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的陰影與效果系統涵蓋 &lt;code&gt;shadow-*&lt;/code&gt;（盒陰影）、&lt;code&gt;shadow-&amp;lt;color&amp;gt;&lt;/code&gt;（彩色陰影）、v4 全新的 &lt;code&gt;inset-shadow-*&lt;/code&gt;（內側陰影）與 &lt;code&gt;text-shadow-*&lt;/code&gt;（文字陰影），再加上 &lt;code&gt;opacity&lt;/code&gt;（不透明度）、&lt;code&gt;mix-blend-mode&lt;/code&gt;（混合模式）與 &lt;code&gt;bg-blend-*&lt;/code&gt;（背景混合）。這些工具是打造卡片層次、發光按鈕、玻璃擬態與品牌視覺的核心。v4 對這套系統動了幾刀——盒陰影刻度整體平移、新增 &lt;code&gt;inset-shadow-*&lt;/code&gt; 與 &lt;code&gt;text-shadow-*&lt;/code&gt;、陰影顏色可直接用 &lt;code&gt;/&lt;/code&gt; 透明度修飾符。這一篇會帶你替扁平的版面加上最關鍵的一層立體感。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>KV 進階:一致性與快取,把邊緣讀取用得又快又對 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/017-kv-advanced/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/017-kv-advanced/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《&lt;strong&gt;KV 鍵值儲存入門&lt;/strong&gt;》我們刻意在**最終一致性(eventual consistency)**上點到為止。這一篇,我們把它徹底拆開:寫入後究竟多久全球才會同步?為什麼連同一次請求裡讀都可能是舊值?&lt;code&gt;cacheTtl&lt;/code&gt; 怎麼調校邊緣快取?&lt;code&gt;expiration&lt;/code&gt; 與 &lt;code&gt;expirationTtl&lt;/code&gt; 差在哪?為什麼每個 &lt;strong&gt;key&lt;/strong&gt; 每秒只能寫 1 次,遇到高頻計數該怎麼辦?讀完這篇,你會把 &lt;strong&gt;Cloudflare KV&lt;/strong&gt; 從「會用」升級到「用得又快又對」。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 邊框：border、rounded 圓角、ring 焦點環全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/017-borders/</link><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/017-borders/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇替版面上好了「面」與「光」，這一篇替每個區塊「描邊、圓角、分隔」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的邊框系統涵蓋 &lt;code&gt;border&lt;/code&gt;（佔空間的邊框）、&lt;code&gt;rounded&lt;/code&gt;（圓角）、&lt;code&gt;ring&lt;/code&gt;（不佔空間的焦點環）、&lt;code&gt;outline&lt;/code&gt;（輪廓）與 &lt;code&gt;divide&lt;/code&gt;（子元素分隔線）五大類。v4 對這套系統動了幾刀——&lt;code&gt;border&lt;/code&gt; 預設色改成 &lt;code&gt;currentColor&lt;/code&gt;、&lt;code&gt;ring&lt;/code&gt; 預設寬度從 3px 降為 1px，還新增了獨立的 &lt;code&gt;inset-ring-*&lt;/code&gt; 內側環。這一篇會帶你把邊框、圓角與分隔線做得又俐落又有層次。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>KV 鍵值儲存入門:在邊緣讀寫資料的第一步 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/016-kv-intro/</link><pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/016-kv-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;到目前為止,我們寫的 &lt;strong&gt;Worker&lt;/strong&gt; 大多是「無狀態」的——處理完一個請求就忘光一切。但真實的應用需要&lt;strong&gt;記住資料&lt;/strong&gt;:使用者的設定、快取、feature flag、session……這些該存在哪?這一篇,我們正式進入 &lt;strong&gt;CF-3 儲存資料&lt;/strong&gt;,從 Cloudflare 最容易上手的邊緣儲存方案——&lt;strong&gt;Workers KV(Key-Value 鍵值儲存)&lt;/strong&gt; 開始。你會認識什麼是&lt;strong&gt;全球分散、讀取最佳化&lt;/strong&gt;的鍵值儲存、學會建立 &lt;strong&gt;namespace&lt;/strong&gt; 與 &lt;strong&gt;binding&lt;/strong&gt;、用 &lt;code&gt;get&lt;/code&gt; / &lt;code&gt;put&lt;/code&gt; / &lt;code&gt;list&lt;/code&gt; / &lt;code&gt;delete&lt;/code&gt; 讀寫資料、掌握 &lt;strong&gt;text / json / stream / arrayBuffer&lt;/strong&gt; 四種 value 型別與 &lt;code&gt;getWithMetadata&lt;/code&gt;,並釐清哪些場景最適合把資料交給 KV。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 背景與漸層：bg-linear、bg-radial、mask 遮罩全解 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/016-backgrounds-gradients/</link><pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/016-backgrounds-gradients/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇替版面上好了「色」，這一篇把單一顏色延伸成「面」與「光」。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 的背景工具組涵蓋背景色、背景圖，以及最迷人的&lt;strong&gt;漸層系統&lt;/strong&gt;。v4 把漸層語法整個翻新——&lt;code&gt;bg-linear-to-r&lt;/code&gt;（線性）、&lt;code&gt;bg-radial&lt;/code&gt;（徑向）、&lt;code&gt;bg-conic&lt;/code&gt;（錐形）三種漸層搭配 &lt;code&gt;from&lt;/code&gt;／&lt;code&gt;via&lt;/code&gt;／&lt;code&gt;to&lt;/code&gt; 色標與位置百分比，還新增了 &lt;code&gt;bg-linear-45&lt;/code&gt; 角度語法與一整組 &lt;code&gt;mask&lt;/code&gt; 遮罩工具。這一篇會帶你玩透背景與漸層，讓版面從「有顏色」進化到「有質感」。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>CI/CD 自動化部署:用 GitHub Actions + wrangler-action 打造無人值守發布流水線 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/015-cicd/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/015-cicd/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們把 &lt;strong&gt;漸進式部署&lt;/strong&gt; 講透,你已經能手動完成「上傳、放量、監控、回滾」一整套安全發布。但這些指令&lt;strong&gt;每次發布都要手動敲一遍&lt;/strong&gt;,既繁瑣又容易出錯。這一篇,我們就把它自動化——用 &lt;strong&gt;GitHub Actions&lt;/strong&gt; 搭配官方的 &lt;strong&gt;&lt;code&gt;cloudflare/wrangler-action&lt;/code&gt;&lt;/strong&gt;,把「&lt;strong&gt;push 程式碼 → 自動 lint/test → 自動部署&lt;/strong&gt;」串成一條無人值守的流水線。你會學會建立&lt;strong&gt;最小權限 API Token&lt;/strong&gt;、設定 &lt;strong&gt;&lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;CLOUDFLARE_ACCOUNT_ID&lt;/code&gt;&lt;/strong&gt; Secrets、寫出 &lt;strong&gt;staging/production 環境分流&lt;/strong&gt;的完整 workflow,並對比 Cloudflare 原生的 &lt;strong&gt;Workers Builds&lt;/strong&gt;。這是 &lt;strong&gt;CF-2 部署工具&lt;/strong&gt;系列的收尾篇。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 色彩系統：50–950 色階、OKLCH 與透明度速記 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/015-colors/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/015-colors/</guid><description>&lt;blockquote&gt;
&lt;p&gt;版面搭好了，是時候替它上色。&lt;strong&gt;TailwindCSS&lt;/strong&gt; 內建一套精心設計的調色盤：22 種色相、每種從 &lt;strong&gt;50 到 950&lt;/strong&gt; 共 11 個明度色階，透過 &lt;code&gt;text-*&lt;/code&gt;／&lt;code&gt;bg-*&lt;/code&gt;／&lt;code&gt;border-*&lt;/code&gt;／&lt;code&gt;ring-*&lt;/code&gt; 統一套用，還有一顆斜線就搞定的透明度速記（&lt;code&gt;bg-blue-500/50&lt;/code&gt;）。這一篇會帶你認識整套色階系統、v4 預設改用的 &lt;strong&gt;OKLCH&lt;/strong&gt; 廣色域、如何用 &lt;code&gt;@theme&lt;/code&gt; 打造品牌色，以及對比度與透明度的最佳實踐。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第十五篇，也是視覺樣式章（TW-4）的開場。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 常見版面模式：Holy Grail、Sticky Footer、置中與卡片網格 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/014-common-layouts/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/014-common-layouts/</guid><description>&lt;blockquote&gt;
&lt;p&gt;版面章走到這裡，你手上已經集滿了 &lt;strong&gt;Flexbox&lt;/strong&gt;、&lt;strong&gt;Grid&lt;/strong&gt;、定位、間距與尺寸五套工具。這一篇不再教新 utility，而是把它們&lt;strong&gt;串成真正能用的版面骨架&lt;/strong&gt;——垂直水平&lt;strong&gt;置中&lt;/strong&gt;、&lt;strong&gt;Sticky Footer&lt;/strong&gt; 黏底頁尾、&lt;strong&gt;Holy Grail&lt;/strong&gt;（三欄聖杯）、後台 &lt;strong&gt;Sidebar&lt;/strong&gt; 版面、響應式&lt;strong&gt;卡片網格&lt;/strong&gt;與 &lt;strong&gt;Media Object&lt;/strong&gt;。每一種都附上可直接貼進頁面執行的 &lt;strong&gt;TailwindCSS&lt;/strong&gt; v4 範例，並清楚說明何時該用 flex、何時該用 grid，讓你從「認得每顆工具」躍升到「一眼就知道該用哪套組合」。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第十四篇，也是版面章（TW-3）的收尾。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>漸進式部署與版本:用 wrangler versions 做金絲雀放量與一鍵 rollback | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/014-gradual-deployment/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/014-gradual-deployment/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們把&lt;strong&gt;環境管理&lt;/strong&gt;與 &lt;strong&gt;Secrets&lt;/strong&gt; 講透,結尾埋了一個大伏筆:Cloudflare 有一套「上傳新版本卻不立即全量上線」的安全發布機制。這一篇,我們就把它一次講透。你會弄懂 &lt;strong&gt;版本(Version)&lt;/strong&gt; 與 &lt;strong&gt;部署(Deployment)&lt;/strong&gt; 的本質差異,學會用 &lt;strong&gt;&lt;code&gt;wrangler versions upload&lt;/code&gt;&lt;/strong&gt; 把新版本上傳到「候補區」、用 &lt;strong&gt;&lt;code&gt;wrangler versions deploy&lt;/code&gt;&lt;/strong&gt; 按百分比做&lt;strong&gt;金絲雀(canary)放量&lt;/strong&gt;——先切 &lt;strong&gt;10%&lt;/strong&gt; 流量、搭配 &lt;strong&gt;observability&lt;/strong&gt; 監控錯誤率,確認無誤才逐步升到 &lt;strong&gt;100%&lt;/strong&gt;。出問題時,一行 &lt;strong&gt;&lt;code&gt;wrangler rollback&lt;/code&gt;&lt;/strong&gt; 一鍵回滾。讀完,你就能做到真正的「零停機、可觀察、可回滾」發布。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 尺寸系統：width、height、size-* 完整指南 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/013-sizing/</link><pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/013-sizing/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，&lt;strong&gt;尺寸系統（Sizing）&lt;/strong&gt; 決定了版面上每個元素到底該「多大」——按鈕多寬、頭像多高、容器最大寬度是多少、全螢幕區塊該用哪種高度單位。只要用 &lt;code&gt;w-*&lt;/code&gt;（&lt;code&gt;width&lt;/code&gt;）、&lt;code&gt;h-*&lt;/code&gt;（&lt;code&gt;height&lt;/code&gt;）控制寬高，用 &lt;code&gt;min-w-*&lt;/code&gt;／&lt;code&gt;max-w-*&lt;/code&gt;／&lt;code&gt;min-h-*&lt;/code&gt;／&lt;code&gt;max-h-*&lt;/code&gt; 設下上下限，再搭配 v4 新增的 &lt;code&gt;size-*&lt;/code&gt; 雙軸簡寫、分數寬度 &lt;code&gt;w-1/2&lt;/code&gt;、螢幕與容器單位 &lt;code&gt;w-full&lt;/code&gt;／&lt;code&gt;min-h-dvh&lt;/code&gt;，就能讓元素大小落在同一套一致刻度上。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第十三篇，我們會把寬、高、上下限、&lt;code&gt;size-*&lt;/code&gt;、內容尺寸與任意值一次講透，以 v4 為預設、標註與 v3 的差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>環境管理與 Secrets:staging/production 分流與 wrangler secret 安全實踐 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/013-environments-secrets/</link><pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/013-environments-secrets/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們把 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 從頭拆到尾,還埋下兩個伏筆:「敏感值不要放 &lt;code&gt;vars&lt;/code&gt;」與「用 &lt;code&gt;env&lt;/code&gt; 區分 staging 與 production」。這一篇,我們就把這兩件事一次講透。你會學到怎麼用 &lt;strong&gt;&lt;code&gt;env.staging&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;env.production&lt;/code&gt;&lt;/strong&gt; 設定塊搭配 &lt;code&gt;--env&lt;/code&gt; 參數把環境&lt;strong&gt;分流&lt;/strong&gt;,弄懂 &lt;strong&gt;&lt;code&gt;vars&lt;/code&gt;(明文)&lt;/strong&gt; 與 &lt;strong&gt;Secrets(加密)&lt;/strong&gt; 的本質差異,實作 &lt;strong&gt;&lt;code&gt;wrangler secret put&lt;/code&gt;&lt;/strong&gt; / &lt;code&gt;list&lt;/code&gt; / &lt;code&gt;delete&lt;/code&gt;、&lt;code&gt;.dev.vars&lt;/code&gt; 本地機密與 &lt;strong&gt;Secrets Store&lt;/strong&gt;,最後示範在 &lt;strong&gt;CI/CD&lt;/strong&gt; 中如何安全注入機密。讀完,你的 staging 與 production 就能各行其道、敏感資訊滴水不漏。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 間距系統：padding、margin、space、gap 完整指南 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/012-spacing/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/012-spacing/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，&lt;strong&gt;間距系統（Spacing）&lt;/strong&gt; 是決定版面「呼吸感」的靈魂——元素內部要留多少 &lt;code&gt;padding&lt;/code&gt;、彼此之間要隔多遠 &lt;code&gt;margin&lt;/code&gt;、一排子項要用什麼方式拉開，全靠這套工具。只要用 &lt;code&gt;p-*&lt;/code&gt;／&lt;code&gt;px-*&lt;/code&gt;／&lt;code&gt;py-*&lt;/code&gt; 控制內距、&lt;code&gt;m-*&lt;/code&gt;／&lt;code&gt;mx-auto&lt;/code&gt; 控制外距與置中、&lt;code&gt;space-x-*&lt;/code&gt;／&lt;code&gt;space-y-*&lt;/code&gt; 或 &lt;code&gt;gap-*&lt;/code&gt; 控制子元素間隔，就能把一個「擠成一團」的版面調成「疏密有致」。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第十二篇，我們會把 &lt;strong&gt;padding&lt;/strong&gt;、&lt;strong&gt;margin&lt;/strong&gt;、&lt;strong&gt;space&lt;/strong&gt; 與 &lt;strong&gt;gap&lt;/strong&gt; 一次講透，並帶你理解 v4 由單一 &lt;code&gt;--spacing&lt;/code&gt; 變數動態推導間距刻度的設計，以 v4 為預設、標註與 v3 的差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>wrangler.jsonc 設定完整解析:必填欄位、bindings 與 observability | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/012-wrangler-config/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/012-wrangler-config/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們用 &lt;code&gt;wrangler deploy&lt;/code&gt; 把 Worker 送上了邊緣,但那份決定 Worker &lt;strong&gt;名稱&lt;/strong&gt;、&lt;strong&gt;入口&lt;/strong&gt;、&lt;strong&gt;綁定&lt;/strong&gt;與&lt;strong&gt;相容性&lt;/strong&gt;的 &lt;code&gt;wrangler.jsonc&lt;/code&gt;,我們只匆匆帶過。這一篇,我們把這份設定檔&lt;strong&gt;從頭到尾徹底拆開&lt;/strong&gt;——先講清楚 &lt;code&gt;name&lt;/code&gt;、&lt;code&gt;main&lt;/code&gt;、&lt;code&gt;compatibility_date&lt;/code&gt;、&lt;code&gt;compatibility_flags&lt;/code&gt; 四大&lt;strong&gt;核心欄位&lt;/strong&gt;,再逐一示範 &lt;strong&gt;KV&lt;/strong&gt;、&lt;strong&gt;R2&lt;/strong&gt;、&lt;strong&gt;D1&lt;/strong&gt;、&lt;strong&gt;Durable Objects&lt;/strong&gt;、&lt;strong&gt;Queues&lt;/strong&gt;、&lt;strong&gt;AI&lt;/strong&gt;、&lt;code&gt;vars&lt;/code&gt; 各種 &lt;strong&gt;binding&lt;/strong&gt; 的宣告語法,接著帶你設定 &lt;code&gt;routes&lt;/code&gt;、&lt;code&gt;workers.dev&lt;/code&gt;、&lt;code&gt;observability&lt;/code&gt;、&lt;code&gt;assets&lt;/code&gt;、&lt;code&gt;triggers&lt;/code&gt;、&lt;code&gt;limits&lt;/code&gt;,最後比較 &lt;strong&gt;JSONC 與 TOML&lt;/strong&gt; 的差異。讀完你就能隨心所欲地設定自己的 Worker。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 定位系統：position、inset、z-index、sticky 完整指南 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/011-positioning/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/011-positioning/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，&lt;strong&gt;定位系統（Positioning）&lt;/strong&gt; 是讓元素「脫離正常文件流」、精準釘在畫面任意位置的關鍵工具——只要用 &lt;code&gt;relative&lt;/code&gt;、&lt;code&gt;absolute&lt;/code&gt;、&lt;code&gt;fixed&lt;/code&gt;、&lt;code&gt;sticky&lt;/code&gt; 決定定位模式，再用 &lt;code&gt;top&lt;/code&gt;／&lt;code&gt;right&lt;/code&gt;／&lt;code&gt;bottom&lt;/code&gt;／&lt;code&gt;left&lt;/code&gt;（或簡寫 &lt;code&gt;inset-*&lt;/code&gt;）指定偏移、&lt;code&gt;z-*&lt;/code&gt; 控制層疊順序，就能一組 utility 做出黏性導覽列、卡片徽章、下拉選單、彈窗遮罩這些過去得靠一整段 CSS 才能完成的疊層 UI。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第十一篇，我們會把 &lt;strong&gt;position&lt;/strong&gt; 五種模式、&lt;code&gt;inset&lt;/code&gt; 偏移、負值、&lt;strong&gt;z-index&lt;/strong&gt; 與堆疊脈絡、以及 &lt;strong&gt;sticky&lt;/strong&gt; 實務一次講透，並以 v4 為預設、標註與 v3 的差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Wrangler 入門:安裝、login、建專案、dev 與 deploy | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/011-wrangler-intro/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/011-wrangler-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前面十篇,我們把 &lt;strong&gt;Worker&lt;/strong&gt; 這顆運算核心從裡到外拆了個透徹——但那些程式碼要怎麼真正「跑起來、上線」?靠的就是 Cloudflare 的官方命令列工具:&lt;strong&gt;Wrangler&lt;/strong&gt;。這一篇是 &lt;strong&gt;CF-2 部署工具&lt;/strong&gt;系列的開篇,我們從零帶你走一遍:如何&lt;strong&gt;安裝 Wrangler&lt;/strong&gt;、用 &lt;code&gt;wrangler login&lt;/code&gt; &lt;strong&gt;登入帳號&lt;/strong&gt;、用 &lt;code&gt;npm create cloudflare&lt;/code&gt;(&lt;strong&gt;C3&lt;/strong&gt;)&lt;strong&gt;建立專案&lt;/strong&gt;、認識&lt;strong&gt;專案結構&lt;/strong&gt;、用 &lt;code&gt;wrangler dev&lt;/code&gt; &lt;strong&gt;本地開發&lt;/strong&gt;、用 &lt;code&gt;wrangler deploy&lt;/code&gt; &lt;strong&gt;一鍵部署&lt;/strong&gt;到邊緣,再帶你熟悉 &lt;code&gt;tail&lt;/code&gt;、&lt;code&gt;whoami&lt;/code&gt;、&lt;code&gt;versions&lt;/code&gt; 等&lt;strong&gt;常用指令&lt;/strong&gt;,以及 &lt;strong&gt;Wrangler v3/v4&lt;/strong&gt; 的版本差異。讀完這篇,你就能把前面學的一切,變成活生生跑在 Cloudflare 邊緣網路上的服務。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS Grid 完整指南：grid-cols、col-span、gap 二維版面一次搞懂 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/010-grid/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/010-grid/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，&lt;strong&gt;Grid&lt;/strong&gt; 是專為「二維版面」設計的排版引擎——只要對容器寫上 &lt;code&gt;grid&lt;/code&gt;，再用 &lt;code&gt;grid-cols-*&lt;/code&gt; 決定幾欄、&lt;code&gt;grid-rows-*&lt;/code&gt; 決定幾列、&lt;code&gt;col-span-*&lt;/code&gt; 讓子項跨欄、&lt;code&gt;gap-*&lt;/code&gt; 拉開間距，就能一組 utility 搭出相簿網格、儀表板、複雜頁面骨架這些過去得寫一大段 CSS 才能完成的版面。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第十篇，我們會把整套 Grid 工具類從容器到子項、從隱式軌道到 v4 全新的 subgrid 一次講透，並以 v4 為預設、標註與 v3 的差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers Bindings 與 Node.js 相容:用 env 宣告式連接資源、nodejs_compat 用 node: 模組 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/010-bindings-node-compat/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/010-bindings-node-compat/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前九篇,我們反覆用 &lt;code&gt;env&lt;/code&gt; 存取 &lt;strong&gt;KV&lt;/strong&gt;、&lt;strong&gt;D1&lt;/strong&gt;、&lt;strong&gt;Queue&lt;/strong&gt;,把它當成理所當然——但這個把 Cloudflare 服務「注入」進 &lt;strong&gt;Worker&lt;/strong&gt; 的機制,正是整個平台威力的核心。這一篇,我們正式拆解 &lt;strong&gt;Bindings&lt;/strong&gt;:什麼是 Binding(在 &lt;code&gt;wrangler.jsonc&lt;/code&gt; &lt;strong&gt;宣告式&lt;/strong&gt;連接資源,不用連線字串、不用金鑰)、&lt;code&gt;env&lt;/code&gt; 物件怎麼運作、&lt;strong&gt;KV / R2 / D1 / Durable Objects / Queues / AI / Service / Secrets&lt;/strong&gt; 各種 binding 的全貌、如何用 &lt;code&gt;wrangler types&lt;/code&gt; 自動生成 &lt;strong&gt;&lt;code&gt;Env&lt;/code&gt; interface&lt;/strong&gt; 型別,以及開啟 &lt;strong&gt;&lt;code&gt;nodejs_compat&lt;/code&gt;&lt;/strong&gt; flag 後,哪些 &lt;code&gt;node:&lt;/code&gt; 模組能用、哪些只是空殼。也徹底講清楚&lt;strong&gt;環境變數 vs Secrets vs Binding&lt;/strong&gt; 的差別。這一篇同時為我們的 &lt;strong&gt;CF-1 運算核心&lt;/strong&gt;收尾。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS Flexbox 完整指南：flex、justify、align、gap 一次搞定 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/009-flexbox/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/009-flexbox/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，&lt;strong&gt;Flexbox&lt;/strong&gt; 是最常用、也最值得先練熟的一維版面引擎——只要對容器寫上 &lt;code&gt;flex&lt;/code&gt;，再搭配 &lt;code&gt;justify-*&lt;/code&gt; 決定主軸怎麼分配、&lt;code&gt;items-*&lt;/code&gt; 決定交軸怎麼對齊、&lt;code&gt;gap-*&lt;/code&gt; 拉開間距、&lt;code&gt;flex-1&lt;/code&gt; 讓子項等分空間，就能一組 utility 搞定置中、等分、換行這些每天都在寫的版面需求。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第九篇，我們會把整套 Flexbox 工具類從容器到子項一次講透，並以 v4 為預設、標註與 v3 的差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers Cron Triggers 排程:scheduled handler 與 cron 表達式實戰 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/009-cron-triggers/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/009-cron-triggers/</guid><description>&lt;blockquote&gt;
&lt;p&gt;前幾篇我們的 &lt;strong&gt;Worker&lt;/strong&gt; 都是「被動」的——有人送請求上門,&lt;code&gt;fetch&lt;/code&gt; handler 才醒來做事。但真實世界有一大類任務是&lt;strong&gt;主動、定時&lt;/strong&gt;的:每天凌晨清掉過期資料、每小時同步一次匯率、每五分鐘寄一批待發的通知。這種「不靠人觸發、時間到就自己跑」的能力,靠的就是 &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 的 &lt;strong&gt;Cron Triggers&lt;/strong&gt;。這一篇我們深入排程:在 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 的 &lt;strong&gt;&lt;code&gt;triggers.crons&lt;/code&gt;&lt;/strong&gt; 設定 &lt;strong&gt;cron 表達式&lt;/strong&gt;、匯出 &lt;strong&gt;&lt;code&gt;scheduled(event, env, ctx)&lt;/code&gt;&lt;/strong&gt; handler、用 &lt;code&gt;event.cron&lt;/code&gt; 與 &lt;code&gt;scheduledTime&lt;/code&gt; 做多排程分流、以 &lt;strong&gt;&lt;code&gt;wrangler dev --test-scheduled&lt;/code&gt;&lt;/strong&gt; 在本地觸發測試,並講清楚 cron 為何一律吃 &lt;strong&gt;UTC&lt;/strong&gt;、為何一定要用 &lt;strong&gt;&lt;code&gt;ctx.waitUntil&lt;/code&gt;&lt;/strong&gt;、以及長任務何時該交棒給 &lt;strong&gt;Queues&lt;/strong&gt; 或 &lt;strong&gt;Workflows&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS Layout 與 Display：block、flex、grid、overflow、object-fit 全解析 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/008-layout-display/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/008-layout-display/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，&lt;strong&gt;Layout&lt;/strong&gt; 與 &lt;strong&gt;display&lt;/strong&gt; 是版面的骨架——&lt;code&gt;block&lt;/code&gt;、&lt;code&gt;inline&lt;/code&gt;、&lt;code&gt;flex&lt;/code&gt;、&lt;code&gt;grid&lt;/code&gt; 決定元素怎麼排列，&lt;code&gt;hidden&lt;/code&gt; 決定它出不出現，&lt;code&gt;overflow&lt;/code&gt; 決定內容溢出時怎麼處理，&lt;code&gt;object-fit&lt;/code&gt; 決定圖片如何填滿容器。這篇是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第八篇，也是版面章節（TW-3）的開場，我們會把這一整組「掌控排列方式」的工具類一次講透，並以 v4 為預設、標註每一項與 v3 的差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers WebSockets：WebSocketPair 與 101 升級實戰 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/008-websockets/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/008-websockets/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇《Streams 串流處理》讓資料「一直往下推」，但那是&lt;strong&gt;單向&lt;/strong&gt;的——伺服器推、客戶端只讀。當你需要&lt;strong&gt;雙方隨時互相說話&lt;/strong&gt;，做真正的即時互動（聊天室、多人協作、線上遊戲、即時通知），就得換上 &lt;strong&gt;WebSocket&lt;/strong&gt; 這把武器。這一篇我們深入 &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 的 WebSocket：從 &lt;code&gt;Upgrade: websocket&lt;/code&gt; 標頭與 &lt;strong&gt;101 升級握手&lt;/strong&gt;、&lt;code&gt;new WebSocketPair()&lt;/code&gt; 建立 client/server 一對連線、&lt;code&gt;server.accept()&lt;/code&gt; 接受連線、到 &lt;code&gt;message&lt;/code&gt; / &lt;code&gt;close&lt;/code&gt; 事件的處理，親手寫一個雙向 echo 伺服器。也會講清楚為什麼&lt;strong&gt;無狀態的 Worker&lt;/strong&gt; 撐不住多人廣播，該把棒子交給 &lt;strong&gt;Durable Objects&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 排版與文字完整指南：font 字體、text 字級、leading 行高、tracking 字距、text-wrap 與 v4 text-shadow、line-clamp、truncate | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/007-typography/</link><pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/007-typography/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 裡，排版（Typography）是你每天都會碰到的第一組工具類——字體、字級、行高、字距、字重、對齊、截斷，幾乎每個畫面元素都少不了。這篇是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第七篇，我們會把 &lt;code&gt;font-*&lt;/code&gt;、&lt;code&gt;text-*&lt;/code&gt;、&lt;code&gt;leading-*&lt;/code&gt;、&lt;code&gt;tracking-*&lt;/code&gt; 這些 &lt;strong&gt;text 工具類&lt;/strong&gt; 一次講透，包含 v4 新增的 &lt;code&gt;text-wrap&lt;/code&gt; 智慧換行與 &lt;code&gt;text-shadow&lt;/code&gt; 文字陰影，並帶你用可執行的範例把設計系統的字級 Token 真正落到畫面上。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers Streams 串流處理：邊收邊送與 SSE 實戰 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/007-streams/</link><pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/007-streams/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 中，當你要處理「很大」或「即時」的資料——代理一個上百 MB 的檔案、把 AI 模型逐字吐出的 token 即時推給前端——你不可能把整份資料塞進只有 128 MB 的記憶體。答案是 &lt;strong&gt;Streams（串流）&lt;/strong&gt;：讓資料像水一樣一段段流過，&lt;strong&gt;邊接收邊回傳&lt;/strong&gt;，記憶體裡任何時刻只留很小的一塊。這一篇我們深入 &lt;code&gt;ReadableStream&lt;/code&gt; / &lt;code&gt;WritableStream&lt;/code&gt; / &lt;code&gt;TransformStream&lt;/code&gt; 三大元件、&lt;code&gt;pipeThrough&lt;/code&gt; 與 &lt;code&gt;pipeTo&lt;/code&gt; 的接管、&lt;strong&gt;背壓（backpressure）&lt;/strong&gt; 的自動流量控制，以及怎麼用 &lt;strong&gt;SSE&lt;/strong&gt; 做 &lt;strong&gt;LLM 串流輸出&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS v4 遷移指南：從 v3 升級的破壞性變更、@tailwindcss/upgrade 自動遷移與漸進策略完整教學 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/006-v4-migration/</link><pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/006-v4-migration/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TailwindCSS&lt;/strong&gt; v4 是一次根本性的架構重設計：設定從 JavaScript 搬進 CSS、核心引擎用 Rust 重寫、&lt;code&gt;@tailwind&lt;/code&gt; 三行換成一行 &lt;code&gt;@import&lt;/code&gt;，還有一整批 utility 被系統性重新命名。這些&lt;strong&gt;破壞性變更（breaking changes）&lt;strong&gt;讓從 v3 直接升級不是「換個版本號」那麼簡單。這篇是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第六篇，我們把前幾篇散落的 v3/v4 差異收攏起來，帶你走一遍完整的 &lt;strong&gt;v4 遷移&lt;/strong&gt; 流程——從自動遷移工具 &lt;code&gt;npx @tailwindcss/upgrade&lt;/code&gt;、逐項破壞性變更對照，到大型專案的漸進&lt;/strong&gt;升級&lt;/strong&gt;策略。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers Cache API：邊緣快取完整實作 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/006-cache-api/</link><pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/006-cache-api/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 中，最迷人的效能武器之一就是 &lt;strong&gt;Cache API&lt;/strong&gt;——它讓你把運算結果直接快取在離使用者最近的&lt;strong&gt;邊緣節點&lt;/strong&gt;上，下一次同樣的請求進來，連運算和回源都省了，直接從邊緣秒回。這一篇我們深入 &lt;code&gt;caches.default&lt;/code&gt; 的三個核心方法、快取鍵怎麼設計、TTL 怎麼用 &lt;strong&gt;Cache-Control&lt;/strong&gt; 控制，以及為什麼 &lt;code&gt;ctx.waitUntil&lt;/code&gt; 是「非同步寫快取」的最佳拍檔。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 指令與函式全解析：@import、@layer、@apply、@utility 與 theme()/--alpha() 完整教學 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/005-directives-functions/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/005-directives-functions/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; v4 裡，指令（directives）與函式（functions）是你在 CSS 檔案裡「動用」設計系統的工具箱。從一行 &lt;strong&gt;&lt;code&gt;@import &amp;quot;tailwindcss&amp;quot;&lt;/code&gt;&lt;/strong&gt; 載入整套框架，到用 &lt;strong&gt;&lt;code&gt;@layer&lt;/code&gt;&lt;/strong&gt; 控制優先級、&lt;strong&gt;&lt;code&gt;@apply&lt;/code&gt;&lt;/strong&gt; 提取 utility、&lt;strong&gt;&lt;code&gt;@utility&lt;/code&gt;&lt;/strong&gt; 定義自訂 utility、&lt;strong&gt;&lt;code&gt;@custom-variant&lt;/code&gt;&lt;/strong&gt; 造出新變體，再到 &lt;code&gt;theme()&lt;/code&gt;、&lt;code&gt;--alpha()&lt;/code&gt;、&lt;code&gt;--spacing()&lt;/code&gt; 這些函式取用 Token——這篇是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第五篇，帶你一次看懂 v4 的指令與函式語彙，並標註它與 v3 的關鍵差異。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers Request 與 Response：處理 HTTP 請求與回應 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/005-request-response/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/005-request-response/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 的世界裡，每一次請求最終都歸結為兩個物件:進來的 &lt;strong&gt;Request&lt;/strong&gt; 與回去的 &lt;strong&gt;Response&lt;/strong&gt;。這一篇我們深入 &lt;strong&gt;fetch handler&lt;/strong&gt; 最核心的這兩個角色——請求進來長什麼樣、回應怎麼構造、Headers 與 Body 如何操作、如何依 path 與 method 路由，以及 &lt;code&gt;request.cf&lt;/code&gt; 與 &lt;code&gt;ctx.waitUntil&lt;/code&gt; 這兩個 Workers 專屬的實用工具。全部基於 Web 標準 API。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 配置系統：@theme CSS-first 設定完整解析與 tailwind.config.js 遷移 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/004-configuration/</link><pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/004-configuration/</guid><description>&lt;blockquote&gt;
&lt;p&gt;在 &lt;strong&gt;TailwindCSS&lt;/strong&gt; v4 裡，「配置」不再是一個獨立的 JavaScript 檔案，而是直接寫進你的 CSS。核心是 &lt;strong&gt;&lt;code&gt;@theme&lt;/code&gt;&lt;/strong&gt; 指令——你在裡面定義的每一個設計 Token，會同時變成一個 &lt;strong&gt;CSS 變數&lt;/strong&gt;，並自動生成對應的 utility class。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第四篇，帶你看懂 &lt;code&gt;@theme&lt;/code&gt; 如何運作、&lt;code&gt;extend&lt;/code&gt; 擴充與覆寫的分界、常見設定項的命名空間規則，以及如何從 &lt;code&gt;tailwind.config.js&lt;/code&gt; 的思維遷移過來。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Workers 定價與限制：CPU time 計費與省錢技巧 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/004-pricing-limits/</link><pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/004-pricing-limits/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 的執行模型看懂了，接下來就要把它換算成兩件實際的事:&lt;strong&gt;要付多少錢、能做到哪裡為止。&lt;/strong&gt; 這一篇我們把 Free 與 Paid 方案的請求數、CPU 時間、記憶體、bundle 大小、子請求數每一條線畫清楚，解釋 &lt;strong&gt;CPU time&lt;/strong&gt; 計費為何只算運算、不算等待，並教你怎麼估成本、怎麼避開超限。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 類別偵測機制：內容掃描、safelist 與動態 class 陷阱完整解析 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/003-class-detection/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/003-class-detection/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TailwindCSS&lt;/strong&gt; 最讓新手困惑的一件事，往往是「我明明寫了 class，樣式卻憑空消失」。答案藏在它的&lt;strong&gt;類別偵測（class detection）&lt;strong&gt;機制裡——Tailwind 靠的是&lt;/strong&gt;內容掃描（content scanning）&lt;/strong&gt;，一種字串層級的搜尋，而不是執行你的程式碼。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第三篇，帶你看懂掃描器怎麼「讀」你的原始碼，並徹底避開 &lt;code&gt;text-${color}&lt;/code&gt; 這類動態拼接的陷阱。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>V8 Isolates 執行模型：Workers 為何近乎零冷啟動 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/003-v8-isolates/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/003-v8-isolates/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 之所以能做到近乎零的冷啟動、驚人的部署密度，以及那些看似奇怪的行為限制，答案全都藏在一個核心設計裡——&lt;strong&gt;V8 Isolates&lt;/strong&gt;。這一篇我們掀開引擎蓋，看懂 Isolate 到底是什麼、它憑什麼比容器快上百倍、多租戶如何安全共享同一個進程，以及為什麼你不能把模組層變數當狀態用。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>TailwindCSS 架構與 Oxide 引擎：JIT、Rust 與 CSS 處理管線完整解析 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/002-architecture-jit-oxide/</link><pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/002-architecture-jit-oxide/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TailwindCSS v4&lt;/strong&gt; 最大的改變不在你寫的 class，而在你看不到的引擎。這篇文章帶你打開引擎蓋，看看以 &lt;strong&gt;Rust&lt;/strong&gt; 重寫的 &lt;strong&gt;Oxide&lt;/strong&gt; 引擎如何運作：它怎麼掃描你的原始碼、按需產生 CSS，又為什麼建構速度能比 v3 快上一個數量級。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第二篇，也是理解整個框架運作原理的關鍵。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>第一個 Worker：從建立到部署上線 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/002-first-worker/</link><pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/002-first-worker/</guid><description>&lt;blockquote&gt;
&lt;p&gt;上一篇我們鳥瞰了整片地圖，這一篇正式動手。我們會用 &lt;code&gt;npm create cloudflare&lt;/code&gt; 建立專案，看懂 &lt;strong&gt;export default&lt;/strong&gt; 裡的 &lt;strong&gt;fetch&lt;/strong&gt; handler，用 &lt;strong&gt;wrangler&lt;/strong&gt; dev 在本地跑起來，最後把你的第一個 &lt;strong&gt;Cloudflare Worker&lt;/strong&gt; 部署到全球邊緣網路，並觀察每一個進來的 &lt;strong&gt;request&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Cloudflare 開發者平台總覽：邊緣運算與 Workers 入門 | Cloudflare 完整教學</title><link>https://benzhub.github.io/post/cloudflare/001-platform-overview/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/cloudflare/001-platform-overview/</guid><description>&lt;blockquote&gt;
&lt;p&gt;這是 &lt;strong&gt;Cloudflare 完整教學&lt;/strong&gt;系列的第一篇。在正式動手寫 &lt;strong&gt;Worker&lt;/strong&gt; 之前，我們先鳥瞰整片地圖：什麼是&lt;strong&gt;邊緣運算（Edge Computing）&lt;/strong&gt;、為什麼 &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; 值得你投入、&lt;strong&gt;V8 Isolates&lt;/strong&gt; 如何做到近乎零的冷啟動，以及 &lt;strong&gt;Bindings&lt;/strong&gt; 生態如何把 &lt;strong&gt;KV&lt;/strong&gt;、&lt;strong&gt;R2&lt;/strong&gt;、&lt;strong&gt;D1&lt;/strong&gt;、&lt;strong&gt;Durable Objects&lt;/strong&gt;、&lt;strong&gt;Queues&lt;/strong&gt; 與 &lt;strong&gt;AI&lt;/strong&gt; 串成一個完整的開發者平台。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Utility-First 是什麼？TailwindCSS 核心哲學完整解析 | TailwindCSS 完整教學</title><link>https://benzhub.github.io/post/tailwindcss/001-utility-first-philosophy/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><guid>https://benzhub.github.io/post/tailwindcss/001-utility-first-philosophy/</guid><description>&lt;blockquote&gt;
&lt;p&gt;為什麼 &lt;strong&gt;TailwindCSS&lt;/strong&gt; 要你在 HTML 裡塞一堆像 &lt;code&gt;p-4&lt;/code&gt;、&lt;code&gt;bg-white&lt;/code&gt;、&lt;code&gt;rounded-lg&lt;/code&gt; 的小 class，而不是好好寫一個 &lt;code&gt;.card&lt;/code&gt;？這篇文章帶你理解 &lt;strong&gt;Utility-First&lt;/strong&gt; 這套核心哲學：它如何顛覆傳統的「關注點分離」，解決了哪些真實痛點，又付出了什麼代價。這是 &lt;strong&gt;TailwindCSS 完整教學&lt;/strong&gt; 系列的第一篇，也是理解整個框架的思維起點。&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>