<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Cloudflare on 我的博客</title>
    <link>/tags/cloudflare/</link>
    <description>Recent content in Cloudflare on 我的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 09 Nov 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/tags/cloudflare/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>整咗個 Cloudflare 多人電子白板</title>
      <link>/posts/2026-11-09-cf-whiteboard/</link>
      <pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate>
      <guid>/posts/2026-11-09-cf-whiteboard/</guid>
      <description>&lt;p&gt;用 Cloudflare Workers + Durable Objects 寫咗個&lt;strong&gt;多人實時電子白板&lt;/strong&gt;，開個房間、把連結發出去，大家就可以一齊畫。&lt;/p&gt;
&lt;p&gt;源碼開放喺 GitHub：&lt;a href=&#34;https://github.com/crazysarah/cf-whiteboard&#34;&gt;crazysarah/cf-whiteboard&lt;/a&gt;，&lt;code&gt;wrangler deploy&lt;/code&gt; 一分鐘就開到自己嗰塊板。用法：房間名放喺 hash（&lt;code&gt;https://&amp;lt;你的域&amp;gt;/#房間名&lt;/code&gt;），同一個 hash 就係同一塊板。&lt;/p&gt;
&lt;h2 id=&#34;點解要自己寫一個&#34;&gt;點解要自己寫一個&lt;/h2&gt;
&lt;p&gt;市面嘅白板工具（Miro、Excalidrawlive 嗰啲）要麼要註冊、要麼有牆。自己寫一個：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;零註冊&lt;/strong&gt;：開連結就畫，房間名即開即用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一個房間 = 一個 Durable Object&lt;/strong&gt;：DO 係全球單實例強一致，天生就啱做房間狀態&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebSocket 用 Hibernation API&lt;/strong&gt;：空房間唔佔 CPU 時間，hibernated 狀態免費——唔使驚養個白板燒錢&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;筆畫歷史存 DO 內置 SQLite&lt;/strong&gt;：每 3 筆落盤，重新打開仲喺度（上限 5000 筆，舊嘅自動清）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截圖直接貼上牆&lt;/strong&gt;：方便貼參考圖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一邊傾一邊畫&lt;/strong&gt;：WebRTC 語音 P2P，DO 只轉發 SDP/ICE 信令，媒體流唔過 CF——&lt;strong&gt;零成本&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;架構一句話&#34;&gt;架構一句話&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/room/&amp;lt;name&amp;gt;&lt;/code&gt; 路由到同名 Durable Object；WebSocket 常駐但 hibernated（唔使 CPU 時間）；歷史入 SQLite；語音走 P2P 信令通道。&lt;/p&gt;
&lt;h2 id=&#34;已知取捨&#34;&gt;已知取捨&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;清空係廣播式：任何人按清空，全房清掉（undo 栈留返做後續）&lt;/li&gt;
&lt;li&gt;坐標係視口坐標，唔同屏幕比例睇到嘅畫面比例可能唔同（縮放適配後續加）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有興趣可以直接開個房試下，或者攞源碼去 &lt;code&gt;wrangler deploy&lt;/code&gt; 一分鐘開埋自己嗰塊板。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
