<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant">
  <title>光輝咖碼</title>
  <subtitle>沒有一杯咖啡解決不了的問題；如果有，就交給 AI 吧。這裡分享網站架設、前端開發與各種技術筆記，然後再來一杯。</subtitle>
  <link href="https://kamadiam.com/feed/feed.xml" rel="self" />
  <link href="https://kamadiam.com/" />
  <updated>2026-08-15T04:29:10Z</updated>
  <id>https://kamadiam.com/</id>
  <author>
    <name>huihere</name>
  </author>
  <entry>
    <title>Mac 開發者必裝工具清單：Homebrew 起步的開發環境</title>
    <link href="https://kamadiam.com/mac-developer-tools-checklist/" />
    <updated>2026-08-15T04:29:10Z</updated>
    <id>https://kamadiam.com/mac-developer-tools-checklist/</id>
    <content type="html">&lt;p&gt;換新 Mac 那天，桌面乾淨得像剛泡好的美式——然後你打開瀏覽器搜「Mac 開發者必裝」，結果跳出二十篇清單，有的推付費 IDE，有的還在推 2018 年的老朋友，還有人把「剪貼簿歷史」跟「能 &lt;code&gt;git push&lt;/code&gt;」混成同一袋雜貨。&lt;p&gt;咖啡還沒涼，PATH 已經亂了。&lt;p&gt;這篇不會把你的 Dock 塞滿可愛圖示。目標比較務實：&lt;strong&gt;先裝一套「能寫程式、能 deploy」的最小組合&lt;/strong&gt;。主角是 &lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew&lt;/a&gt;（套件總管），其餘依你的技術棧加減。想把 Homebrew 挖深一點，站內另有 &lt;a href=&quot;https://kamadiam.com/homebrew-tutorial/&quot;&gt;Homebrew 完全教學&lt;/a&gt;；若你要的是剪貼簿、截圖這類一般生產力工具，舊文 &lt;a href=&quot;https://kamadiam.com/mac-useful-tools/&quot;&gt;Mac 生產力工具推薦&lt;/a&gt; 還在——那邊比較像生活瑞士刀，這邊比較像開工工具箱。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E5%85%88%E5%95%8F%E4%BD%A0%E6%98%AF%E5%93%AA%E4%B8%80%E7%A8%AE%E9%96%8B%E7%99%BC%E8%80%85?&quot;&gt;先問：你是哪一種開發者？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E5%88%86%E9%A1%9E%E6%B1%BA%E7%AD%96%E8%A1%A8&quot;&gt;分類決策表&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E6%9C%80%E5%B0%8F%E5%AE%89%E8%A3%9D-SOP&quot;&gt;最小安裝 SOP&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E4%BE%9D%E6%8A%80%E8%A1%93%E6%A3%A7%E7%9A%84%E7%AC%AC%E4%BA%8C%E8%BC%AA%E5%8A%A0%E8%A3%9D&quot;&gt;依技術棧的第二輪加裝&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E5%B8%B8%E8%A6%8B%E5%95%8F%E9%A1%8C&quot;&gt;常見問題&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E6%94%B6%E5%80%8B%E5%B0%BE&quot;&gt;收個尾&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/mac-developer-tools-checklist/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先問你是哪一種開發者?&quot;&gt;先問：你是哪一種開發者？&lt;/h2&gt;&lt;p&gt;工具清單最容易變成「別人的夢想裝備」。先對號入座，比較不會一次裝到後悔。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的主戰場&lt;th&gt;優先裝的類別&lt;th&gt;可先跳過&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;前端／靜態站（11ty、Astro）&lt;td&gt;Homebrew、Node（&lt;code&gt;brew install node&lt;/code&gt;）、編輯器、Git、&lt;code&gt;gh&lt;/code&gt;&lt;td&gt;容器（初期多半用不到）&lt;tr&gt;&lt;td&gt;全端／API&lt;td&gt;同上 + 容器（Docker／OrbStack）、HTTP 除錯&lt;td&gt;—&lt;tr&gt;&lt;td&gt;多語言（Python + Node + Go）&lt;td&gt;Homebrew + &lt;strong&gt;mise&lt;/strong&gt;（要多版本時）或 &lt;code&gt;brew install node&lt;/code&gt;／&lt;code&gt;uv&lt;/code&gt;&lt;td&gt;一次裝太多 CLI 美化外掛&lt;tr&gt;&lt;td&gt;剛入門、方向還沒定&lt;td&gt;Homebrew、Git、VS Code、一個終端機、&lt;code&gt;brew install node&lt;/code&gt;&lt;td&gt;容器、進階 shell 主題&lt;/table&gt;&lt;p&gt;白話一句：先讓「能寫、能存、能推」通電；霓虹提示列等美化功能可以之後再加。&lt;h2 id=&quot;分類決策表&quot;&gt;分類決策表&lt;/h2&gt;&lt;p&gt;下面這張表像超市走道標示：你知道自己要牛奶，就不必把整排零食搬回家。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;類別&lt;th&gt;推薦工具&lt;th&gt;適用情境&lt;th&gt;替代方案&lt;th&gt;費用&lt;th&gt;學習曲線&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;套件管理（必裝）&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Homebrew&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;幾乎所有 CLI 與多數 App 的一鍵安裝&lt;td&gt;MacPorts（較少人用）&lt;td&gt;免費&lt;td&gt;低 — 記 &lt;code&gt;brew install&lt;/code&gt; 即可&lt;tr&gt;&lt;td&gt;&lt;strong&gt;終端機&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://ghostty.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Ghostty&lt;/strong&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;iTerm2&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;日常 shell、SSH、長時間開發&lt;td&gt;Warp（AI 工作流）、WezTerm（跨平台）&lt;td&gt;免費&lt;td&gt;低～中&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Shell 提示與搜尋&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://starship.rs/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Starship&lt;/strong&gt;&lt;/a&gt; + &lt;a href=&quot;https://github.com/junegunn/fzf&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;fzf&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;提示列顯示 Git 分支／版本；模糊搜檔案與歷史&lt;td&gt;Powerlevel10k、純 zsh&lt;td&gt;免費&lt;td&gt;低&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLI 必備&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://git-scm.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;git&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://cli.github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;gh&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://jqlang.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;jq&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;ripgrep&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;版本控制、GitHub PR、JSON 過濾、專案內搜字&lt;td&gt;內建 &lt;code&gt;grep&lt;/code&gt;（通常比較慢）&lt;td&gt;免費&lt;td&gt;低～中&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLI 加分（選裝）&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/sharkdp/bat&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;bat&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://eza.rocks/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;eza&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://github.com/sharkdp/fd&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;fd&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://httpie.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;httpie&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;彩色 &lt;code&gt;cat&lt;/code&gt;、現代 &lt;code&gt;ls&lt;/code&gt;、快 &lt;code&gt;find&lt;/code&gt;、友善 HTTP 測試&lt;td&gt;&lt;code&gt;cat&lt;/code&gt;／&lt;code&gt;ls&lt;/code&gt;／&lt;code&gt;curl&lt;/code&gt;&lt;td&gt;免費&lt;td&gt;低&lt;tr&gt;&lt;td&gt;&lt;strong&gt;編輯器／IDE&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;VS Code&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;通用、擴充多、免費夠用&lt;td&gt;&lt;a href=&quot;https://www.cursor.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/a&gt;（AI 輔助）、Zed、Neovim&lt;td&gt;VS Code 免費；Cursor 有免費額度&lt;td&gt;低～高（看工具）&lt;tr&gt;&lt;td&gt;&lt;strong&gt;執行環境版本&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://nodejs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Node&lt;/strong&gt;&lt;/a&gt;（&lt;code&gt;brew install node&lt;/code&gt;）&lt;td&gt;前端／11ty 最小可用&lt;td&gt;專案要多版本時再用 &lt;a href=&quot;https://fnm.vercel.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;fnm&lt;/strong&gt;&lt;/a&gt;／&lt;a href=&quot;https://mise.jdx.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;mise&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;免費&lt;td&gt;低（多版本才變中）&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Python 環境&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://docs.astral.sh/uv/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;uv&lt;/strong&gt;&lt;/a&gt; 或 &lt;code&gt;python&lt;/code&gt; + &lt;strong&gt;venv&lt;/strong&gt;&lt;td&gt;腳本、爬蟲、AI 工具鏈&lt;td&gt;Conda（資料科學向）&lt;td&gt;免費&lt;td&gt;中&lt;tr&gt;&lt;td&gt;&lt;strong&gt;版本控制 GUI（選裝）&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://git-fork.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Fork&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://desktop.github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;GitHub Desktop&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;不想記指令時看 diff／分支&lt;td&gt;純 CLI &lt;code&gt;git&lt;/code&gt; + &lt;code&gt;lazygit&lt;/code&gt;&lt;td&gt;Fork 買斷；Desktop 免費&lt;td&gt;低&lt;tr&gt;&lt;td&gt;&lt;strong&gt;容器&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://orbstack.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;OrbStack&lt;/strong&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;跑資料庫、測試部署映像、跟團隊一致環境&lt;td&gt;雲端 dev container、先不用容器&lt;td&gt;OrbStack 個人免費；Docker 有免費方案&lt;td&gt;中～高&lt;tr&gt;&lt;td&gt;&lt;strong&gt;API／除錯&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://www.postman.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Postman&lt;/strong&gt;&lt;/a&gt; 或 &lt;a href=&quot;https://httpie.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;httpie&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;測 REST、看回應標頭&lt;td&gt;curl、Insomnia&lt;td&gt;Postman 有免費層&lt;td&gt;低&lt;tr&gt;&lt;td&gt;&lt;strong&gt;視窗／啟動器&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://rectangleapp.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Rectangle&lt;/strong&gt;&lt;/a&gt;、&lt;a href=&quot;https://www.raycast.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Raycast&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;分屏寫 code + 預覽；快捷啟動專案&lt;td&gt;macOS 內建、Alfred&lt;td&gt;Rectangle 免費；Raycast 免費夠用&lt;td&gt;低&lt;tr&gt;&lt;td&gt;&lt;strong&gt;安全（建議）&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://go.getproton.me/aff_c?offer_id=26&amp;amp;aff_id=14397&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Proton VPN&lt;/strong&gt;&lt;/a&gt;（免費版）、&lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;strong&gt;Proton Pass&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;coworking、機場 Wi-Fi 連 Git／SSH&lt;td&gt;只用 HTTPS、不開 VPN&lt;td&gt;VPN／Pass 有免費層&lt;td&gt;低&lt;/table&gt;&lt;p&gt;冷知識：清單裡多數工具名字很酷，真正讓你半夜少加班的，常常是 &lt;code&gt;ripgrep&lt;/code&gt; 這種不起眼的搜尋器——它不會幫你寫 code，但會幫你在垃圾山裡找到那一行。&lt;h2 id=&quot;最小安裝-SOP&quot;&gt;最小安裝 SOP&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;前置&lt;/strong&gt;：macOS 已連網；Apple 帳號可登入（裝某些工具時會用到）。&lt;h3 id=&quot;步驟-1Homebrew&quot;&gt;步驟 1：Homebrew&lt;/h3&gt;&lt;p&gt;官方網站是 &lt;strong&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;brew.sh&lt;/a&gt;&lt;/strong&gt;（不是隨便一個長得很像的網域）。首屏「Install Homebrew」那一行就是安裝指令；在系統 Terminal 貼上即可（過程中常會一併提示安裝 &lt;strong&gt;Xcode Command Line Tools&lt;/strong&gt;）：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/bash &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Apple Silicon 裝完後，依終端機提示的「Next steps」把 brew 加進 PATH，常見寫法是：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.zprofile
&lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;/opt/homebrew/bin/brew shellenv&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;驗收：&lt;code&gt;brew --version&lt;/code&gt; 有版本號。細節、常見坑與 Brewfile，見 &lt;a href=&quot;https://kamadiam.com/homebrew-tutorial/&quot;&gt;Homebrew 完全教學&lt;/a&gt;。&lt;h3 id=&quot;步驟-2核心-CLI&quot;&gt;步驟 2：核心 CLI&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; gh jq ripgrep fzf starship&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;驗收：&lt;code&gt;rg --version&lt;/code&gt; 有輸出；&lt;code&gt;gh auth status&lt;/code&gt; 若還沒登入，會提示你去 login——這很正常，不是壞掉。&lt;p&gt;（選用）Starship／fzf 要啟用提示列或快捷鍵時，照 &lt;code&gt;brew info starship&lt;/code&gt;／&lt;code&gt;brew info fzf&lt;/code&gt; 的 &lt;strong&gt;Caveats&lt;/strong&gt; 加一行到 &lt;code&gt;~/.zshrc&lt;/code&gt;。那是「啟用設定」，不是第二套安裝儀式。&lt;h3 id=&quot;步驟-3終端機-App&quot;&gt;步驟 3：終端機 App&lt;/h3&gt;&lt;p&gt;擇一即可，不必全裝：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cask&lt;/span&gt; ghostty    &lt;span class=&quot;token comment&quot;&gt;# 或 iterm2 / warp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;iTerm2 可在選單設成預設終端；Ghostty 第一次打開就能用。終端機主題派對可以之後再辦——先讓游標會閃就好。&lt;h3 id=&quot;步驟-4編輯器&quot;&gt;步驟 4：編輯器&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cask&lt;/span&gt; visual-studio-code
&lt;span class=&quot;token comment&quot;&gt;# 若要 AI 輔助編輯器：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# brew install --cask cursor&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;驗收：打開 VS Code，用 &lt;code&gt;File → Open Folder&lt;/code&gt; 開一個測試資料夾。Git 相關能力通常已內建，不必先逛擴充商店半小時。&lt;h3 id=&quot;步驟-5Node前端/11ty-常做&quot;&gt;步驟 5：Node（前端／11ty 常做）&lt;/h3&gt;&lt;p&gt;跟 brew 其他套件一樣，一條指令：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# 應顯示 v…（目前 brew 的 Node 主線版本）&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;什麼時候才需要版本管理器？&lt;/strong&gt; 專案 A 要 Node 20、專案 B 要 22 時，再改用 fnm／mise。它們會要求你把一行 &lt;code&gt;eval&lt;/code&gt; 寫進 shell 設定——那是工具自己的啟動方式，不是 brew 安裝本體又壞了一次：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; fnm    &lt;span class=&quot;token comment&quot;&gt;# 或：brew install mise&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 之後依 `brew info fnm` / `brew info mise` 的 Caveats 把 eval 加進 ~/.zshrc&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;步驟-6Git-身分與-GitHub&quot;&gt;步驟 6：Git 身分與 GitHub&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; config &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; user.name &lt;span class=&quot;token string&quot;&gt;&quot;你的名字&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; config &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; user.email &lt;span class=&quot;token string&quot;&gt;&quot;你的信箱&quot;&lt;/span&gt;
gh auth login    &lt;span class=&quot;token comment&quot;&gt;# 選 GitHub.com → HTTPS → 瀏覽器授權&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;驗收：&lt;code&gt;gh repo list&lt;/code&gt; 能看到你的 repo，或空列表但沒有錯誤訊息。&lt;h3 id=&quot;步驟-7選配-—-容器與生產力&quot;&gt;步驟 7：選配 — 容器與生產力&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cask&lt;/span&gt; orbstack           &lt;span class=&quot;token comment&quot;&gt;# 或：brew install --cask docker-desktop&lt;/span&gt;
brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cask&lt;/span&gt; rectangle raycast&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OrbStack／Docker Desktop 第一次啟動要同意授權；Rectangle 記得在系統設定開 &lt;strong&gt;輔助使用&lt;/strong&gt;，否則快捷鍵會安靜地什麼都不做——像咖啡機沒插電。&lt;h3 id=&quot;步驟-8用-Brewfile-備份建議&quot;&gt;步驟 8：用 Brewfile 備份（建議）&lt;/h3&gt;&lt;p&gt;裝穩後匯出清單，下次新 Mac 比較像「還原存檔」而不是「考古下載資料夾」：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;brew bundle dump &lt;span class=&quot;token parameter variable&quot;&gt;--file&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt;/Brewfile &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 新機還原：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# brew bundle --file=~/Brewfile&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;官方說明見 &lt;a href=&quot;https://docs.brew.sh/Brew-Bundle&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew Bundle&lt;/a&gt;。&lt;h2 id=&quot;依技術棧的第二輪加裝&quot;&gt;依技術棧的第二輪加裝&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你在做什麼&lt;th&gt;建議再加&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Eleventy／靜態站&lt;/strong&gt;&lt;td&gt;專案內 &lt;code&gt;npm install&lt;/code&gt;；搜尋可看站內 &lt;a href=&quot;https://kamadiam.com/pagefind-eleventy-static-site-search/&quot;&gt;Pagefind 教學&lt;/a&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Deploy 到主機&lt;/strong&gt;&lt;td&gt;&lt;code&gt;ssh&lt;/code&gt;、SFTP 或 &lt;code&gt;rsync&lt;/code&gt;；快取可搭配 &lt;a href=&quot;https://kamadiam.com/11ty-hostinger-cache-setup/&quot;&gt;11ty 與 Hostinger 快取設定&lt;/a&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;HTTPS／憑證&lt;/strong&gt;&lt;td&gt;Mac 上通常不必裝特殊憑證工具；用瀏覽器 + &lt;code&gt;curl&lt;/code&gt; 驗證即可，見 &lt;a href=&quot;https://kamadiam.com/free-ssl-certificate/&quot;&gt;免費 SSL 憑證&lt;/a&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;常在外用筆電開發&lt;/strong&gt;&lt;td&gt;VPN + 密碼管理器，優先於再多裝一個終端機主題；可從 &lt;a href=&quot;https://go.getproton.me/aff_c?offer_id=26&amp;amp;aff_id=14397&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN 免費版&lt;/a&gt; 與 &lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass&lt;/a&gt; 開始&lt;/table&gt;&lt;p&gt;公共 Wi-Fi 上 &lt;code&gt;git push&lt;/code&gt;，有點像在咖啡店用喇叭講密碼——不是每次都會出事，但出事那天會特別想喝雙倍浓缩。&lt;h2 id=&quot;常見問題&quot;&gt;常見問題&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一定要裝 Docker 嗎？&lt;/strong&gt;&lt;br&gt;做靜態站、純前端多半&lt;strong&gt;不必&lt;/strong&gt;。需要本機 MySQL、Redis，或團隊規定「跟 production 同一映像」時再裝。Mac 上 &lt;strong&gt;OrbStack&lt;/strong&gt; 通常比 Docker Desktop 更省資源（仍以你機器與專案為準）。&lt;p&gt;&lt;strong&gt;Cursor 還是 VS Code？&lt;/strong&gt;&lt;br&gt;VS Code 免費、生態大，適合入門與日常。Cursor 把 AI 編輯整合進 IDE，適合已會基本 Git／終端、想加速改 template 的人。可先 VS Code，需要再裝 Cursor；兩者設定常能部分共用。&lt;p&gt;&lt;strong&gt;Homebrew 跟 App Store 衝突嗎？&lt;/strong&gt;&lt;br&gt;不衝突。brew 管 CLI 與多數 &lt;code&gt;.dmg&lt;/code&gt; App；App Store 版照常用。注意&lt;strong&gt;同一 App 不要兩邊各裝一份&lt;/strong&gt;（例如 Xcode 只留一份），否則像買了兩把同款鑰匙，最後不知道哪一把才是真的。&lt;p&gt;&lt;strong&gt;Intel Mac 還能用這份清單嗎？&lt;/strong&gt;&lt;br&gt;可以。Homebrew 前綴在 Intel 上多半是 &lt;code&gt;/usr/local&lt;/code&gt;，不是 &lt;code&gt;/opt/homebrew&lt;/code&gt;；其餘工具多數仍支援。選 OrbStack／Ghostty 時，對一下官網最低系統要求就好。&lt;p&gt;&lt;strong&gt;裝完還是不會寫程式怎麼辦？&lt;/strong&gt;&lt;br&gt;這份清單只解決&lt;strong&gt;環境&lt;/strong&gt;。環境通了，下一步才是選一條路——例如靜態站路線可從 &lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro-2026/&quot;&gt;11ty vs Hugo vs Astro&lt;/a&gt; 找方向，前端學習地圖可看 &lt;a href=&quot;https://kamadiam.com/ai-age-css-learning-strategy/&quot;&gt;AI 時代的 CSS 學習策略&lt;/a&gt;。&lt;h2 id=&quot;收個尾&quot;&gt;收個尾&lt;/h2&gt;&lt;p&gt;最小組合其實很無聊：Homebrew、Git、一個終端機、一個編輯器、需要時再加 Node。無聊通常是好事——代表你沒在裝「看起來很專業、實際上三個月開一次」的軟體。&lt;p&gt;咖啡還溫的時候，先跑完 SOP；主題、字型、霓虹提示列，留給下一個週末的自己。若你之後重灌 Mac，記得那份 &lt;code&gt;Brewfile&lt;/code&gt;——它不會泡咖啡，但至少不會讓你再下載同一份安裝檔十七次。&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew 官網&lt;/a&gt; — 官方安裝指令與說明&lt;li&gt;&lt;a href=&quot;https://docs.brew.sh/Brew-Bundle&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew Bundle（Brewfile）&lt;/a&gt; — 匯出／還原套件清單&lt;li&gt;&lt;a href=&quot;https://cli.github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub CLI&lt;/a&gt; — &lt;code&gt;gh&lt;/code&gt; 安裝與登入&lt;li&gt;&lt;a href=&quot;https://mise.jdx.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;mise 官網&lt;/a&gt; — 多語言版本管理（多版本時再考慮）&lt;li&gt;&lt;a href=&quot;https://orbstack.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;OrbStack 官網&lt;/a&gt; — Mac 上較輕量的容器方案之一&lt;li&gt;&lt;a href=&quot;https://ghostty.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ghostty&lt;/a&gt;／&lt;a href=&quot;https://iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;iTerm2&lt;/a&gt; — 終端機選型起點&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>靜態站 Dark / Light Mode 怎麼做？本站實作拆解</title>
    <link href="https://kamadiam.com/eleventy-dark-light-mode-kamadiam/" />
    <updated>2026-08-13T10:51:39Z</updated>
    <id>https://kamadiam.com/eleventy-dark-light-mode-kamadiam/</id>
    <content type="html">&lt;aside class=&quot;self-talk&quot;&gt;&lt;p&gt;不得不說——這個網站的深淺色切換，酷到有點欠扁。你以為只是換個背景色？結果太陽還會划過螢幕，像在跟你說：「欸，天亮了／天黑了，感謝收看。」我每次都還會多按好幾次，自以為很厲害。&lt;/aside&gt;&lt;p&gt;搜「dark mode CSS」，多半會看到 React、Tailwind 範例。若你做的是 &lt;strong&gt;Eleventy／純 HTML 靜態站&lt;/strong&gt;，直接照搬常會卡在這三件事：&lt;ol&gt;&lt;li&gt;顏色寫死在元件上，深色模式要改一堆檔案。&lt;li&gt;重新整理時先閃白再變黑（典型的 FOUC）。&lt;li&gt;手動切換後，又跟系統偏好打架。&lt;/ol&gt;&lt;p&gt;這篇先介紹一套&lt;strong&gt;可上線的通用做法&lt;/strong&gt;（CSS 變數 + &lt;code&gt;data-theme&lt;/code&gt; + 防閃腳本），再以本站為例，說明：&lt;ul&gt;&lt;li&gt;為何以&lt;strong&gt;淺色為預設&lt;/strong&gt;&lt;li&gt;JS 如何讀取系統偏好與 &lt;code&gt;localStorage&lt;/code&gt;&lt;li&gt;header 按鈕如何切換&lt;li&gt;切主題時的過場動畫（View Transition）怎麼加，本站又多做了什麼&lt;li&gt;主題如何與 Barba 換頁共存&lt;/ul&gt;&lt;p&gt;讀完後，你應能決定自己的站要不要在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 加同步腳本防閃爍，並把同一套流程接到 layout。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E5%85%88%E9%81%B8%E6%96%B9%E6%A1%88%E5%8F%AA%E8%B7%9F%E7%B3%BB%E7%B5%B1,%E9%82%84%E6%98%AF%E8%A6%81%E6%89%8B%E5%8B%95%E5%88%87%E6%8F%9B?&quot;&gt;先選方案：只跟系統，還是要手動切換？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E9%80%9A%E7%94%A8%E5%AF%A6%E4%BD%9C%E8%AA%9E%E6%84%8F%E8%89%B2-token-+-data-theme&quot;&gt;通用實作：語意色 token + data-theme&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E6%9C%AC%E7%AB%99%E6%80%8E%E9%BA%BC%E5%81%9A%E6%B7%BA%E8%89%B2%E9%A0%90%E8%A8%AD-+-%E7%B3%BB%E7%B5%B1/%E6%89%8B%E5%8B%95%E8%A6%86%E5%AF%AB&quot;&gt;本站怎麼做：淺色預設 + 系統／手動覆寫&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E6%80%8E%E9%BA%BC%E7%94%A8-AI-agent-%E5%AE%8C%E6%88%90%E6%95%B4%E5%A5%97%E4%B8%BB%E9%A1%8C%E5%88%87%E6%8F%9B?&quot;&gt;怎麼用 AI agent 完成整套主題切換？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E6%B1%BA%E7%AD%96%E8%A1%A8%E9%80%9A%E7%94%A8%E6%96%B9%E5%BC%8F-vs-%E6%9C%AC%E7%AB%99%E5%8F%96%E6%8D%A8&quot;&gt;決策表：通用方式 vs 本站取捨&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E4%B8%8A%E7%B7%9A%E5%89%8D%E9%A9%97%E6%94%B6%E6%B8%85%E5%96%AE&quot;&gt;上線前驗收清單&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7/%E8%B3%87%E6%BA%90&quot;&gt;推薦工具／資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E7%B5%90%E8%AA%9E&quot;&gt;結語&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/eleventy-dark-light-mode-kamadiam/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先選方案只跟系統,還是要手動切換?&quot;&gt;先選方案：只跟系統，還是要手動切換？&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;需求&lt;th&gt;做法&lt;th&gt;要不要 JS&lt;th&gt;持久化&lt;th&gt;適合誰&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;只跟 OS 深／淺色&lt;td&gt;&lt;code&gt;@media (prefers-color-scheme)&lt;/code&gt; 或 &lt;code&gt;light-dark()&lt;/code&gt;&lt;td&gt;不需要&lt;td&gt;無&lt;td&gt;個人站、不想放按鈕&lt;tr&gt;&lt;td&gt;訪客手動切換&lt;td&gt;&lt;code&gt;data-theme=&amp;quot;light|dark&amp;quot;&lt;/code&gt; + CSS 變數&lt;td&gt;需要&lt;td&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;td&gt;白天晚上不同環境讀文的人&lt;tr&gt;&lt;td&gt;&lt;strong&gt;兩者並用（多數站推薦）&lt;/strong&gt;&lt;td&gt;預設跟 OS；有存檔就覆寫&lt;td&gt;需要&lt;td&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;td&gt;內容站、教學站&lt;tr&gt;&lt;td&gt;站長換季換整套皮（非訪客切換）&lt;td&gt;build-time 換主題變數&lt;td&gt;不需要&lt;td&gt;無&lt;td&gt;活動 landing、多品牌輸出&lt;/table&gt;&lt;p&gt;前三列都是&lt;strong&gt;訪客在瀏覽器裡&lt;/strong&gt;看到的深淺色。最後一列是另一件事：你在建置網站時，把整套品牌色、版面一次換掉（例如活動 landing）。訪客切深淺色不必重新 build；換整套皮才要重新 build。別把兩種需求做成同一套機制。&lt;p&gt;使用 &lt;code&gt;localStorage&lt;/code&gt; 時，實務上記住三點：&lt;ul&gt;&lt;li&gt;用 &lt;code&gt;try/catch&lt;/code&gt; 包住讀寫。Safari 私密瀏覽等環境可能禁止寫入，未捕捉時整段腳本會中斷。&lt;li&gt;全站固定同一個 key（例如 &lt;code&gt;theme&lt;/code&gt;），避免 header 寫 &lt;code&gt;theme&lt;/code&gt;、別的腳本寫 &lt;code&gt;color-mode&lt;/code&gt;。&lt;li&gt;有存檔就以存檔為準；只有清掉存檔後，才回到跟系統偏好。&lt;/ul&gt;&lt;h2 id=&quot;通用實作語意色-token-+-data-theme&quot;&gt;通用實作：語意色 token + data-theme&lt;/h2&gt;&lt;h3 id=&quot;為什麼不要硬編-#fff/#111&quot;&gt;為什麼不要硬編 &lt;code&gt;#fff&lt;/code&gt;／&lt;code&gt;#111&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;元件若直接寫 &lt;code&gt;background: #fff&lt;/code&gt;、&lt;code&gt;color: #111&lt;/code&gt;，改深色時每個 selector 都要再寫一次。較穩的做法是：元件只寫&lt;strong&gt;這塊區域扮演什麼角色&lt;/strong&gt;（頁面底、正文、弱化文字、框線），真正的色碼集中放在變數裡。這就是 design token：名稱描述用途，不描述「現在是白色」。&lt;p&gt;切到深色時，只要覆寫這批變數，按鈕、文章、側欄會一起變，不必維護兩份完整 CSS。&lt;p&gt;&lt;code&gt;color-scheme: light dark&lt;/code&gt; 則是告訴瀏覽器：這個文件同時支援深淺色，請讓原生捲軸、&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;、表單控件跟著走，而不只是你自己畫的背景。&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; light dark&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 捲軸、表單原生控件跟著深淺色 */&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--bg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fafafa&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #1a1a1a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--muted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #666&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #e5e5e5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--link&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #2563eb&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;:root[data-theme=&quot;dark&quot;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--bg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #0f1115&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f3f4f6&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--muted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #9ca3af&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #2a2f3a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--link&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #60a5fa&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 還沒手動設 data-theme 時，跟 OS */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dark&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;:root:not([data-theme])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--bg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #0f1115&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f3f4f6&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--muted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #9ca3af&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #2a2f3a&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;--link&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #60a5fa&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--bg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;:root:not([data-theme])&lt;/code&gt; 的意思是：只有 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 上&lt;strong&gt;還沒有&lt;/strong&gt; &lt;code&gt;data-theme&lt;/code&gt; 時，才用系統深色。一旦 JS 寫了 &lt;code&gt;data-theme=&amp;quot;light&amp;quot;&lt;/code&gt; 或 &lt;code&gt;&amp;quot;dark&amp;quot;&lt;/code&gt;，這段 &lt;code&gt;@media&lt;/code&gt; 就不再插手，才不會跟使用者的手動選擇打架。&lt;h3 id=&quot;防-FOUC&lt;head&gt;-同步腳本通用推薦&quot;&gt;防 FOUC：&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 同步腳本（通用推薦）&lt;/h3&gt;&lt;p&gt;這裡的 FOUC（Flash of Unstyled Content）不是指「CSS 還沒載入」，而是&lt;strong&gt;第一幀的顏色跟最終主題不一致&lt;/strong&gt;。典型順序：&lt;ol&gt;&lt;li&gt;CSS 先依 &lt;code&gt;@media (prefers-color-scheme: dark)&lt;/code&gt; 畫出深色。&lt;li&gt;外部 JS 稍後才讀到 &lt;code&gt;localStorage&lt;/code&gt; 裡存的 &lt;code&gt;light&lt;/code&gt;。&lt;li&gt;再把畫面改回淺色。使用者會看到閃一下。&lt;/ol&gt;&lt;p&gt;解法：在 stylesheet &lt;strong&gt;之前&lt;/strong&gt;放一段同步 inline script，在瀏覽器畫第一幀前就寫好 &lt;code&gt;data-theme&lt;/code&gt;。不要用 &lt;code&gt;defer&lt;/code&gt; 或 &lt;code&gt;async&lt;/code&gt;，那兩種都會晚跑，趕不上第一幀。&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;color-scheme&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;light dark&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; stored &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; prefersDark &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;(prefers-color-scheme: dark)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; theme &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; stored &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prefersDark &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dark&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;light&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; theme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;(prefers-color-scheme: dark)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dark&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/assets/css/main.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這段只負責「第一幀顏色對不對」，越短越好。按鈕點擊、icon、系統偏好監聽屬於互動，另放外部 &lt;code&gt;theme.js&lt;/code&gt;（Eleventy 可放進 &lt;code&gt;base.njk&lt;/code&gt; 的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 與 &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; 前）。不要把整包切換邏輯塞進每個頁面的 HTML。&lt;h3 id=&quot;切換按鈕-+-持久化精簡版&quot;&gt;切換按鈕 + 持久化（精簡版）&lt;/h3&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;theme-toggle&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-pressed&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;切換深淺色模式&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  切換主題
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; root &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; btn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;theme-toggle&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dark&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;syncButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;btn&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    btn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;aria-pressed&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    btn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;aria-label&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;切換到淺色模式&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;切換到深色模式&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;syncButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  btn&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; next &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;light&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dark&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;syncButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;(prefers-color-scheme: dark)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;change&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&#39;data-theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;(prefers-color-scheme: dark)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dark&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;light&#39;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;syncButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重點在最後那段 &lt;code&gt;change&lt;/code&gt; 監聽：使用者&lt;strong&gt;從未按過按鈕&lt;/strong&gt;（&lt;code&gt;localStorage&lt;/code&gt; 沒有 key）時，半夜把系統改成深色，頁面會跟著變。一旦按過並寫入存檔，就以使用者選擇為準，系統再怎麼改也不覆寫。&lt;h3 id=&quot;只要跟系統不要按鈕?&quot;&gt;只要跟系統、不要按鈕？&lt;/h3&gt;&lt;p&gt;CSS 的 &lt;code&gt;light-dark()&lt;/code&gt; 可少寫一段 &lt;code&gt;@media&lt;/code&gt;（需搭配 &lt;code&gt;color-scheme: light dark&lt;/code&gt;）：&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; light dark&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;light-dark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#1a1a1a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #f3f4f6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--bg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;light-dark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#fafafa&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #0f1115&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;light-dark(淺色, 深色)&lt;/code&gt; 只看元素的 &lt;code&gt;color-scheme&lt;/code&gt;（通常跟作業系統），&lt;strong&gt;沒有「使用者按了按鈕」這個狀態&lt;/strong&gt;。若還要手動切換，仍建議用 &lt;code&gt;data-theme&lt;/code&gt; 覆寫變數；舊版 Safari 也不支援此函式，請保留 &lt;code&gt;@media&lt;/code&gt; fallback。&lt;h3 id=&quot;切換時要不要加過場?&quot;&gt;切換時要不要加過場？&lt;/h3&gt;&lt;p&gt;顏色能切、能記住之後，才考慮動畫。沒有動畫，深淺色一樣能用。&lt;p&gt;瀏覽器有一個現成的過場 API，叫 &lt;strong&gt;View Transition&lt;/strong&gt;。點主題鈕時，它會：&lt;ol&gt;&lt;li&gt;先拍一張「現在」的畫面&lt;li&gt;等你改完 &lt;code&gt;data-theme&lt;/code&gt;&lt;li&gt;再拍「之後」的畫面，兩張交叉淡入&lt;/ol&gt;&lt;p&gt;主題鈕的最小寫法：把「改顏色」包進 &lt;code&gt;startViewTransition&lt;/code&gt;。使用者開了「減少動態」，或瀏覽器沒這個 API，就直接改顏色。&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;applyTheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data-theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;theme&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

btn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; next &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDark&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;light&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dark&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; reduce &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;(prefers-reduced-motion: reduce)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reduce &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startViewTransition &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;function&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;applyTheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startViewTransition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;applyTheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;預設淡入大約 0.25 秒。想慢一點，改 CSS 即可：&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;::view-transition-old(root),
::view-transition-new(root)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;animation-duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.35s&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;本站怎麼做淺色預設-+-系統/手動覆寫&quot;&gt;本站怎麼做：淺色預設 + 系統／手動覆寫&lt;/h2&gt;&lt;p&gt;以下對照 &lt;a href=&quot;https://kamadiam.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;本站&lt;/a&gt; 的實際做法（本地專案請以 &lt;code&gt;_includes/layouts/base.njk&lt;/code&gt;、&lt;code&gt;src/assets/js/site.js&lt;/code&gt; 為準）。&lt;p&gt;第一次進站的判斷順序：&lt;ol&gt;&lt;li&gt;&lt;code&gt;localStorage&lt;/code&gt; 的 &lt;code&gt;theme&lt;/code&gt; 有值 → 用存檔。&lt;li&gt;沒有存檔 → 依 &lt;code&gt;prefers-color-scheme&lt;/code&gt; 決定 dark 或 light。&lt;/ol&gt;&lt;p&gt;同一套判斷出現兩次，分工不同：&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 的 inline script 趕在第一幀前寫上 &lt;code&gt;data-theme&lt;/code&gt;；&lt;code&gt;site.js&lt;/code&gt; 稍後再綁按鈕、更新 icon，並在系統偏好改變時決定要不要跟著切。&lt;figure class=&quot;mermaid-diagram&quot; aria-label=&quot;Diagram&quot;&gt;&lt;pre class=&quot;mermaid&quot;&gt;flowchart TD
  A[第一次進站] --&gt; B{localStorage.theme 有值?}
  B --&gt;|有| C[套用已存主題]
  B --&gt;|無| D[依 prefers-color-scheme 決定]
  C --&gt; E[設定 html data-theme]
  D --&gt; E
  E --&gt; F[CSS token 套用顏色]
  G[點 #theme-toggle] --&gt; H{prefers-reduced-motion?}
  H --&gt;|是| I[直接切換]
  H --&gt;|否| J[播過場動畫並切換]
  I --&gt; K[更新 data-theme 並寫入 localStorage]
  J --&gt; K
  K --&gt; F&lt;/pre&gt;&lt;/figure&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;層級&lt;th&gt;負責什麼&lt;th&gt;本站做法&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;td&gt;掛狀態&lt;td&gt;&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 上的 &lt;code&gt;data-theme=&amp;quot;dark&amp;quot;&lt;/code&gt; 或 &lt;code&gt;&amp;quot;light&amp;quot;&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;td&gt;顏色&lt;td&gt;&lt;code&gt;:root&lt;/code&gt; 定義淺色 token；&lt;code&gt;[data-theme=&amp;quot;dark&amp;quot;]&lt;/code&gt; 覆寫深色；表格、TOC、code 等再個別微調&lt;tr&gt;&lt;td&gt;&lt;strong&gt;JS&lt;/strong&gt;&lt;td&gt;讀偏好、切換、持久化&lt;td&gt;&lt;code&gt;site.js&lt;/code&gt; 讀寫 &lt;code&gt;localStorage&lt;/code&gt; key &lt;code&gt;theme&lt;/code&gt;，並監聽 &lt;code&gt;matchMedia&lt;/code&gt;&lt;/table&gt;&lt;h3 id=&quot;CSS淺色寫在-root,深色靠-attribute&quot;&gt;CSS：淺色寫在 &lt;code&gt;:root&lt;/code&gt;，深色靠 attribute&lt;/h3&gt;&lt;p&gt;本站品牌是暖色淺底，所以&lt;strong&gt;沒有任何覆寫時，畫面必須是淺色&lt;/strong&gt;。同時還要：沒按過按鈕時跟系統、按過之後記住。這三條路共用同一批 CSS 變數，不必維護兩份完整主題。&lt;p&gt;三層選擇器各管一件事：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;:root&lt;/code&gt; 放淺色&lt;/strong&gt;：JS 還沒跑、attribute 也還沒設時的底線。全站元件只寫 &lt;code&gt;var(--text-color)&lt;/code&gt;，不必每個區塊都寫深／淺兩套。&lt;li&gt;&lt;strong&gt;&lt;code&gt;[data-theme=&amp;quot;dark&amp;quot;]&lt;/code&gt; 覆寫變數&lt;/strong&gt;：JS 只要 &lt;code&gt;setAttribute(&amp;quot;data-theme&amp;quot;, &amp;quot;dark&amp;quot;)&lt;/code&gt;，深色 token 就生效。這也讓使用者能在系統是深色時，強制選淺色。&lt;li&gt;&lt;strong&gt;&lt;code&gt;@media&lt;/code&gt; 當備援&lt;/strong&gt;：本站用 &lt;code&gt;:root:not([data-theme=&amp;quot;light&amp;quot;])&lt;/code&gt;，意思是「只要不是明確鎖定淺色，系統深色就套深色 token」。這是給腳本沒跑時用的（例如 JS 被擋）。JS 正常時，head 腳本一定會寫上 &lt;code&gt;light&lt;/code&gt; 或 &lt;code&gt;dark&lt;/code&gt;，這段幾乎不會插手。&lt;/ol&gt;&lt;p&gt;通用範例用 &lt;code&gt;:root:not([data-theme])&lt;/code&gt;（attribute 完全不存在才跟系統）；本站用 &lt;code&gt;:not([data-theme=&amp;quot;light&amp;quot;])&lt;/code&gt;（沒鎖淺色就允許跟系統深色）。兩者目的相同，選擇器寫法不同，抄的時候別混用而不自知。&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--surface-page&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #faf7f2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--ink-primary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #2c1810&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--surface-page&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--text-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--ink-primary&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;[data-theme=&quot;dark&quot;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--surface-page&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #1c1410&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--ink-primary&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f0e6dc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--surface-page&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--text-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--ink-primary&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;html, body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--text-color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--background-color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;防-FOUC先在-&lt;head&gt;-加-inline-script&quot;&gt;防 FOUC：先在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 加 inline script&lt;/h3&gt;&lt;p&gt;&lt;code&gt;base.njk&lt;/code&gt; 在 stylesheet 之前執行這段同步腳本，先設定 &lt;code&gt;data-theme&lt;/code&gt;，避免首屏先套錯顏色：&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; savedTheme &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; localStorage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;theme&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;savedTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data-theme&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; savedTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(prefers-color-scheme: dark)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data-theme&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dark&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data-theme&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;light&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;與前文「通用推薦」相比，本站這段沒包 &lt;code&gt;try/catch&lt;/code&gt;。若要在私密瀏覽也穩，把讀寫包進 &lt;code&gt;try/catch&lt;/code&gt; 即可，邏輯不用改。&lt;h3 id=&quot;JS初始切換系統同步&quot;&gt;JS：初始、切換、系統同步&lt;/h3&gt;&lt;p&gt;head 腳本只在 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 上寫了 &lt;code&gt;data-theme&lt;/code&gt;，&lt;strong&gt;還沒接按鈕&lt;/strong&gt;。&lt;code&gt;site.js&lt;/code&gt; 載入後會再做三件事：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;對齊 UI&lt;/strong&gt;：依目前主題顯示月亮或太陽 icon，並更新 &lt;code&gt;aria-label&lt;/code&gt;（例如「切換到淺色模式」）。&lt;li&gt;&lt;strong&gt;處理點擊&lt;/strong&gt;：在 &lt;code&gt;dark&lt;/code&gt;／&lt;code&gt;light&lt;/code&gt; 之間切換，寫入 &lt;code&gt;localStorage&lt;/code&gt;，切換期間把按鈕設成 &lt;code&gt;disabled&lt;/code&gt; 並加上 &lt;code&gt;aria-busy&lt;/code&gt;，避免連點播兩次動畫。&lt;li&gt;&lt;strong&gt;聽系統偏好&lt;/strong&gt;：僅在 &lt;code&gt;localStorage&lt;/code&gt; 還沒有 &lt;code&gt;theme&lt;/code&gt; 時，跟著 OS 切換。&lt;/ol&gt;&lt;h3 id=&quot;本站的過場淡入-+-一顆太陽&quot;&gt;本站的過場：淡入 + 一顆太陽&lt;/h3&gt;&lt;p&gt;通用寫法只做「顏色慢慢淡過去」。本站多一顆太陽划過畫面：切到淺色像日出，切到深色像日落。兩件事分開做，大約都跑 1.5 秒。&lt;ul&gt;&lt;li&gt;&lt;strong&gt;顏色淡入&lt;/strong&gt;：還是 View Transition。瀏覽器不支援，顏色照樣立刻換。&lt;li&gt;&lt;strong&gt;太陽&lt;/strong&gt;：CSS 動畫（&lt;code&gt;theme-transition.css&lt;/code&gt;）。跟 View Transition 無關，沒有 VT 也能播。&lt;li&gt;&lt;strong&gt;不要動畫&lt;/strong&gt;：系統開了「減少動態」，就只換顏色，太陽也不播。&lt;/ul&gt;&lt;p&gt;點擊時大概是這樣（省略 icon）：&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;shouldSkipAnimation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;setTheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 減少動態：只換色&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startViewTransition &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;function&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;setTheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;playSunAnimation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 沒有 VT，太陽仍可播&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startViewTransition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setTheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;playSunAnimation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextTheme&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;跟-BarbaPagefind-共存&quot;&gt;跟 Barba、Pagefind 共存&lt;/h3&gt;&lt;p&gt;一般點連結會整頁重新載入，&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 腳本會再跑一次，主題靠 &lt;code&gt;localStorage&lt;/code&gt; 還在。本站用 &lt;a href=&quot;https://barba.js.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Barba&lt;/a&gt;（一類 PJAX）：換頁時&lt;strong&gt;只替換主內容&lt;/strong&gt;，不重載整份 HTML。這對主題有兩個後果：&lt;ul&gt;&lt;li&gt;&lt;code&gt;&amp;lt;html data-theme&amp;gt;&lt;/code&gt; 必須留在被替換的區塊&lt;strong&gt;外面&lt;/strong&gt;。本站 &lt;code&gt;data-barba=&amp;quot;wrapper&amp;quot;&lt;/code&gt; 在 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;，真正被換的是裡面的 container；&lt;code&gt;data-theme&lt;/code&gt; 掛在 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;，換頁不會被清掉。&lt;li&gt;切換按鈕在 header，同樣在 wrapper 外，元素不會被換掉。因此 &lt;code&gt;initThemeToggle&lt;/code&gt; 只在第一次進站綁一次即可；若每次 Barba &lt;code&gt;afterEnter&lt;/code&gt; 又綁一次，點一下會觸發兩次切換。&lt;/ul&gt;&lt;p&gt;Pagefind 搜尋框是疊在頁面上的 overlay，樣式走同一批 CSS 變數（&lt;code&gt;--background-color&lt;/code&gt;、&lt;code&gt;--text-color&lt;/code&gt; 等）。主題一切，搜尋層跟著變，不必替 Pagefind 再寫一套深色 CSS。&lt;h2 id=&quot;怎麼用-AI-agent-完成整套主題切換?&quot;&gt;怎麼用 AI agent 完成整套主題切換？&lt;/h2&gt;&lt;p&gt;這次沒有把需求拆成「先做按鈕、之後再補動畫」的零散修改，而是先請 AI agent 讀懂專案，再一次整理出完整狀態流程。這裡的 &lt;strong&gt;total dark mode switch function&lt;/strong&gt;，不是只有把背景改黑，而是包含：&lt;ul&gt;&lt;li&gt;&lt;code&gt;:root&lt;/code&gt; 與 &lt;code&gt;[data-theme=&amp;quot;dark&amp;quot;]&lt;/code&gt; 的語意色 token&lt;li&gt;首屏同步讀取 &lt;code&gt;localStorage&lt;/code&gt;，避免 FOUC&lt;li&gt;沒有手動選擇時，跟隨 &lt;code&gt;prefers-color-scheme&lt;/code&gt;&lt;li&gt;使用者按過按鈕後，保存手動選擇，不再被 OS 覆寫&lt;li&gt;按鈕 icon、&lt;code&gt;aria-label&lt;/code&gt;、&lt;code&gt;aria-busy&lt;/code&gt; 與連點保護&lt;li&gt;View Transition 色彩 crossfade&lt;li&gt;不支援 View Transition 時的直接切換&lt;li&gt;&lt;code&gt;prefers-reduced-motion&lt;/code&gt; 下停用動畫&lt;li&gt;Barba 換頁後不重複綁定事件&lt;/ul&gt;&lt;h3 id=&quot;先給-agent-正確上下文&quot;&gt;先給 agent 正確上下文&lt;/h3&gt;&lt;p&gt;好的 prompt 不只說「幫我加 dark mode」，而是把技術限制、現有檔案與驗收條件一次寫清楚。例如：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;請先閱讀這個 Eleventy 專案的 layout、site.js、主題 CSS、Barba 初始化方式，
不要引入框架或新增不必要的套件。

請完成全站 dark/light mode：
1. 淺色是品牌預設，沒有 localStorage 時跟隨 prefers-color-scheme。
2. 使用 html[data-theme] 與語意 CSS variables。
3. head inline script 必須在 stylesheet 前執行，避免 FOUC。
4. theme-toggle 要更新 icon、aria-label、aria-busy，並避免重複綁定。
5. 切換時使用 document.startViewTransition；不支援或 reduced motion 時要能正常降級。
6. 保留 Barba 換頁與 Pagefind 搜尋功能。
7. 請列出修改檔案、可能的邊界情況，以及驗收步驟。&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這樣 agent 會先處理「主題狀態由誰負責」的問題，而不是只在某個元件上加一段 &lt;code&gt;.dark&lt;/code&gt; CSS。對本站而言，狀態放在 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;，CSS 負責顏色，&lt;code&gt;site.js&lt;/code&gt; 負責互動；這個分層先確定，後面的 View Transition 才不會變成另一套主題系統。&lt;h3 id=&quot;讓-agent-分階段實作與檢查&quot;&gt;讓 agent 分階段實作與檢查&lt;/h3&gt;&lt;p&gt;要求 agent 依下列順序工作，每完成一層就檢查一次：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;盤點現況&lt;/strong&gt;：找出 layout、token、theme toggle、Barba wrapper 和所有寫死色碼。&lt;li&gt;&lt;strong&gt;先完成可用版本&lt;/strong&gt;：&lt;code&gt;data-theme&lt;/code&gt;、localStorage、系統偏好與 FOUC 防護。&lt;li&gt;&lt;strong&gt;補互動細節&lt;/strong&gt;：按鈕狀態、鍵盤操作、失敗時的 fallback、系統偏好監聽。&lt;li&gt;&lt;strong&gt;最後加入動畫&lt;/strong&gt;：把 &lt;code&gt;setTheme()&lt;/code&gt; 包進 &lt;code&gt;startViewTransition()&lt;/code&gt;，並以獨立 CSS animation 播放本站的日出／日落效果。&lt;li&gt;&lt;strong&gt;對照驗收清單&lt;/strong&gt;：清除存檔、切換 OS 主題、停用 JavaScript、停用 View Transition、開啟 reduced motion，再測 Barba 換頁。&lt;/ol&gt;&lt;p&gt;最後把 View Transition 與太陽動畫拆開：&lt;code&gt;document.startViewTransition()&lt;/code&gt; 只負責主題色的 crossfade，&lt;code&gt;.theme-transition__celestial-motion&lt;/code&gt; 則負責太陽移動。這個拆法很重要，因為瀏覽器不支援 View Transition 時，主題仍要能切換，太陽效果也不應阻止核心功能完成。&lt;h3 id=&quot;不要盲目接受-agent-的第一版&quot;&gt;不要盲目接受 agent 的第一版&lt;/h3&gt;&lt;p&gt;AI agent 可以快速補齊跨 HTML、CSS、JavaScript 的連動，但它不會自動知道哪些狀態是本站的產品決策。至少要人工確認：&lt;ul&gt;&lt;li&gt;&lt;code&gt;localStorage&lt;/code&gt; 讀寫失敗時，私密瀏覽仍能切換。&lt;li&gt;&lt;code&gt;data-theme=&amp;quot;light&amp;quot;&lt;/code&gt; 能覆寫深色 OS，而不是被 &lt;code&gt;@media&lt;/code&gt; 搶回去。&lt;li&gt;FOUC script 沒有使用 &lt;code&gt;defer&lt;/code&gt; 或 &lt;code&gt;async&lt;/code&gt;，且位於主要 stylesheet 之前。&lt;li&gt;&lt;code&gt;startViewTransition&lt;/code&gt; 的 callback 只改主題，不把 overlay 一起拍進快照。&lt;li&gt;動畫未結束、轉場拋錯或瀏覽器不支援時，仍會套用目標主題。&lt;li&gt;Barba 不會讓同一個按鈕累積多個 click listener。&lt;li&gt;深色下文字、表單、搜尋 overlay、程式碼區塊與圖片仍然可讀。&lt;/ul&gt;&lt;p&gt;AI agent 最適合處理「跨檔案的連動修改、邊界情況清單與初步驗收」，人仍要決定品牌色、動畫是否必要，以及什麼才算完成。這次的結果不是把 AI 產生的程式碼直接貼上，而是先讓 agent 理解架構，再用瀏覽器行為逐項驗證。&lt;h2 id=&quot;決策表通用方式-vs-本站取捨&quot;&gt;決策表：通用方式 vs 本站取捨&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;th&gt;優點&lt;th&gt;缺點&lt;th&gt;通用建議&lt;th&gt;kamadiam&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;僅 &lt;code&gt;prefers-color-scheme&lt;/code&gt;&lt;td&gt;零 JS、無 FOUC&lt;td&gt;不能手動切、不能記住&lt;td&gt;極簡個人站可&lt;td&gt;✗&lt;tr&gt;&lt;td&gt;&lt;code&gt;data-theme&lt;/code&gt; + 淺色 &lt;code&gt;:root&lt;/code&gt; + &lt;code&gt;localStorage&lt;/code&gt;&lt;td&gt;可切換、可記住；品牌淺色當預設&lt;td&gt;需維護 JS 與 token&lt;td&gt;✓ 多數內容站&lt;td&gt;✓&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 同步腳本防 FOUC&lt;td&gt;首屏深淺色較穩定&lt;td&gt;多一段維護&lt;td&gt;✓ 建議加&lt;td&gt;✓&lt;tr&gt;&lt;td&gt;dark-first CSS（未設 light 就當深色）&lt;td&gt;照顧深色 OS 首屏&lt;td&gt;淺色首訪可能短閃&lt;td&gt;深色品牌站可考慮&lt;td&gt;✗&lt;tr&gt;&lt;td&gt;CSS &lt;code&gt;light-dark()&lt;/code&gt;&lt;td&gt;宣告較短&lt;td&gt;要按鈕仍靠 JS；舊瀏覽器要 fallback&lt;td&gt;新站、只跟 OS 時可&lt;td&gt;未採用&lt;tr&gt;&lt;td&gt;切主題時用 View Transition&lt;td&gt;換色比較不跳；不支援就瞬間切&lt;td&gt;舊瀏覽器沒過場&lt;td&gt;✓ 想加再加&lt;td&gt;✓ 再加一顆太陽&lt;tr&gt;&lt;td&gt;build-time 多主題&lt;td&gt;可換整套 layout&lt;td&gt;要 rebuild／redeploy&lt;td&gt;活動皮、多品牌&lt;td&gt;與深淺色切換無關&lt;/table&gt;&lt;p&gt;&lt;strong&gt;怎麼選&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;要訪客手動切換 → 用 &lt;code&gt;data-theme&lt;/code&gt;。&lt;li&gt;品牌是暖色淺底（像 kamadiam）→ 淺色寫在 &lt;code&gt;:root&lt;/code&gt;，深色當覆寫。&lt;li&gt;在意首屏穩定 → 在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 加同步腳本（kamadiam 已採用）。&lt;li&gt;主題鈕想加過場 → 用 View Transition 包住改 &lt;code&gt;data-theme&lt;/code&gt;；失敗就瞬間切色。&lt;/ul&gt;&lt;h2 id=&quot;上線前驗收清單&quot;&gt;上線前驗收清單&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;系統淺色、首次進站 → 穩定顯示 light。&lt;li&gt;系統深色、首次進站 → 穩定顯示 dark（有同步腳本時不應先閃淺色）。&lt;li&gt;按切換鈕 → 立即切換，重新整理後仍記住。&lt;li&gt;DevTools → Rendering → Emulate &lt;code&gt;prefers-color-scheme&lt;/code&gt;；清掉 &lt;code&gt;localStorage&lt;/code&gt; 的 &lt;code&gt;theme&lt;/code&gt; 後應跟系統。&lt;li&gt;文字對比大致 ≥ 4.5:1；表單、&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; 在深色下可讀（可搭配 &lt;code&gt;color-scheme&lt;/code&gt;）。&lt;li&gt;Logo／PNG 在深色底沒有白邊（必要時準備 dark 版 SVG）。&lt;li&gt;若用 Barba 或類似 PJAX：確認 &lt;code&gt;data-theme&lt;/code&gt; 掛在被替換的 container 外，且 listener 只綁一次。&lt;li&gt;開「減少動態」時仍能切主題，只是沒有過場。&lt;li&gt;DevTools 關掉 View Transition（或用未支援的瀏覽器）→ 顏色仍立刻切對。&lt;/ol&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;資源&lt;th&gt;適合誰&lt;th&gt;一句話&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;本站 live 示範&lt;/strong&gt;&lt;td&gt;想先看成品再抄架構&lt;td&gt;打開本站 header 的主題鈕，對照本文決策表&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CSS 變數 + &lt;code&gt;data-theme&lt;/code&gt;&lt;/strong&gt;&lt;td&gt;任何靜態站／11ty&lt;td&gt;本文通用實作；不必上 React&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;light-dark()&lt;/code&gt;&lt;/strong&gt;&lt;td&gt;只要跟 OS、程式碼想最短&lt;td&gt;官方文件可查；要按鈕仍回 &lt;code&gt;data-theme&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;切主題過場&lt;/strong&gt;&lt;td&gt;按鈕換色想淡一點&lt;td&gt;View Transition；不支援就瞬間切&lt;tr&gt;&lt;td&gt;&lt;strong&gt;託管（可選）&lt;/strong&gt;&lt;td&gt;做完主題、準備把靜態站推上線&lt;td&gt;&lt;a href=&quot;https://www.hostg.xyz/SHIYV&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hostinger&lt;/a&gt; 可當部署選項之一；主題邏輯與主機無關&lt;/table&gt;&lt;h2 id=&quot;結語&quot;&gt;結語&lt;/h2&gt;&lt;p&gt;深淺色能用，靠兩件事：&lt;strong&gt;語意 token&lt;/strong&gt;（元件不寫死色碼）與 &lt;strong&gt;&lt;code&gt;html&lt;/code&gt; 上的 &lt;code&gt;data-theme&lt;/code&gt;&lt;/strong&gt;。建議順序：系統預設 → 手動可覆寫 → &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 防閃爍。過場可加、可不加。本站淺色當預設，深色靠 &lt;code&gt;data-theme&lt;/code&gt;；切主題時顏色淡入，再加一顆太陽。&lt;p&gt;建議先到本站實際切換一次，對照本文決策表，再把同一套接到你的 Eleventy &lt;code&gt;base&lt;/code&gt; layout。&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN: prefers-color-scheme&lt;/a&gt;：系統深淺色媒體查詢的行為說明。&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN: light-dark()&lt;/a&gt;：依 &lt;code&gt;color-scheme&lt;/code&gt; 在兩個顏色間取值的 CSS 函式。&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/light-dark&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;web.dev: CSS color-scheme-dependent colors with light-dark()&lt;/a&gt;：&lt;code&gt;color-scheme&lt;/code&gt; 與 &lt;code&gt;light-dark()&lt;/code&gt; 如何搭配、以及與媒體查詢的差異。&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN: color-scheme&lt;/a&gt;：讓原生控件／捲軸跟隨深淺色，並啟用 &lt;code&gt;light-dark()&lt;/code&gt;。&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN: View Transition API&lt;/a&gt;：切主題用的 &lt;code&gt;startViewTransition&lt;/code&gt;。&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API/Using&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN: Using the View Transition API&lt;/a&gt;：拍照、改 DOM、淡入的流程。&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN: prefers-reduced-motion&lt;/a&gt;：使用者要求減少動畫時，應跳過過場、只換顏色。&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Oh My Pi（omp）是什麼？終端機 AI Coding Agent 入門介紹</title>
    <link href="https://kamadiam.com/oh-my-pi-introduction/" />
    <updated>2026-08-13T10:33:10Z</updated>
    <id>https://kamadiam.com/oh-my-pi-introduction/</id>
    <content type="html">&lt;p&gt;你在教學文或 GitHub 看到「Oh My Pi」「omp」「&lt;code&gt;curl … omp.sh/install&lt;/code&gt;」，腦內大概會跳出三個問號：&lt;strong&gt;這到底是什麼？要不要再訂一份貴貴訂閱？跟 Cursor、跟 Pi 原版是不是同一個東西只是換皮？&lt;/strong&gt;&lt;p&gt;短答：它是跑在&lt;strong&gt;終端機&lt;/strong&gt;裡的開源 AI 寫程式代理（MIT），指令叫 &lt;code&gt;omp&lt;/code&gt;；官網與安裝腳本掛在 &lt;a href=&quot;https://omp.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;omp.sh&lt;/a&gt;。讀完這篇，你應該能分清名字、判斷適不適合自己，並在自己的專案資料夾跑通第一個「只讀、不改檔」的小任務——先確認它讀得懂 repo，再考慮要不要把改碼大權交出去。AI 改錯一行的殺傷力，有時比咖啡灑在鍵盤上還麻煩。&lt;p&gt;若你更想了解&lt;strong&gt;極簡上游&lt;/strong&gt; Pi Coding Agent，可先看站內的 &lt;a href=&quot;https://kamadiam.com/blog/pi-coding-agent/&quot;&gt;認識 Pi Coding Agent&lt;/a&gt;；本文聚焦 &lt;strong&gt;Oh My Pi 這條「開箱即用」fork&lt;/strong&gt;。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E4%B8%89%E5%80%8B%E5%90%8D%E5%AD%97%E6%80%8E%E9%BA%BC%E5%B0%8D%E4%B8%8A?&quot;&gt;三個名字怎麼對上？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E8%B7%9F-PiCursor-%E5%B7%AE%E5%9C%A8%E5%93%AA?%E6%B1%BA%E7%AD%96%E8%A1%A8&quot;&gt;跟 Pi、Cursor 差在哪？（決策表）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#Oh-My-Pi-%E7%9A%84%E4%B8%89%E5%A4%A7%E8%B3%A3%E9%BB%9E%E7%99%BD%E8%A9%B1&quot;&gt;Oh My Pi 的三大賣點（白話）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E5%AE%89%E8%A3%9D%E8%88%87%E7%AC%AC%E4%B8%80%E5%80%8B%E5%AE%89%E5%85%A8%E4%BB%BB%E5%8B%99&quot;&gt;安裝與第一個安全任務&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E8%A6%81%E4%BB%98%E9%8C%A2%E5%97%8E?&quot;&gt;要付錢嗎？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E5%B8%B8%E8%A6%8B%E8%AA%A4%E8%A7%A3FAQ&quot;&gt;常見誤解（FAQ）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7/%E8%B3%87%E6%BA%90&quot;&gt;推薦工具／資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E7%B5%90%E8%AA%9E%E4%B8%8B%E4%B8%80%E6%AD%A5%E5%81%9A%E4%BB%80%E9%BA%BC?&quot;&gt;結語：下一步做什麼？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/oh-my-pi-introduction/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;三個名字怎麼對上?&quot;&gt;三個名字怎麼對上？&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你看到的&lt;th&gt;實際是什麼&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Oh My Pi&lt;/strong&gt;&lt;td&gt;專案全名，開源在 &lt;a href=&quot;https://github.com/can1357/oh-my-pi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;can1357/oh-my-pi&lt;/a&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;omp&lt;/strong&gt;&lt;td&gt;裝好後在終端機打的指令，也是口語簡稱&lt;tr&gt;&lt;td&gt;&lt;strong&gt;omp.sh&lt;/strong&gt;&lt;td&gt;官網＋文件＋安裝腳本（&lt;code&gt;/install&lt;/code&gt;、&lt;code&gt;/install.ps1&lt;/code&gt;），不是另一個 agent&lt;/table&gt;&lt;p&gt;一句話：&lt;strong&gt;Oh My Pi 是軟體，omp 是你要打的命令，omp.sh 是官網兼安裝入口。&lt;/strong&gt;&lt;p&gt;npm／Bun 套件名是 &lt;code&gt;@oh-my-pi/pi-coding-agent&lt;/code&gt;——給偏好用套件管理器安裝、或要把引擎嵌進自己 TypeScript 專案的人。&lt;h3 id=&quot;跟「Pi-Coding-Agent」是什麼關係?&quot;&gt;跟「Pi Coding Agent」是什麼關係？&lt;/h3&gt;&lt;p&gt;兩者&lt;strong&gt;不是&lt;/strong&gt;同一個可執行檔，也不是同一產品的兩種介面：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Pi 專案（badlogic/pi-mono）
└─ Pi Coding Agent（常見指令：pi）

Oh My Pi（can1357/oh-my-pi，以 Pi 為基礎的 fork）
└─ @oh-my-pi/pi-coding-agent → CLI（常見指令：omp）&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上游 Pi 強調「核心精簡、自己加套件／擴充」；Oh My Pi 把自己定位成 &lt;strong&gt;coding-first fork&lt;/strong&gt;，預設就打包較完整的寫程式工作流（session、subagents、斜槓指令等）。維護者、安裝套件與設定路徑都不同——不要把 &lt;code&gt;pi&lt;/code&gt; 的教學指令原封不動套到 &lt;code&gt;omp&lt;/code&gt;，那不是別名，是兩套 CLI 在裝可愛。&lt;p&gt;本機若兩個都裝過，可用唯讀方式確認身分：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; pi &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pi &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; omp &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; omp &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;command -v pi&lt;/code&gt;（或 &lt;code&gt;omp&lt;/code&gt;）會在 &lt;code&gt;PATH&lt;/code&gt; 裡找這個指令：找到就印出路徑，找不到就失敗。後面的 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 表示「左邊成功才跑右邊」——有裝才執行 &lt;code&gt;--help&lt;/code&gt;，避免沒裝還硬跑、滿屏 &lt;code&gt;command not found&lt;/code&gt;。兩行都印出路徑與說明＝兩套都在；只有一行成功＝只裝了那一個。兩個都存在時，它們是兩套 CLI，不是別名。&lt;h2 id=&quot;跟-PiCursor-差在哪?決策表&quot;&gt;跟 Pi、Cursor 差在哪？（決策表）&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;維度&lt;th&gt;Pi（上游）&lt;th&gt;Oh My Pi（omp）&lt;th&gt;Cursor&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;本質&lt;/strong&gt;&lt;td&gt;極簡終端 harness，靠套件擴充&lt;td&gt;Pi 的 fork，開箱即用、功能打包較齊&lt;td&gt;圖形 IDE＋內建 Agent／Composer&lt;tr&gt;&lt;td&gt;&lt;strong&gt;常見指令&lt;/strong&gt;&lt;td&gt;&lt;code&gt;pi&lt;/code&gt;&lt;td&gt;&lt;code&gt;omp&lt;/code&gt;&lt;td&gt;下載桌面應用&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LSP／偵錯&lt;/strong&gt;&lt;td&gt;多半靠套件再加&lt;td&gt;&lt;strong&gt;內建&lt;/strong&gt; LSP、DAP&lt;td&gt;靠編輯器本身&lt;tr&gt;&lt;td&gt;&lt;strong&gt;改碼保險&lt;/strong&gt;&lt;td&gt;依工具與模型設定&lt;td&gt;強調 &lt;strong&gt;雜湊錨定修改&lt;/strong&gt;（對不上就擋下來）&lt;td&gt;Diff 預覽＋Agent 迴圈&lt;tr&gt;&lt;td&gt;&lt;strong&gt;最適合誰&lt;/strong&gt;&lt;td&gt;想自己拼最小組合的人&lt;td&gt;要終端 workflow、但不想從零組 LSP／子代理&lt;td&gt;喜歡 GUI、多檔視覺化 diff&lt;/table&gt;&lt;p&gt;「改碼保險」不是保險商品，比較像&lt;strong&gt;改檔前的防護網&lt;/strong&gt;：AI 要改某一行時，檔案可能已經被你、別的工具、或上一輪改過；若還照舊記憶硬改，就可能改錯行、弄壞語法。三欄差在防護怎麼做——&lt;ul&gt;&lt;li&gt;&lt;strong&gt;上游 Pi&lt;/strong&gt;：核心很精簡，有沒有這類防護、嚴不嚴格，多半看你裝的工具／設定，以及模型本身夠不夠謹慎，沒有統一的預設保險口號。&lt;li&gt;&lt;strong&gt;Oh My Pi&lt;/strong&gt;：內建雜湊錨定（見下一節例子）：對不上就&lt;strong&gt;擋下這次修改&lt;/strong&gt;，叫 AI 重新看檔再決定。&lt;li&gt;&lt;strong&gt;Cursor&lt;/strong&gt;：常見是給你看 Diff 預覽（你確認再套用），再加上 Agent 迴圈（改完跑測試／再讀錯誤再修）。偏「人眼＋反覆修正」，不是同一套 hash 擋行機制。&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;口語版怎麼選：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;已經用 Cursor、偶爾想在終端做批次重構／測試閉環 → &lt;strong&gt;可以加裝 omp 試試&lt;/strong&gt;，不必二選一。&lt;li&gt;想要極簡、自己挑 package → 用&lt;strong&gt;上游 Pi&lt;/strong&gt;，不是 omp。&lt;li&gt;不想碰終端、只要圖形介面 → &lt;strong&gt;Cursor 就夠&lt;/strong&gt;。終端恐懼不是罪，只是 omp 的舞台不在那裡。&lt;/ul&gt;&lt;p&gt;任務級分工（同一 worktree 別兩邊同時寫檔）可記這張精簡表：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;任務類型&lt;th&gt;首選&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;UI 調像素、元件預覽&lt;td&gt;Cursor&lt;tr&gt;&lt;td&gt;跨很多檔 rename／重構、跑測試閉環&lt;td&gt;omp&lt;tr&gt;&lt;td&gt;子代理並行、native／除錯器&lt;td&gt;omp&lt;tr&gt;&lt;td&gt;PR 前結構化 review（&lt;code&gt;/review&lt;/code&gt;）&lt;td&gt;omp&lt;tr&gt;&lt;td&gt;單檔小改、邊看邊改&lt;td&gt;看你人在 IDE 還是終端&lt;/table&gt;&lt;p&gt;兩個 agent 同時改同一檔，最後通常不是協作，是 merge conflict 的聯誼會。&lt;h2 id=&quot;Oh-My-Pi-的三大賣點白話&quot;&gt;Oh My Pi 的三大賣點（白話）&lt;/h2&gt;&lt;p&gt;一般聊天式 AI 是「給你一段 code，你自己貼回去」。omp 直接連你的終端、檔案系統，甚至偵錯器——少了那一趟複製貼上馬拉松，手指會感謝你。&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;雜湊錨定修改（Hash-anchored edits）&lt;/strong&gt;&lt;br&gt;改某一行前，先對那一行內容算一張「指紋」（hash）。執行時若指紋對不上＝這行已經不是剛才那樣子 → &lt;strong&gt;直接擋下&lt;/strong&gt;，而不是硬貼上去。&lt;br&gt;例如 AI 當初看到 &lt;code&gt;const port = 3000&lt;/code&gt;，要改成 &lt;code&gt;8080&lt;/code&gt;；若這時你已手動改成 &lt;code&gt;const port = 4000&lt;/code&gt;，指紋就不一樣 → omp 拒絕這次套用，降低「AI 改錯行把專案搞爛」的機率。&lt;li&gt;&lt;p&gt;&lt;strong&gt;內建 LSP／DAP（有點像把 IDE 能力接到 agent）&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LSP&lt;/strong&gt;：rename、跳到定義、找引用、看診斷（紅線），比較像「懂語意」而不是純文字搜尋取代。&lt;li&gt;&lt;strong&gt;DAP&lt;/strong&gt;：可接真實 debugger（例如設斷點、單步看變數），適合找邏輯錯或 native crash，而不是只靠猜——猜 bug 很像喝冰美式解渴：短暫清醒，問題還在。&lt;/ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;子代理（&lt;code&gt;task&lt;/code&gt;）並行&lt;/strong&gt;&lt;br&gt;主代理可派多個子代理分工；必要時用隔離工作區，減少大家搶同一份檔案互踩。適合大範圍重構、探索＋實作並行這類任務。&lt;/ol&gt;&lt;p&gt;另外：官方定位支援大量模型供應商，可用斜槓指令切換模型；簡單搜尋用便宜模型、架構難題用強模型，是常見用法。首次執行也常會讀既有的 &lt;code&gt;.cursor&lt;/code&gt;、&lt;code&gt;.claude&lt;/code&gt;、&lt;code&gt;.vscode&lt;/code&gt; 等規則／MCP，減少手動搬家。&lt;p&gt;同一套引擎還有幾種入口：互動 TUI（&lt;code&gt;omp&lt;/code&gt;）、單次 &lt;code&gt;omp -p &amp;quot;…&amp;quot;&lt;/code&gt;、Node SDK、以及 RPC／ACP（讓其他編輯器驅動）。新手先會前兩種就夠。&lt;h2 id=&quot;安裝與第一個安全任務&quot;&gt;安裝與第一個安全任務&lt;/h2&gt;&lt;h3 id=&quot;安裝擇一&quot;&gt;安裝（擇一）&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;macOS／Linux：&lt;/strong&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://omp.sh/install &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;也可用 Homebrew：&lt;code&gt;brew install can1357/tap/omp&lt;/code&gt;。&lt;p&gt;&lt;strong&gt;Windows（PowerShell）：&lt;/strong&gt;&lt;pre class=&quot;language-powershell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;irm&lt;/span&gt; https:&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;omp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sh/install&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ps1 &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;iex&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Bun（JS／TS 開發者）：&lt;/strong&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;bun &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; @oh-my-pi/pi-coding-agent&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;確認：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;omp &lt;span class=&quot;token parameter variable&quot;&gt;--help&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;找不到指令時，先重開終端，或檢查安裝目錄是否在 &lt;code&gt;PATH&lt;/code&gt;。&lt;h3 id=&quot;登入模型後,先做「只讀」任務&quot;&gt;登入模型後，先做「只讀」任務&lt;/h3&gt;&lt;p&gt;在專案目錄執行 &lt;code&gt;omp&lt;/code&gt;，進互動介面後：&lt;ol&gt;&lt;li&gt;&lt;code&gt;/login&lt;/code&gt; — 選供應商並完成驗證（金鑰留在本機設定流程，&lt;strong&gt;不要&lt;/strong&gt;貼進專案再 commit）。&lt;li&gt;&lt;code&gt;/models&lt;/code&gt; — 確認／切換模型。&lt;li&gt;&lt;code&gt;/help&lt;/code&gt; — 看目前版本支援的斜槓指令。&lt;/ol&gt;&lt;p&gt;第一句建議寫死邊界，例如：&lt;blockquote&gt;&lt;p&gt;請列出目前專案的主要資料夾，找出 README.md，並用三點摘要用途。&lt;strong&gt;只讀取，不要修改檔案。&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;或單次模式：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;omp &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;列出目前專案的主要資料夾，並用三點摘要 README.md；不要修改檔案&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;預期：能讀到工作目錄、回摘要、&lt;strong&gt;沒有&lt;/strong&gt;產生檔案變更。之後再用 &lt;code&gt;omp&lt;/code&gt; 做多步修改；&lt;code&gt;omp --resume&lt;/code&gt;／&lt;code&gt;--continue&lt;/code&gt; 可接回舊 session。&lt;p&gt;更完整的安裝排查、工作模式與第一個「小改碼」任務，適合另寫一篇 how-to；本稿先把「這是什麼」講清楚就收工。&lt;h2 id=&quot;要付錢嗎?&quot;&gt;要付錢嗎？&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;th&gt;要不要錢&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Oh My Pi 軟體本身&lt;/strong&gt;&lt;td&gt;不用。MIT 開源，安裝免費&lt;tr&gt;&lt;td&gt;&lt;strong&gt;模型推理（API）&lt;/strong&gt;&lt;td&gt;要。跟 Cursor 訂閱池不同，omp 多半走你自帶的 provider（Anthropic、OpenAI、Google 等）或 OAuth 登入&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;td&gt;可選訂閱；跟 omp 並存時，兩邊可能各自算用量&lt;/table&gt;&lt;p&gt;白話：&lt;strong&gt;omp 不是另一個 IDE 訂閱&lt;/strong&gt;，比較像「免費的終端 harness + 你自己的 API 帳單」。想控成本，可以簡單任務用便宜模型、大重構再切強模型——這是 omp 常見用法，不是必裝功能。軟體免費、token 不免費：這句話值得印在鍵盤旁邊。&lt;h2 id=&quot;常見誤解FAQ&quot;&gt;常見誤解（FAQ）&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Oh My Pi 是 Pi 的官方新版嗎？&lt;/strong&gt;&lt;br&gt;不是。它是 Can Bölük 維護的&lt;strong&gt;獨立 fork&lt;/strong&gt;，跟 Mario Zechner 的上游 Pi 不同 repo、不同 CLI（&lt;code&gt;omp&lt;/code&gt; vs &lt;code&gt;pi&lt;/code&gt;）。&lt;p&gt;&lt;strong&gt;omp.sh 是 npm 套件嗎？&lt;/strong&gt;&lt;br&gt;不是。&lt;code&gt;omp.sh&lt;/code&gt; 是官網與安裝腳本；npm 套件名是 &lt;code&gt;@oh-my-pi/pi-coding-agent&lt;/code&gt;。&lt;p&gt;&lt;strong&gt;它是 Cursor 外掛嗎？&lt;/strong&gt;&lt;br&gt;不是。它是終端機程式。首次執行常會&lt;strong&gt;讀取&lt;/strong&gt; &lt;code&gt;.cursor&lt;/code&gt; 規則，方便跟 Cursor 並存，但不是 Cursor 裡的一個按鈕。&lt;p&gt;&lt;strong&gt;我該選 Pi 還是 omp？&lt;/strong&gt;&lt;br&gt;想自己拼最小 harness → &lt;strong&gt;Pi&lt;/strong&gt;。想終端開箱即用、內建 LSP／子代理 → &lt;strong&gt;omp&lt;/strong&gt;。詳見上文決策表。&lt;p&gt;&lt;strong&gt;跟 Claude Code 比呢？&lt;/strong&gt;&lt;br&gt;Claude Code 也是終端 agent，但綁 Anthropic 生態、內建工具集不同。若你已深度用 Claude Code，不必為了「跟風」硬換；若你在找 &lt;strong&gt;Pi fork + 多 provider + 內建 LSP/task&lt;/strong&gt;，才值得試 omp。&lt;p&gt;&lt;strong&gt;什麼情境不適合 omp？&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;幾乎不碰終端、只要 GUI diff 預覽 → Cursor 就夠&lt;li&gt;想自己控制每一個擴充、討厭預設打包 → 上游 Pi&lt;li&gt;主要工作是筆記庫維護、內容研究流 → Cursor／編輯器 skills 通常比較合（omp 擅長的是 coding worktree，不是 vault 工作流）&lt;/ul&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;適合誰&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://omp.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Oh My Pi（omp）&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;要終端機 coding agent、希望 LSP／子代理等預設就有，不想從零組 harness&lt;tr&gt;&lt;td&gt;&lt;strong&gt;上游 &lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi Coding Agent&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;要極簡核心、自己用套件擴充；細節見 &lt;a href=&quot;https://kamadiam.com/blog/pi-coding-agent/&quot;&gt;認識 Pi Coding Agent&lt;/a&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;td&gt;日常 GUI 編輯、預覽、筆記流；可與 omp 並存但別同目錄同時寫檔&lt;/table&gt;&lt;p&gt;沒有「誰完勝」——取捨是介面與預設功能量，不是誰比較潮。&lt;h2 id=&quot;結語下一步做什麼?&quot;&gt;結語：下一步做什麼？&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;名字&lt;/strong&gt;：Oh My Pi＝專案；&lt;code&gt;omp&lt;/code&gt;＝指令；&lt;code&gt;omp.sh&lt;/code&gt;＝官網／安裝。&lt;li&gt;&lt;strong&gt;定位&lt;/strong&gt;：Pi 的 coding-first fork，不是 Cursor 外掛，也不是上游 Pi 的官方更名版。&lt;li&gt;&lt;strong&gt;動手&lt;/strong&gt;：裝好 → &lt;code&gt;/login&lt;/code&gt; → 用「只讀」小任務驗證，再決定要不要當日常終端工具。&lt;/ol&gt;&lt;p&gt;打開 &lt;a href=&quot;https://omp.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;omp.sh&lt;/a&gt;，照官方安裝腳本裝好 &lt;code&gt;omp&lt;/code&gt;，在任一小型專案目錄跑一輪只讀摘要——先確認它讀得懂你的 repo，再交給它改碼。審完再來一杯；token 帳單也記得瞄一眼。&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://omp.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Oh My Pi 官網（omp.sh）&lt;/a&gt; — 產品定位、安裝腳本與功能總覽&lt;li&gt;&lt;a href=&quot;https://github.com/can1357/oh-my-pi&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;can1357/oh-my-pi（GitHub）&lt;/a&gt; — 原始碼、README 與授權（MIT）&lt;li&gt;&lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi Coding Agent（pi.dev）&lt;/a&gt; — 上游極簡終端 agent，對照 Oh My Pi 的 fork 定位&lt;li&gt;&lt;a href=&quot;https://microsoft.github.io/language-server-protocol/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Language Server Protocol&lt;/a&gt; — LSP 規格：rename、定義跳轉、診斷等語意能力&lt;li&gt;&lt;a href=&quot;https://microsoft.github.io/debug-adapter-protocol/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Debug Adapter Protocol&lt;/a&gt; — DAP 規格：與真實 debugger 溝通的介面&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>11ty vs Hugo vs Astro 怎麼選？靜態站產生器決策指南</title>
    <link href="https://kamadiam.com/11ty-vs-hugo-vs-astro/" />
    <updated>2026-08-13T03:55:00Z</updated>
    <id>https://kamadiam.com/11ty-vs-hugo-vs-astro/</id>
    <content type="html">&lt;p&gt;你已經大概知道 WordPress 不是唯一答案，也聽過「靜態站比較快、比較安全」。結果一搜框架，Hugo、Eleventy（11ty）、Astro 三邊都說自己最適合部落格——讀起來像三杯咖啡同時跟你保證「我這杯最提神」。&lt;p&gt;選錯的代價很實在：遷移白做一輪、CI build 等到你懷疑人生，或為了用 React 元件硬上 Astro，結果整站只有純文章，卻多了一層元件編譯。這篇不幫你選「2026 最潮框架」，而是幫你回答：&lt;strong&gt;以你的文章量、團隊技能、要不要互動元件&lt;/strong&gt;，三個候選裡誰最不容易後悔。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E5%85%88%E7%A2%BA%E8%AA%8D%E4%BD%A0%E7%9C%9F%E7%9A%84%E9%9C%80%E8%A6%81-SSG-%E5%97%8E?&quot;&gt;先確認：你真的需要 SSG 嗎？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E4%B8%89%E5%80%8B%E6%A1%86%E6%9E%B6%E4%B8%80%E5%8F%A5%E8%A9%B1%E5%AE%9A%E4%BD%8D&quot;&gt;三個框架一句話定位&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#60-%E7%A7%92%E4%B8%BB%E6%B1%BA%E7%AD%96%E8%A1%A8%E5%85%88%E5%9C%88%E5%87%BA-1~2-%E5%80%8B%E5%80%99%E9%81%B8&quot;&gt;60 秒主決策表：先圈出 1～2 個候選&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E8%A6%8F%E6%A0%BC%E6%AF%94%E8%BC%83%E8%A1%A8%E7%9F%A5%E9%81%93-trade-off-%E5%9C%A8%E5%93%AA&quot;&gt;規格比較表：知道 trade-off 在哪&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#Build-%E9%80%9F%E5%BA%A6%E5%88%A5%E7%82%BA%E4%BA%86-benchmark-%E9%81%B8%E9%8C%AF%E6%A1%86%E6%9E%B6&quot;&gt;Build 速度：別為了 benchmark 選錯框架&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E5%85%A7%E5%AE%B9%E7%B6%B2%E7%AB%99%E6%83%85%E5%A2%83%E8%AA%B0%E6%AF%94%E8%BC%83%E9%A0%86?&quot;&gt;內容網站情境：誰比較順？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E5%85%A9%E5%85%A9%E5%B0%8D%E6%89%93%E4%BD%A0%E5%8D%A1%E5%9C%A8%E8%AA%B0%E8%B7%9F%E8%AA%B0%E4%B9%8B%E9%96%93?&quot;&gt;兩兩對打：你卡在誰跟誰之間？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#10-%E5%88%86%E9%90%98-hello-world%E9%81%B8%E5%9E%8B%E5%BF%85%E5%81%9A&quot;&gt;10 分鐘 hello-world：選型必做&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E9%81%B8%E5%AE%8C%E6%A1%86%E6%9E%B6%E4%B9%8B%E5%BE%8C%E7%9A%84%E4%B8%89%E4%BB%B6%E4%BA%8B&quot;&gt;選完框架之後的三件事&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E5%B8%B8%E8%A6%8B%E5%95%8F%E9%A1%8C&quot;&gt;常見問題&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E7%B5%90%E8%AA%9E%E9%81%B8%E8%83%BD%E7%B6%AD%E8%AD%B7%E7%9A%84,%E4%B8%8D%E6%98%AF%E9%81%B8-benchmark-%E5%86%A0%E8%BB%8D&quot;&gt;結語：選能維護的，不是選 benchmark 冠軍&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-vs-hugo-vs-astro/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先確認你真的需要-SSG-嗎?&quot;&gt;先確認：你真的需要 SSG 嗎？&lt;/h2&gt;&lt;p&gt;在 Hugo、11ty、Astro 裡三選一之前，先確認你該走「純靜態 SSG」這條路，而不是續用 WordPress、Statamic 或 Wix 這類 SaaS。框架選型是第二關，第一關是「你到底要不要靜態化」——還沒過第一關就選 Astro，有點像還沒決定要煮咖啡就先買磨豆機。&lt;p&gt;若你符合下面多數條件，再往下讀框架比較：&lt;ul&gt;&lt;li&gt;每月新文不多（例如 ≤ 30 篇），格式相近（教學、比較、清單）&lt;li&gt;至少一人會 git，或願意學「改 Markdown → push → 自動 deploy」&lt;li&gt;不需要訪客登入、購物車、即時庫存&lt;li&gt;痛點包含被駭、外掛衝突、主機慢、Core Web Vitals 拉不起來&lt;li&gt;可接受沒有 wp-admin（或願意走 Headless 混合架構）&lt;/ul&gt;&lt;p&gt;若編輯&lt;strong&gt;一定要網頁後台&lt;/strong&gt;，別硬選 SSG——先看 Statamic 或 Headless WordPress。若一週內要上線、零技術，SaaS 可能更實際。還在猶豫要不要離開 WP，可以先讀站內的 &lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/&quot;&gt;WordPress vs 11ty 比較&lt;/a&gt;，別還沒決定「要不要靜態」就選框架。&lt;h2 id=&quot;三個框架一句話定位&quot;&gt;三個框架一句話定位&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;一句話&lt;th&gt;典型誰在用&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;td&gt;Go 寫的極速印表機，模板用 Go template&lt;td&gt;頁數破千的部落格、多語系大站、技術文件&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Eleventy（11ty）&lt;/strong&gt;&lt;td&gt;JS 極簡派，模板語言你愛用哪種就哪種&lt;td&gt;個人站、內容網站、想完全掌控輸出的人&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;td&gt;內容優先 SSG，預設零 JS，要互動才長 Islands&lt;td&gt;新開內容站、要比較表有一點互動、MDX 愛好者&lt;/table&gt;&lt;p&gt;白話說，三者都是「離線印報紙」：本機或 CI 執行 &lt;code&gt;build&lt;/code&gt;，把 Markdown 和模板烤成 &lt;code&gt;_site/&lt;/code&gt; 或 &lt;code&gt;dist/&lt;/code&gt; 裡的 HTML，再上傳 CDN。訪客看到的是靜態檔，沒有 wp-admin、沒有 PHP——PHP 可以下班了，你也不用半夜擔心外掛更新。&lt;h2 id=&quot;60-秒主決策表先圈出-1~2-個候選&quot;&gt;60 秒主決策表：先圈出 1～2 個候選&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的狀況&lt;th&gt;優先考慮&lt;th&gt;為什麼&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;文章 &lt;strong&gt;500 篇以下&lt;/strong&gt;、團隊只會一點 JS、要極瘦 HTML&lt;td&gt;&lt;strong&gt;11ty&lt;/strong&gt;&lt;td&gt;build 夠快、無框架鎖定；純 Markdown 教學／比較文維護成本低&lt;tr&gt;&lt;td&gt;同上，但想要 &lt;strong&gt;Content Collections、MDX、頁面裡嵌 React 比較表&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;td&gt;Islands 只 hydration 需要互動的區塊&lt;tr&gt;&lt;td&gt;文章 &lt;strong&gt;3,000+ 篇&lt;/strong&gt; 或 CI build &lt;strong&gt;常超 2 分鐘&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;td&gt;Go 引擎對大站友好；多語系路由成熟&lt;tr&gt;&lt;td&gt;想 &lt;strong&gt;最快套現成皮&lt;/strong&gt;、少改程式（像套 Hugo 主題）&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;td&gt;&lt;a href=&quot;https://themes.gohugo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;themes.gohugo.io&lt;/a&gt; 主題市場大&lt;tr&gt;&lt;td&gt;要 &lt;strong&gt;npm 外掛&lt;/strong&gt;（圖片管道、Obsidian 同步、自訂 JS 資料源）&lt;td&gt;&lt;strong&gt;11ty&lt;/strong&gt;&lt;td&gt;全 npm 生態；&lt;code&gt;eleventy.config.js&lt;/code&gt; 就是 JS&lt;tr&gt;&lt;td&gt;要 &lt;strong&gt;內建多語系 i18n&lt;/strong&gt;、不想靠外掛&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;td&gt;i18n 第一公民&lt;tr&gt;&lt;td&gt;文末推薦區塊、比較表版型要 &lt;strong&gt;完全自控&lt;/strong&gt;、長期零框架風險&lt;td&gt;&lt;strong&gt;11ty&lt;/strong&gt;&lt;td&gt;沒有元件編譯步驟，十年後還能維護&lt;tr&gt;&lt;td&gt;文章靜態、但底部要 &lt;strong&gt;篩選器／計算機&lt;/strong&gt; 等互動&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;td&gt;&lt;code&gt;client:visible&lt;/code&gt; 捲到才載 JS，不拖慢全文&lt;tr&gt;&lt;td&gt;已有一堆 &lt;strong&gt;Nunjucks／JS&lt;/strong&gt; 資產&lt;td&gt;&lt;strong&gt;11ty&lt;/strong&gt;&lt;td&gt;不必重寫成 Go template&lt;/table&gt;&lt;p&gt;圈出候選後，&lt;strong&gt;各花 10 分鐘跑 hello-world&lt;/strong&gt;（文末有指令），比看十篇 benchmark 文還準。哪個讓你更快「改標題 + 加一篇假文 + 看到 HTML」，長期就選那個——手感順的框架，比社群吵架文可靠。&lt;h2 id=&quot;規格比較表知道-trade-off-在哪&quot;&gt;規格比較表：知道 trade-off 在哪&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;面向&lt;th&gt;Hugo&lt;th&gt;Eleventy（11ty）&lt;th&gt;Astro&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;語言／環境&lt;/strong&gt;&lt;td&gt;Go 單一執行檔，&lt;strong&gt;不用裝 Node&lt;/strong&gt;&lt;td&gt;Node.js 18+&lt;td&gt;Node.js 18+&lt;tr&gt;&lt;td&gt;&lt;strong&gt;模板&lt;/strong&gt;&lt;td&gt;Go template（學習曲線陡）&lt;td&gt;Nunjucks、Liquid、MD…可混&lt;td&gt;&lt;code&gt;.astro&lt;/code&gt; + 可選 React/Vue/Svelte&lt;tr&gt;&lt;td&gt;&lt;strong&gt;預設 JS 輸出&lt;/strong&gt;&lt;td&gt;0（除非你加）&lt;td&gt;0&lt;td&gt;0（Islands 才加）&lt;tr&gt;&lt;td&gt;&lt;strong&gt;約 1,000 頁 build&lt;/strong&gt;&lt;td&gt;約 &lt;strong&gt;數秒級&lt;/strong&gt;&lt;td&gt;約 &lt;strong&gt;30 秒級&lt;/strong&gt;（視外掛而定）&lt;td&gt;約 &lt;strong&gt;45 秒級&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;多語系 i18n&lt;/strong&gt;&lt;td&gt;內建強&lt;td&gt;需外掛&lt;td&gt;內建路由支援&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MDX／元件&lt;/strong&gt;&lt;td&gt;有限&lt;td&gt;靠外掛&lt;td&gt;&lt;strong&gt;原生強&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;主題生態&lt;/strong&gt;&lt;td&gt;上百個現成主題&lt;td&gt;Starter 專案 + 自訂 &lt;code&gt;layouts/&lt;/code&gt;&lt;td&gt;官方模板 + 元件化&lt;tr&gt;&lt;td&gt;&lt;strong&gt;最適託管&lt;/strong&gt;&lt;td&gt;任何靜態主機&lt;td&gt;Cloudflare Pages、Netlify、Hostinger&lt;td&gt;同上&lt;/table&gt;&lt;p&gt;數字會因機器、圖片外掛、模板複雜度而變——&lt;strong&gt;重點是比較級距&lt;/strong&gt;，不是死記秒數。Go template 學起來像另一門語言，但 Hugo 不會因為你還在背 &lt;code&gt;range&lt;/code&gt; 就幫你 build 快一點。&lt;h2 id=&quot;Build-速度別為了-benchmark-選錯框架&quot;&gt;Build 速度：別為了 benchmark 選錯框架&lt;/h2&gt;&lt;p&gt;很多人選 Hugo 只因為「build 最快」。這在&lt;strong&gt;超大站&lt;/strong&gt;確實重要；但對內容網站，&lt;strong&gt;上線後的 Core Web Vitals 比本機 build 幾秒更影響 SEO&lt;/strong&gt;。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;基準情境&lt;th&gt;Hugo&lt;th&gt;11ty&lt;th&gt;Astro&lt;th&gt;怎麼讀&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;約 4,000 篇 Markdown（&lt;a href=&quot;https://www.11ty.dev/docs/performance/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;11ty 官方基準&lt;/a&gt;）&lt;td&gt;&lt;strong&gt;0.68s&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;1.93s&lt;/strong&gt;&lt;td&gt;~23s（2022 基準）&lt;td&gt;大站 Hugo 優勢明顯&lt;tr&gt;&lt;td&gt;約 1,000 頁（業界常引級距）&lt;td&gt;約 1～3s&lt;td&gt;約 5～15s&lt;td&gt;約 45s 級&lt;td&gt;中小站都可接受&lt;tr&gt;&lt;td&gt;上線後客端 JS（預設）&lt;td&gt;&lt;strong&gt;0 KB&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;0 KB&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;0 KB&lt;/strong&gt;&lt;td&gt;三者都能衝 Lighthouse 98+&lt;/table&gt;&lt;p&gt;&lt;strong&gt;幾百篇的個人站&lt;/strong&gt;：11ty 和 Hugo 上線後速度通常差不多，CDN 一掛 TTFB 多在 10～30ms 級。&lt;strong&gt;別為了省 10 秒 build 去啃 Go template&lt;/strong&gt;，除非你已經確定 CI 是瓶頸。&lt;p&gt;若你選 11ty 卻覺得 build 變慢，先查：圖片外掛、build 時打外部 API、或未 memoize 的 filter——不一定代表該換 Hugo，有時只是某個 filter 在偷跑馬拉松。&lt;h2 id=&quot;內容網站情境誰比較順?&quot;&gt;內容網站情境：誰比較順？&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情境&lt;th&gt;建議&lt;th&gt;對 SEO／變現的影響&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;比較文、教學文為主，月發 4～8 篇，要衝 Core Web Vitals&lt;td&gt;&lt;strong&gt;11ty 或 Astro&lt;/strong&gt;&lt;td&gt;頁面瘦 → GSC 體驗報表較好看&lt;tr&gt;&lt;td&gt;文末推薦、比較表版型要統一，互動少&lt;td&gt;&lt;strong&gt;11ty&lt;/strong&gt;&lt;td&gt;Nunjucks 版型直覺，輸出極瘦&lt;tr&gt;&lt;td&gt;文章 + 互動比較表篩選器 + 偶爾 MDX&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;td&gt;Islands 控 JS 預算，正文仍靜態&lt;tr&gt;&lt;td&gt;站齡久、&lt;strong&gt;上千篇舊文&lt;/strong&gt;要一次遷移&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt; 或分批遷移 + 11ty&lt;td&gt;build 時間影響 CI 成本與專案排程&lt;tr&gt;&lt;td&gt;Obsidian vault → 網站工作流&lt;td&gt;&lt;strong&gt;11ty&lt;/strong&gt;&lt;td&gt;與 npm 生態、Markdown 工作流契合&lt;tr&gt;&lt;td&gt;週末上線個人部落格、想最快套皮&lt;td&gt;&lt;strong&gt;Hugo + 主題&lt;/strong&gt;&lt;td&gt;主題一行掛上即可&lt;tr&gt;&lt;td&gt;完全不想碰 CLI，編輯要自己發文&lt;td&gt;&lt;strong&gt;跳過 SSG&lt;/strong&gt;&lt;td&gt;改看 Statamic 或 Headless WP&lt;/table&gt;&lt;h2 id=&quot;兩兩對打你卡在誰跟誰之間?&quot;&gt;兩兩對打：你卡在誰跟誰之間？&lt;/h2&gt;&lt;h3 id=&quot;11ty-vs-Hugo極速-SSG-二選一&quot;&gt;11ty vs Hugo：極速 SSG 二選一&lt;/h3&gt;&lt;p&gt;兩邊預設都是零 JS、Jamstack 路線。差別在&lt;strong&gt;誰更適合你的團隊與規模&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;選 &lt;strong&gt;11ty&lt;/strong&gt;：頁數還沒破千、團隊熟悉 JS／Nunjucks、要 npm 外掛、文章與推薦區塊版型完全自控&lt;li&gt;選 &lt;strong&gt;Hugo&lt;/strong&gt;：三千篇以上、CI 常超 2 分鐘、內建多語系、想最快套現成主題&lt;/ul&gt;&lt;p&gt;Hugo 的 Go template 學習曲線比 Nunjucks 陡；11ty 沒有 Hugo 那種「一行掛主題」的生態，但換來你擁有全部 layout 原始碼。想再深入，可搭配站內 &lt;a href=&quot;https://kamadiam.com/static-site-generators/&quot;&gt;靜態網站產生器入門&lt;/a&gt; 一起看。&lt;h3 id=&quot;11ty-vs-AstroJavaScript-陣營二選一&quot;&gt;11ty vs Astro：JavaScript 陣營二選一&lt;/h3&gt;&lt;p&gt;兩邊都跑在 Node.js，但工作流差很多：&lt;ul&gt;&lt;li&gt;選 &lt;strong&gt;11ty&lt;/strong&gt;：純 Markdown 進、HTML 出；互動用原生 JS 或 Web Components 就夠&lt;li&gt;選 &lt;strong&gt;Astro&lt;/strong&gt;：要 React 元件、Content Collections 型別檢查、比較表篩選器用 &lt;code&gt;client:visible&lt;/code&gt;&lt;/ul&gt;&lt;p&gt;Astro 的 Islands 讓整頁先當純 HTML 送出，只有標了 &lt;code&gt;client:*&lt;/code&gt; 的區塊才載入 JS——適合「3000 字正文靜態、底部篩選器要互動」的長文頁。若你只是放幾個推薦連結或按鈕，11ty 的純 HTML 往往更簡，不必為了兩顆按鈕請整艘 React 郵輪進港。&lt;h2 id=&quot;10-分鐘-hello-world選型必做&quot;&gt;10 分鐘 hello-world：選型必做&lt;/h2&gt;&lt;p&gt;選出 2 個候選後，各花 10 分鐘跑完——感受比讀文重要。&lt;p&gt;&lt;strong&gt;Eleventy&lt;/strong&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; my-11ty-test &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; my-11ty-test
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @11ty/eleventy
npx @11ty/eleventy &lt;span class=&quot;token parameter variable&quot;&gt;--init&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;# Hello&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; content/index.md
npx @11ty/eleventy &lt;span class=&quot;token parameter variable&quot;&gt;--serve&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 瀏覽器 http://localhost:8080 應看到標題&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; create astro@latest my-astro-test
&lt;span class=&quot;token comment&quot;&gt;# 選 Empty 或 Blog 模板&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; my-astro-test &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; run dev
&lt;span class=&quot;token comment&quot;&gt;# 瀏覽器 http://localhost:4321&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 需先安裝 Hugo：https://gohugo.io/installation/&lt;/span&gt;
hugo new site my-hugo-test &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; my-hugo-test
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; init
hugo new content posts/first.md
hugo server &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 瀏覽器 http://localhost:1313&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 新手可 clone themes.gohugo.io 上的示範站，少踩 layout 坑&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;若兩個都順，內容網站優先&lt;strong&gt;輸出最瘦、CI 最穩&lt;/strong&gt;的那個——通常是 11ty 或 Hugo。&lt;h2 id=&quot;選完框架之後的三件事&quot;&gt;選完框架之後的三件事&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;託管&lt;/strong&gt;：Cloudflare Pages、Netlify 或 &lt;a href=&quot;https://www.hostg.xyz/SHIYV&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hostinger&lt;/a&gt; 靜態空間都可以。若你已經用 11ty，站內 &lt;a href=&quot;https://kamadiam.com/11ty-hostinger-cache-setup/&quot;&gt;11ty 與 Hostinger 快取設定&lt;/a&gt; 也值得先 bookmark。&lt;li&gt;&lt;strong&gt;HTTPS&lt;/strong&gt;：靜態站一樣要憑證。可參考站內 &lt;a href=&quot;https://kamadiam.com/free-ssl-certificate/&quot;&gt;免費 SSL 憑證教學&lt;/a&gt;。&lt;li&gt;&lt;strong&gt;遷移 SEO&lt;/strong&gt;：若從 WordPress 來，URL、301、sitemap、canonical 仍要維護——別以為換框架就自動升級排名。&lt;/ol&gt;&lt;h2 id=&quot;常見問題&quot;&gt;常見問題&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：2026 大家都說 Astro 是預設，我還用 11ty 會不會過時？&lt;/strong&gt;&lt;p&gt;不會。Astro 適合「想要元件模型、MDX、多框架」的站；&lt;strong&gt;純 Markdown 教學／比較文&lt;/strong&gt;用 11ty 往往更簡、build 設定更少。兩邊都是活躍專案，過時的是「沒在發文」，不是「沒換框架」。&lt;p&gt;&lt;strong&gt;Q：Hugo 這麼快，為什麼還有人主力用 11ty？&lt;/strong&gt;&lt;p&gt;Go template 學習成本、與現有 JS／Nunjucks 資產的相容性。頁數還沒破千時，&lt;strong&gt;11ty build 夠用&lt;/strong&gt;；日後若 CI 變瓶頸再評估 Hugo 遷移。&lt;p&gt;&lt;strong&gt;Q：我已經有 11ty 站，要為了潮流換 Astro 嗎？&lt;/strong&gt;&lt;p&gt;沒有「需要 React 元件卻硬用 Nunjucks 拼」的痛點就&lt;strong&gt;不必換&lt;/strong&gt;。遷移有 URL、模板、CI 成本。&lt;a href=&quot;https://docs.astro.build/en/guides/migrate-to-astro/from-eleventy/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Astro 官方有從 Eleventy 遷移指南&lt;/a&gt;，但那是你有明確互動需求時才值得開的專案。&lt;p&gt;&lt;strong&gt;Q：Jekyll 呢？&lt;/strong&gt;&lt;p&gt;已在 GitHub Pages 上、文章少可以繼續。&lt;strong&gt;新開個人站、要衝 SEO 與維護效率&lt;/strong&gt;，優先 11ty／Astro／Hugo。&lt;h2 id=&quot;結語選能維護的,不是選-benchmark-冠軍&quot;&gt;結語：選能維護的，不是選 benchmark 冠軍&lt;/h2&gt;&lt;p&gt;Hugo、11ty、Astro 都能做出極快的靜態內容站。真正會讓你後悔的，通常不是「差 10 秒 build」，而是：&lt;ol&gt;&lt;li&gt;選了 Go template 卻團隊只會 JS&lt;li&gt;為了互動硬上 Astro，結果整站只有純文章&lt;li&gt;三千篇舊文用 11ty 卻沒評估 CI 時間&lt;/ol&gt;&lt;p&gt;先用 60 秒決策表圈候選，再各跑 10 分鐘 hello-world。選定後把託管、HTTPS、遷移 SEO 一次做完——框架只是起點，&lt;strong&gt;能持續發文、GSC 體驗報表維持綠色&lt;/strong&gt;，才是個人站長期流量與轉換的基礎。&lt;p&gt;若你已經圈出 11ty 或 Hugo，下一步可以開一個最小專案、部署到 &lt;a href=&quot;https://www.hostg.xyz/SHIYV&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hostinger&lt;/a&gt; 或 Cloudflare Pages，用真實網域跑一次 &lt;a href=&quot;https://pagespeed.web.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PageSpeed Insights&lt;/a&gt;——比較表選對了，馬上就能驗證。驗收完再來一杯咖啡；這次等的是 deploy，不是 CI。&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/docs/performance/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Eleventy 官方文件 — Performance&lt;/a&gt;：11ty 與其他 SSG 的 build 速度基準與優化建議。&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/concepts/why-astro/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Astro 官方 — Why Astro&lt;/a&gt;：Astro 內容優先與 Islands 架構的設計說明。&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/concepts/islands/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Astro 官方 — Islands architecture&lt;/a&gt;：&lt;code&gt;client:load&lt;/code&gt;、&lt;code&gt;client:visible&lt;/code&gt; 等指令的行為說明。&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/migrate-to-astro/from-eleventy/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Astro 官方 — Migrating from Eleventy&lt;/a&gt;：從 11ty 遷移到 Astro 的官方指南。&lt;li&gt;&lt;a href=&quot;https://gohugo.io/documentation/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hugo 官方文件&lt;/a&gt;：Hugo 安裝、模板與多語系設定。&lt;li&gt;&lt;a href=&quot;https://themes.gohugo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hugo Themes&lt;/a&gt;：Hugo 現成主題目錄，適合快速套皮評估。&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Proton Unlimited 全產品與功能介紹：六合一隱私全家桶值得買嗎？</title>
    <link href="https://kamadiam.com/proton-unlimited-full-product-guide/" />
    <updated>2026-08-12T09:27:00Z</updated>
    <id>https://kamadiam.com/proton-unlimited-full-product-guide/</id>
    <content type="html">&lt;p&gt;你本來只想買杯咖啡，結果櫃檯問你要不要加購「瑞士隱私全家桶」——Mail、Calendar、Drive、Pass、VPN、Wallet 一次上。聽起來很划算，但你不確定自己到底會用到幾個 App，還是只會讓 Proton 默默扣款、你默默只用 VPN。&lt;p&gt;這篇就是幫你把 &lt;strong&gt;Proton Unlimited&lt;/strong&gt; 拆開來看：六個產品各自解決什麼痛點、什麼情境該開哪個、跟單買 Mail Plus 或 VPN Plus 差在哪，以及 2026 年結帳前該怎麼比價。讀完你會知道——全家桶是幫你 逃離 Google 控制 的，不是幫 Proton 清庫存的。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E5%85%88%E8%AC%9B%E7%B5%90%E8%AB%96Proton-Unlimited-%E6%98%AF%E4%BB%80%E9%BA%BC?&quot;&gt;先講結論：Proton Unlimited 是什麼？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E5%85%AD%E5%A4%A7%E7%94%A2%E5%93%81%E8%A7%A3%E6%B1%BA%E4%BB%80%E9%BA%BC%E5%95%8F%E9%A1%8C%E4%BB%80%E9%BA%BC%E6%99%82%E5%80%99%E7%94%A8?&quot;&gt;六大產品：解決什麼問題、什麼時候用？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E8%A8%82%E9%96%B1%E5%89%8D%E5%85%88%E8%B7%91%E4%B8%80%E8%BC%AA%E7%9B%A4%E9%BB%9E&quot;&gt;訂閱前先跑一輪盤點&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E6%96%B9%E6%A1%88%E8%88%87%E5%83%B9%E6%A0%BC2026-%E5%AE%98%E6%96%B9%E5%BF%AB%E7%85%A7&quot;&gt;方案與價格（2026 官方快照）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E6%B1%BA%E7%AD%96%E8%A1%A8%E6%88%91%E8%A9%B2%E4%B8%8D%E8%A9%B2%E8%B2%B7-Proton-Unlimited?&quot;&gt;決策表：我該不該買 Proton Unlimited？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E8%88%87%E5%96%AE%E5%93%81%E5%8A%A0%E7%B8%BD%E7%9A%84%E5%83%B9%E5%80%BC%E5%88%A4%E6%96%B7&quot;&gt;與單品加總的價值判斷&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7/%E8%B3%87%E6%BA%90&quot;&gt;推薦工具／資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E7%B5%90%E8%AA%9E&quot;&gt;結語&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-unlimited-full-product-guide/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2 id=&quot;先講結論Proton-Unlimited-是什麼?&quot;&gt;先講結論：Proton Unlimited 是什麼？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一句話&lt;/strong&gt;：一個帳號、一筆訂閱，解鎖 Proton 六大核心產品的付費版（Plus 層級）。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;產品&lt;th&gt;Unlimited 內容摘要&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Proton Mail&lt;td&gt;15 個信箱地址、3 個自訂網域、500 GB 共用儲存、無限別名、Proton Sentinel&lt;tr&gt;&lt;td&gt;Proton Calendar&lt;td&gt;25 個個人行事曆、加密與分享&lt;tr&gt;&lt;td&gt;Proton Drive&lt;td&gt;與 Mail 共用 500 GB、Docs 線上編輯、進階分享與版本歷史&lt;tr&gt;&lt;td&gt;Proton Pass&lt;td&gt;50 個 vault、無限 Hide-my-email 別名、內建 2FA&lt;tr&gt;&lt;td&gt;Proton VPN&lt;td&gt;VPN Plus 全功能：10 台同時連線、120+ 國家、串流、P2P、Secure Core 等&lt;tr&gt;&lt;td&gt;Proton Wallet&lt;td&gt;10 個錢包、每個錢包 10 個帳戶（自託管 Bitcoin）&lt;/table&gt;&lt;p&gt;&lt;strong&gt;附帶但非付費層&lt;/strong&gt;：Proton Lumo（AI 助理，免費額度）、Proton Meet（免費會議額度）。若要 Lumo Plus 或 Meet Professional，需要 Visionary 等更高方案。&lt;p&gt;&lt;strong&gt;適合誰&lt;/strong&gt;：不只想要 VPN，而是想把信箱、密碼、雲端、網路連線一起搬到瑞士隱私生態系的人。若你只需要其中一兩項，單買 Mail Plus 或 VPN Plus 通常更划算——就像你不會為了喝一口濃縮，把整間咖啡廳買下來。&lt;hr&gt;&lt;h2 id=&quot;六大產品解決什麼問題什麼時候用?&quot;&gt;六大產品：解決什麼問題、什麼時候用？&lt;/h2&gt;&lt;h3 id=&quot;Proton-Mail-—-取代-Gmail-的加密信箱&quot;&gt;Proton Mail — 取代 Gmail 的加密信箱&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解決的問題&lt;/strong&gt;：一般信箱（Gmail、Outlook）供應商能讀取或分析你的信件內容來投放廣告；資料也可能因法院命令外洩。&lt;p&gt;&lt;strong&gt;什麼時候用&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;日常收發工作／私人郵件，想脫離 Google 生態&lt;li&gt;需要自己的網域信箱（&lt;code&gt;you@yourname.com&lt;/code&gt;）&lt;li&gt;要用 Outlook、Thunderbird 等桌面程式（透過 Proton Mail Bridge）&lt;li&gt;寄給非 Proton 用戶時要密碼保護郵件&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Unlimited 相關上限&lt;/strong&gt;：15 個信箱地址、3 個自訂網域、與 Drive 共用 &lt;strong&gt;500 GB&lt;/strong&gt;、無限寄信（合法用途）、Dark Web Monitoring、Proton Sentinel 帳戶保護。&lt;p&gt;&lt;strong&gt;簡單例子&lt;/strong&gt;：你經營小型接案，想讓客戶寄到 &lt;code&gt;hello@你的品牌.com&lt;/code&gt;，又不想讓 Google 掃描信件內容——Mail + 自訂網域就是起點。&lt;hr&gt;&lt;h3 id=&quot;Proton-Calendar-—-取代-Google-Calendar-的加密行事曆&quot;&gt;Proton Calendar — 取代 Google Calendar 的加密行事曆&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解決的問題&lt;/strong&gt;：雲端行事曆預設可被服務商讀取；會議時間、行程模式會變成可分析的個資。&lt;p&gt;&lt;strong&gt;什麼時候用&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;與 Mail 同一帳號管理行程，減少第三方日曆同步&lt;li&gt;需要加密分享行事曆給家人或同事（透過連結）&lt;li&gt;預約會議時段（Appointment scheduling，依方案開放）&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Unlimited 相關上限&lt;/strong&gt;：25 個個人行事曆；儲存空間與 Mail、Drive 共用池。&lt;p&gt;&lt;strong&gt;簡單例子&lt;/strong&gt;：你跟伴侶共用「家庭行程」日曆，又不想讓平台知道你们每週幾點出門——用 Proton Calendar 分享，比把 Google 日曆設成公開安全。Google 不會因此少賺廣告費，但至少你的行程不會變成「週五晚上常出門」的推薦標籤。&lt;hr&gt;&lt;h3 id=&quot;Proton-Drive-—-取代-Google-Drive-的加密雲端&quot;&gt;Proton Drive — 取代 Google Drive 的加密雲端&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解決的問題&lt;/strong&gt;：一般雲端硬碟由供應商持有金鑰，帳號被駭或內部存取時檔案可能外洩。&lt;p&gt;&lt;strong&gt;什麼時候用&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;備份合約、身分證掃描、財務文件&lt;li&gt;與客戶分享檔案（可設密碼與到期連結）&lt;li&gt;在瀏覽器裡編輯 Docs／試算表（無需下載解密）&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Unlimited 相關上限&lt;/strong&gt;：與 Mail &lt;strong&gt;共用 500 GB&lt;/strong&gt;；含線上文件編輯、進階分享安全、檔案版本歷史（最多 200 版／檔、保留最長 10 年）。&lt;p&gt;&lt;strong&gt;簡單例子&lt;/strong&gt;：Freelancer 把報價 PDF 放在 Drive，用密碼連結傳給客戶——連結過期後對方就打不開，比 Email 附件好控管。客戶可能會抱怨「連結失效」，但至少你的合約不會在對方轉寄時裸奔。&lt;hr&gt;&lt;h3 id=&quot;Proton-Pass-—-取代-Chrome-密碼管理器&quot;&gt;Proton Pass — 取代 Chrome 密碼管理器&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解決的問題&lt;/strong&gt;：瀏覽器內建密碼庫綁在 Google／Apple 帳號上；外洩時密碼與信箱一併失守。註冊網站時還會把真實信箱留給對方。&lt;p&gt;&lt;strong&gt;什麼時候用&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;為每個網站產生唯一強密碼&lt;li&gt;用 &lt;strong&gt;Hide-my-email&lt;/strong&gt; 別名註冊，之後可一鍵停用別名&lt;li&gt;在 Pass 內建 2FA 驗證器，登入時少切 App&lt;li&gt;跨手機、電腦、瀏覽器同步（不限裝置數）&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Unlimited 相關上限&lt;/strong&gt;：50 個 vault、&lt;strong&gt;無限&lt;/strong&gt; Hide-my-email 別名、內建 2FA authenticator。&lt;p&gt;&lt;strong&gt;簡單例子&lt;/strong&gt;：你在購物網站註冊，用 Pass 產生 &lt;code&gt;random@pm.me&lt;/code&gt; 別名 + 32 字元密碼；若該站日後外洩，你停用別名即可，真實信箱不受影響。這比「用生日當密碼」安全，也比「把密碼寫在便利貼上」——至少便利貼不會被駭。&lt;hr&gt;&lt;h3 id=&quot;Proton-VPN-—-公共網路與-ISP-窺探的防護層&quot;&gt;Proton VPN — 公共網路與 ISP 窺探的防護層&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解決的問題&lt;/strong&gt;：咖啡廳 Wi‑Fi、機場網路可能被竊聽；ISP 能看到你連了哪些網站；部分地區有審查或地理限制。&lt;p&gt;&lt;strong&gt;什麼時候用&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;旅行、遠端工作連公共 Wi‑Fi&lt;li&gt;需要解鎖串流地區片庫（Netflix、Disney+ 等，依服務條款）&lt;li&gt;BT／P2P 下載要走加密隧道&lt;li&gt;高風險情境需要 Secure Core 或 Tor over VPN&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Unlimited 內含 VPN Plus&lt;/strong&gt;：10 台裝置同時連線、最高速度、15,000+ 伺服器／120+ 國、NetShield、串流、P2P、Secure Core、Tor over VPN、Split tunneling（Android／Windows）等。&lt;p&gt;&lt;strong&gt;簡單例子&lt;/strong&gt;：你在日本旅館 Wi‑Fi 上要處理銀行帳務——先開 VPN + 確認 Kill Switch，再開銀行網站，比裸連公共網路安心。Kill Switch 的意思是 VPN 斷線時網路也斷，不會讓你的流量偷偷裸奔——比「我以為有連上」可靠。&lt;blockquote&gt;&lt;p&gt;若你&lt;strong&gt;只需要 VPN&lt;/strong&gt;、不需要 Mail／Pass，請直接比較 &lt;strong&gt;VPN Plus&lt;/strong&gt; 與 Unlimited，別用 Unlimited 月費當 VPN 單價。可搭配站內 &lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review-2026/&quot;&gt;Proton VPN 付費版評價&lt;/a&gt;。&lt;/blockquote&gt;&lt;hr&gt;&lt;h3 id=&quot;Proton-Wallet-—-自託管-Bitcoin-錢包&quot;&gt;Proton Wallet — 自託管 Bitcoin 錢包&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解決的問題&lt;/strong&gt;：把 BTC 放在交易所，交易所倒閉或被駭時可能拿不回資產（「Not your keys, not your coins」）。&lt;p&gt;&lt;strong&gt;什麼時候用&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;長期持有少量 Bitcoin，要自己掌控私鑰&lt;li&gt;用 &lt;strong&gt;Bitcoin via Email&lt;/strong&gt; 轉帳（驗證信箱即可，降低貼錯地址風險）&lt;li&gt;需要瑞士管轄 + 開源程式碼的錢包&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Unlimited 相關上限&lt;/strong&gt;：10 個錢包、每錢包 10 個帳戶（Free 為 3×3）。Wallet &lt;strong&gt;不是&lt;/strong&gt;交易所——Proton 不做炒幣，只做託管錢包。&lt;p&gt;&lt;strong&gt;簡單例子&lt;/strong&gt;：你每月定額買一點 BTC 長期持有，用 Wallet 自託管比放在交易所適合；但若你需要頻繁交易，仍應使用合規交易所——Wallet 是保險箱，不是股票 App。&lt;hr&gt;&lt;h2 id=&quot;訂閱前先跑一輪盤點&quot;&gt;訂閱前先跑一輪盤點&lt;/h2&gt;&lt;p&gt;別讓訂閱變成「買了六個 App，開了兩個，剩下四個在背景默默續約」。照這六步盤點：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;列出你現在用哪些 Google／Microsoft 服務&lt;/strong&gt;（信箱、雲端、密碼、日曆、VPN）。&lt;li&gt;&lt;strong&gt;對照上方六產品表&lt;/strong&gt;，標記「一定要／可有可無／不需要」。&lt;li&gt;&lt;strong&gt;數儲存與帳號&lt;/strong&gt;：500 GB 夠嗎？需要幾個自訂網域？家裡幾台裝置同時連 VPN？&lt;li&gt;&lt;strong&gt;到&lt;/strong&gt; &lt;a href=&quot;https://proton.me/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;proton.me/pricing&lt;/a&gt; &lt;strong&gt;登入後切換幣別（USD／EUR／CHF）與計費週期&lt;/strong&gt;，看 Unlimited 與單品加總誰比較便宜。&lt;li&gt;&lt;strong&gt;若兩人以上&lt;/strong&gt;，改看 Proton Duo（2 人、2 TB）或 Family（6 人、3 TB），不要硬買兩個 Unlimited。&lt;li&gt;訂閱後依序完成：Mail Easy Switch 匯入 → Pass 匯入密碼 → Drive 上傳關鍵資料夾 → VPN 設 Kill Switch → Wallet 僅在確定要自託管 BTC 時啟用。&lt;/ol&gt;&lt;hr&gt;&lt;h2 id=&quot;方案與價格2026-官方快照&quot;&gt;方案與價格（2026 官方快照）&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;地區與幣別&lt;/strong&gt;：Proton 結帳僅支援 &lt;strong&gt;USD、EUR、CHF&lt;/strong&gt;；台灣可用信用卡，由發卡行依當日匯率扣台幣。實際金額以登入後結帳頁為準；促銷、舊客價格可能不同。&lt;/blockquote&gt;&lt;h3 id=&quot;Proton-Unlimited-定價個人&quot;&gt;Proton Unlimited 定價（個人）&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;計費週期&lt;th&gt;官方標價（USD／EUR 同數字）&lt;th&gt;說明&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;月繳&lt;td&gt;$12.99／€12.99 每月&lt;td&gt;彈性高、總價最貴&lt;tr&gt;&lt;td&gt;年繳&lt;td&gt;$119.88／€119.88 每年（約 $9.99／€9.99／月）&lt;td&gt;多數人比較的基準&lt;/table&gt;&lt;p&gt;官方方案說明頁與帳戶訂閱管理目前以 &lt;strong&gt;1 個月／12 個月&lt;/strong&gt; 為主；&lt;strong&gt;VPN Plus 單獨訂閱&lt;/strong&gt;才有常見的 24 個月選項，Unlimited 整合方案請以結帳頁顯示為準（勿假設一定有兩年約）。&lt;h3 id=&quot;與其他個人方案快速對照&quot;&gt;與其他個人方案快速對照&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;th&gt;適合誰&lt;th&gt;你得到什麼&lt;th&gt;你沒得到什麼&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Free&lt;/strong&gt;&lt;td&gt;想零成本試用&lt;td&gt;各產品免費層（Mail 1 GB、VPN 1 台／10 國、Pass 10 別名等）&lt;td&gt;VPN 串流／P2P、Mail 自訂網域、Pass 無限別名&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Mail Plus&lt;/strong&gt;&lt;td&gt;只要加密信箱&lt;td&gt;15 GB、1 網域、10 地址&lt;td&gt;VPN Plus、Pass Plus、大容量 Drive&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VPN Plus&lt;/strong&gt;&lt;td&gt;只要 VPN&lt;td&gt;完整 VPN 功能&lt;td&gt;Mail／Drive／Pass 付費層&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Unlimited&lt;/strong&gt;&lt;td&gt;要整套 逃離 Google 控制&lt;td&gt;上述六產品付費層 + 500 GB&lt;td&gt;Lumo Plus、Meet Professional、Proton Scribe（需 Duo／Family 或 Visionary）&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Duo／Family&lt;/strong&gt;&lt;td&gt;2～6 人家庭&lt;td&gt;每人完整付費層 + 更大共用儲存 + Proton Scribe&lt;td&gt;單人使用不划算&lt;/table&gt;&lt;h3 id=&quot;關鍵共用限制Unlimited&quot;&gt;關鍵共用限制（Unlimited）&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;th&gt;Unlimited 上限&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;使用者&lt;td&gt;1 人&lt;tr&gt;&lt;td&gt;儲存空間&lt;td&gt;500 GB（Mail + Drive + Calendar 共用）&lt;tr&gt;&lt;td&gt;信箱地址&lt;td&gt;15 個&lt;tr&gt;&lt;td&gt;自訂網域&lt;td&gt;3 個&lt;tr&gt;&lt;td&gt;VPN 同時連線&lt;td&gt;10 台裝置&lt;tr&gt;&lt;td&gt;Pass vault&lt;td&gt;50 個&lt;tr&gt;&lt;td&gt;Hide-my-email&lt;td&gt;無限&lt;tr&gt;&lt;td&gt;Wallet&lt;td&gt;10 錢包 × 10 帳戶／錢包&lt;tr&gt;&lt;td&gt;附件大小&lt;td&gt;25 MB／封信&lt;/table&gt;&lt;p&gt;儲存滿了怎麼辦？官方會限制新郵件或上傳，需清理或升級 Duo／Family／Visionary。降級後資料通常保留，但可能無法新增內容直到低於新方案上限。&lt;hr&gt;&lt;h2 id=&quot;決策表我該不該買-Proton-Unlimited?&quot;&gt;決策表：我該不該買 Proton Unlimited？&lt;/h2&gt;&lt;h3 id=&quot;依需求選方案&quot;&gt;依需求選方案&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情境&lt;th&gt;建議方案&lt;th&gt;原因&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;只在意旅行時 VPN 安全&lt;td&gt;&lt;strong&gt;VPN Plus&lt;/strong&gt; 或先 &lt;strong&gt;Free&lt;/strong&gt;&lt;td&gt;Unlimited 的 Mail／Pass 你用不到就是多付&lt;tr&gt;&lt;td&gt;只要 &lt;code&gt;@自己的網域&lt;/code&gt; 信箱，不打算用 VPN&lt;td&gt;&lt;strong&gt;Mail Plus&lt;/strong&gt;&lt;td&gt;比 Unlimited 便宜很多&lt;tr&gt;&lt;td&gt;已用 Proton Free，想要無限別名 + 2FA + VPN 串流&lt;td&gt;&lt;strong&gt;Unlimited&lt;/strong&gt;&lt;td&gt;Pass Plus + VPN Plus 分開訂常比 Unlimited 貴&lt;tr&gt;&lt;td&gt;想 Gmail + Drive + 密碼 + VPN 一次搬家&lt;td&gt;&lt;strong&gt;Unlimited&lt;/strong&gt;&lt;td&gt;正是整合方案設計場景&lt;tr&gt;&lt;td&gt;兩人要完整付費層 + 更大空間&lt;td&gt;&lt;strong&gt;Proton Duo&lt;/strong&gt;&lt;td&gt;2 TB 共用、兩帳號，比買兩個 Unlimited 划算&lt;tr&gt;&lt;td&gt;家裡 3～6 人都要付費功能&lt;td&gt;&lt;strong&gt;Proton Family&lt;/strong&gt;&lt;td&gt;6 人、3 TB 共用&lt;tr&gt;&lt;td&gt;只需要密碼管理 + 別名&lt;td&gt;&lt;strong&gt;Pass Plus&lt;/strong&gt; 或 &lt;strong&gt;Pass Free&lt;/strong&gt;&lt;td&gt;見站內 &lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/&quot;&gt;Proton Pass 免費版與付費版怎麼選&lt;/a&gt;&lt;tr&gt;&lt;td&gt;主要持有 Bitcoin 自託管&lt;td&gt;Wallet 可用 &lt;strong&gt;Free&lt;/strong&gt; 先試&lt;td&gt;Unlimited 提高錢包／帳戶上限；非必買全家桶的唯一理由&lt;/table&gt;&lt;h3 id=&quot;依「會用到的-App-數量」粗估&quot;&gt;依「會用到的 App 數量」粗估&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你確定會長期使用的 Proton 服務數&lt;th&gt;建議&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1 項（通常 VPN 或 Mail）&lt;td&gt;單買對應 Plus&lt;tr&gt;&lt;td&gt;2 項&lt;td&gt;結帳頁加總 vs Unlimited，取便宜的&lt;tr&gt;&lt;td&gt;3 項以上（含 Pass 或 Drive）&lt;td&gt;&lt;strong&gt;優先看 Unlimited&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;不確定&lt;td&gt;先用 &lt;strong&gt;Free&lt;/strong&gt; 兩週，再依實際開啟的 App 決定&lt;/table&gt;&lt;h3 id=&quot;Unlimited-不適合誰?&quot;&gt;Unlimited 不適合誰？&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;只需要 VPN&lt;/strong&gt;，且已有 Bitwarden 等密碼方案、也不打算換信箱。&lt;li&gt;&lt;strong&gt;儲存需求 &amp;gt; 500 GB&lt;/strong&gt; 的單人使用者（考慮 Duo 或加購空間方案）。&lt;li&gt;&lt;strong&gt;要 Lumo AI 付費額度、Proton Scribe 寫信助理或專業會議錄影&lt;/strong&gt;——Unlimited 只有 Lumo／Meet 免費層；Scribe 在 Duo／Family；Lumo Plus／Meet Professional 要 Visionary。&lt;li&gt;&lt;strong&gt;期待 Wallet 當交易所炒幣&lt;/strong&gt;——Proton Wallet 是自託管，不是交易平台。&lt;/ul&gt;&lt;hr&gt;&lt;h2 id=&quot;與單品加總的價值判斷&quot;&gt;與單品加總的價值判斷&lt;/h2&gt;&lt;p&gt;官方定位是：Unlimited 年繳約 &lt;strong&gt;$9.99／月&lt;/strong&gt;，包含 Mail Plus、VPN Plus、Pass Plus、Drive Plus、Calendar 付費功能。&lt;p&gt;自行估算時：&lt;ol&gt;&lt;li&gt;打開 &lt;a href=&quot;https://proton.me/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;pricing 頁&lt;/a&gt;，分別看 Mail Plus、VPN Plus（年繳）價格。&lt;li&gt;Pass Plus 若單獨販售，一併加入。&lt;li&gt;若 &lt;strong&gt;兩項以上年繳加總 &amp;gt; Unlimited 年繳&lt;/strong&gt;，買 Unlimited 較合理。&lt;li&gt;別忘了 &lt;strong&gt;500 GB&lt;/strong&gt; 與 &lt;strong&gt;Proton Sentinel&lt;/strong&gt; 是 Unlimited 額外值，單買 Mail Plus 只有 15 GB。&lt;/ol&gt;&lt;hr&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;產品&lt;th&gt;適合誰&lt;th&gt;說明&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;Proton Unlimited&lt;/a&gt;&lt;/strong&gt;（主推）&lt;td&gt;想 Mail + Pass + VPN + Drive 一次 逃離 Google 控制&lt;td&gt;年繳約 $9.99／月；比單品加總通常更省&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton VPN Plus&lt;/strong&gt;&lt;td&gt;只需要 VPN 完整功能&lt;td&gt;別為了 VPN 買全家桶&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Mail Plus&lt;/strong&gt;&lt;td&gt;只要加密信箱 + 自訂網域&lt;td&gt;比 Unlimited 便宜很多&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;Proton Pass&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;只要密碼管理 + Hide-my-email&lt;td&gt;可搭配站內 Pass 評測文&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Free&lt;/strong&gt;&lt;td&gt;還不確定、想先試兩週&lt;td&gt;零成本建立信任，再依實際開啟的 App 升級&lt;/table&gt;&lt;h2 id=&quot;結語&quot;&gt;結語&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Proton Unlimited 值得買嗎？&lt;/strong&gt;——若你確定會長期用 &lt;strong&gt;三項以上&lt;/strong&gt; Proton 服務（尤其是 Mail + Pass + VPN 的 逃離 Google 控制 組合），通常比單品加總划算。若你只是「偶爾旅行開 VPN」，Unlimited 就像買了六人份套餐自己吃——飽是飽了，錢包也瘦了。&lt;p&gt;三個重點帶走：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Unlimited 是生態系整合方案&lt;/strong&gt;，不是「加強版 VPN」——先盤點你會用到幾個 App。&lt;li&gt;&lt;strong&gt;500 GB 是 Mail + Drive + Calendar 共用池&lt;/strong&gt;，大檔案使用者要事先估算。&lt;li&gt;&lt;strong&gt;結帳前到官網比價&lt;/strong&gt;，幣別、促銷、舊客價格都可能讓結論翻盤。&lt;/ol&gt;&lt;p&gt;若你確認需要全家桶，建議先到 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;Proton 官網&lt;/a&gt; 領免費帳號 → 實際開幾個 App 試兩週 → 再決定升級 Unlimited 或單買 Plus。遷移完成再來一杯咖啡慶祝——這次沒有 Google 讀你的訂單確認信。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;聯盟揭露：&lt;/strong&gt; 本文包含 Proton 推薦連結。若你透過連結註冊或購買，我可能獲得推薦回饋；這不會增加你的費用。本文依研究筆記與官方文件撰寫，請依你的實際需求與測試結果做最終決定。&lt;/blockquote&gt;&lt;p&gt;👉 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;&lt;strong&gt;免費申請 Proton 帳號 →&lt;/strong&gt;&lt;/a&gt;&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://proton.me/support/proton-plans&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton plans explained（官方方案總覽）&lt;/a&gt; — 各產品方案層級與功能對照。&lt;li&gt;&lt;a href=&quot;https://proton.me/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pricing Plans&lt;/a&gt; — 結帳時的方案、幣別與促銷價格（以當日頁面為準）。&lt;li&gt;&lt;a href=&quot;https://proton.me/support/proton-pass-plans-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass plans explained&lt;/a&gt; — Pass 免費版與付費版上限。&lt;li&gt;&lt;a href=&quot;https://proton.me/wallet&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Wallet 產品頁&lt;/a&gt; — 自託管 Bitcoin 錢包功能說明。&lt;li&gt;&lt;a href=&quot;https://proton.me/support/manage-subscription&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to manage your Proton subscription&lt;/a&gt; — 訂閱管理、升級與降級。&lt;li&gt;&lt;a href=&quot;https://proton.me/blog/proton-unlimited-plan&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;All you need to know about Proton Unlimited（官方部落格）&lt;/a&gt; — Unlimited 整合方案官方說明。&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Proton Pass 值得用嗎？免費版、Plus 與 Unlimited 怎麼選</title>
    <link href="https://kamadiam.com/proton-pass-free-vs-paid-review/" />
    <updated>2026-08-12T02:19:01Z</updated>
    <id>https://kamadiam.com/proton-pass-free-vs-paid-review/</id>
    <content type="html">&lt;p&gt;你是不是也這樣：Chrome 跳出「要儲存密碼嗎？」，手比腦子快，按了「是」。幾年下來，幾百組帳密全躺在 Google 帳號裡，安靜得像沒發生過事。&lt;p&gt;直到某天看到外洩新聞，你才突然想起一件小事——&lt;strong&gt;這本熟客本，到底鎖在誰家倉庫？&lt;/strong&gt;&lt;p&gt;Chrome 記密碼很像店裡的熟客本：你點什麼它都記得。問題是這本筆記本跟 Gmail、雲端硬碟、YouTube 觀看紀錄，常常塞在同一間倉庫。倉庫鑰匙丟了，損失的就不只是一杯美式。&lt;p&gt;瀏覽器內建密碼管理器「免費又順手」，但你的憑證通常跟大帳號綁在一起：管轄法律、元資料、匯出時的明文 CSV，都是獨立密碼庫想處理的事。若你本來就信任 Proton——例如已經用過 &lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/&quot;&gt;Proton VPN 免費版&lt;/a&gt;——&lt;strong&gt;&lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass&lt;/a&gt;&lt;/strong&gt; 是很自然的下一步。而且免費版已經比多數人想像中完整，不是那種「只能存 50 組密碼、用三天就開始推升級」的試用關卡。&lt;p&gt;這篇讀完，你會知道：免費版能幹嘛、什麼時候該付費，以及買整套 Proton Unlimited 跟只買 Pass Plus 差在哪。目標很單純——選對方案，而不是被「買最貴才最安全」推著走。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#Chrome-%E5%AF%86%E7%A2%BC%E7%AE%A1%E7%90%86%E5%99%A8%E5%A4%A0%E7%94%A8%E5%97%8E?%E4%BB%80%E9%BA%BC%E6%99%82%E5%80%99%E8%A9%B2%E6%8F%9B?&quot;&gt;Chrome 密碼管理器夠用嗎？什麼時候該換？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#Proton-Pass-%E5%85%8D%E8%B2%BB%E7%89%88%E5%85%B6%E5%AF%A6%E5%B7%B2%E7%B6%93%E5%BE%88%E5%AE%8C%E6%95%B4&quot;&gt;Proton Pass 免費版：其實已經很完整&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#%E4%B8%89%E7%A8%AE%E6%96%B9%E6%A1%88%E6%80%8E%E9%BA%BC%E9%81%B8?%E4%B8%80%E5%BC%B5%E6%B1%BA%E7%AD%96%E8%A1%A8%E6%90%9E%E5%AE%9A&quot;&gt;三種方案怎麼選？一張決策表搞定&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#Hide-my-email%E5%85%8D%E8%B2%BB%E7%89%88%E6%9C%80%E8%A2%AB%E4%BD%8E%E4%BC%B0%E7%9A%84%E5%8A%9F%E8%83%BD&quot;&gt;Hide-my-email：免費版最被低估的功能&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#%E5%BE%9E-Chrome-%E6%90%AC%E9%81%8E%E4%BE%86%E8%A6%81%E5%A4%9A%E4%B9%85?%E5%A4%A7%E7%B4%84-15%E2%80%9330-%E5%88%86%E9%90%98&quot;&gt;從 Chrome 搬過來要多久？大約 15–30 分鐘&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#%E8%B7%9F-Bitwarden1Password-%E6%AF%94,Proton-Pass-%E9%81%A9%E5%90%88%E8%AA%B0?&quot;&gt;跟 Bitwarden、1Password 比，Proton Pass 適合誰？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7/%E8%B3%87%E6%BA%90&quot;&gt;推薦工具／資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#%E7%B5%90%E8%AA%9E%E5%85%88%E5%85%8D%E8%B2%BB%E8%A9%A6,%E5%86%8D%E4%BE%9D%E9%9C%80%E6%B1%82%E5%8D%87%E7%B4%9A&quot;&gt;結語：先免費試，再依需求升級&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-pass-free-vs-paid-review/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2 id=&quot;Chrome-密碼管理器夠用嗎?什麼時候該換?&quot;&gt;Chrome 密碼管理器夠用嗎？什麼時候該換？&lt;/h2&gt;&lt;p&gt;先講白話：Chrome（Google Password Manager）不是不能用，而是&lt;strong&gt;方便換來綁定&lt;/strong&gt;。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情境&lt;th&gt;建議&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;帳號不到 20 組、只有娛樂網站&lt;td&gt;可繼續用，但請開啟 Google &lt;strong&gt;兩步驟驗證&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;已全套 Apple、只用自己的裝置&lt;td&gt;iCloud 鑰匙圈體驗佳；重要金融帳號仍建議加硬體金鑰&lt;tr&gt;&lt;td&gt;帳密破百、想減少 Google 掌控&lt;td&gt;規劃遷移到獨立密碼庫&lt;tr&gt;&lt;td&gt;接案、客戶資料多&lt;td&gt;獨立金庫＋分 vault，勿跟私人 Chrome 混用&lt;/table&gt;&lt;p&gt;獨立密碼庫多一層：&lt;strong&gt;主密碼&lt;/strong&gt;（再加可選的第二因素）跟 Gmail 登入分開。從 Chrome 匯出密碼時會得到&lt;strong&gt;未加密 CSV&lt;/strong&gt;——這是搬家必經之路，也是風險最高的一刻。把明文密碼檔丟在桌面或同步雲端，等於把家門鑰匙影印後貼在信箱上，還寫「有事請自取」。&lt;p&gt;所以換工具要一次做對。若你已經在考慮 Proton 生態（Mail、VPN、Drive），Pass 是 De-Googling 拼圖裡&lt;strong&gt;門檻最低&lt;/strong&gt;的一塊：註冊免費帳號就能開始，不必先買最高方案。&lt;hr&gt;&lt;h2 id=&quot;Proton-Pass-免費版其實已經很完整&quot;&gt;Proton Pass 免費版：其實已經很完整&lt;/h2&gt;&lt;p&gt;很多人以為「免費密碼管理器 = 只能存幾十組密碼」。依 Proton 官方方案說明，Proton Pass Free 這些項目是&lt;strong&gt;不限數量&lt;/strong&gt;的：&lt;ul&gt;&lt;li&gt;登入資料、筆記、信用卡與身分資料&lt;li&gt;裝置數量（手機、電腦都能裝）&lt;li&gt;&lt;strong&gt;Passkey&lt;/strong&gt;（無密碼登入）&lt;li&gt;&lt;strong&gt;10 個 Hide-my-email 信箱別名&lt;/strong&gt;（轉寄到你真正信箱的隨機地址）&lt;/ul&gt;&lt;p&gt;免費版的&lt;strong&gt;明確上限&lt;/strong&gt;也要記清楚，免得用了一陣子才發現卡關：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;th&gt;免費版限制&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hide-my-email 別名&lt;td&gt;最多 &lt;strong&gt;10 個&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;內建 2FA（TOTP）&lt;td&gt;最多 &lt;strong&gt;3 個&lt;/strong&gt;項目會顯示驗證碼（依建立日期，最早的三筆）&lt;tr&gt;&lt;td&gt;暗網監控、緊急存取、進階共享&lt;td&gt;❌ 需付費&lt;tr&gt;&lt;td&gt;自訂網域別名&lt;td&gt;❌ 需付費&lt;/table&gt;&lt;p&gt;常見誤解順便澄清：&lt;strong&gt;免費版可以用 Passkey&lt;/strong&gt;。付費版主要差在別名數量、完整 2FA、共享與監控，不是「免費版只能當記事本」。AI 若跟你說免費版不能用 Passkey，你可以請它先去讀官方方案頁——這杯咖啡它白喝了。&lt;hr&gt;&lt;h2 id=&quot;三種方案怎麼選?一張決策表搞定&quot;&gt;三種方案怎麼選？一張決策表搞定&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情境&lt;th&gt;建議方案&lt;th&gt;原因&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;跨手機、電腦存密碼與 Passkey，別名不超過 10 個&lt;td&gt;&lt;strong&gt;Proton Pass Free&lt;/strong&gt;&lt;td&gt;登入與裝置不限，夠你起步&lt;tr&gt;&lt;td&gt;每個網站都想用不同別名，或需要內建 TOTP&lt;td&gt;&lt;strong&gt;Proton Pass Plus&lt;/strong&gt;&lt;td&gt;不限別名與 2FA，另有共享、暗網監控等&lt;tr&gt;&lt;td&gt;還需要 Proton VPN Plus、Mail、Drive&lt;td&gt;&lt;strong&gt;Proton Unlimited&lt;/strong&gt;&lt;td&gt;Pass Plus 功能包在套裝裡；價值在&lt;strong&gt;多服務一起用&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;要家人共用、不是單人帳號&lt;td&gt;先看 &lt;strong&gt;Pass Family&lt;/strong&gt;&lt;td&gt;家庭方案重點在多使用者，不是單帳戶加容量&lt;/table&gt;&lt;h3 id=&quot;付費前的三個自問&quot;&gt;付費前的三個自問&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;別名夠用嗎？&lt;/strong&gt; 只是偶爾註冊試用，10 個可能夠；想「一個網站一個信箱」，Plus 的不限量才是實質升級理由。&lt;li&gt;&lt;strong&gt;2FA 放哪裡？&lt;/strong&gt; Pass Plus 內建 TOTP 很方便，但 Proton 官方寫得很清楚：&lt;strong&gt;不要用 Proton Pass 的 TOTP 保護 Proton 帳號本身&lt;/strong&gt;——Proton 登入請用第三方驗證器。白話說：別把備用鑰匙藏在同一扇門的門墊底下。&lt;li&gt;&lt;strong&gt;要不要整套生態？&lt;/strong&gt; 若你只需要密碼管理，先比 Pass Plus 就好；若本來就要 VPN、加密郵件和雲端，再把 Unlimited 整包納入計算。&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;價格提醒：&lt;/strong&gt; Proton Pass 官網價格會因地區、稅金與促銷變動，結帳前請以 &lt;a href=&quot;https://proton.me/pass/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass 官方方案頁&lt;/a&gt; 為準。官網也標示 Pass 付費方案有 30 天退款保證。粗略參考：同類產品裡 Bitwarden Premium 年繳約 US$19.80、1Password 個人年繳約 US$35.88（官網折合月價；新客首年可能有促銷）——Proton 的賣點常是&lt;strong&gt;別名 + 瑞士管轄 + 跟 Mail／VPN 打包&lt;/strong&gt;，不是單純比誰最便宜。&lt;/blockquote&gt;&lt;h3 id=&quot;Free-vs-Plus-vs-Unlimited-功能對照&quot;&gt;Free vs Plus vs Unlimited 功能對照&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;th style=&quot;text-align:center&quot;&gt;Free&lt;th style=&quot;text-align:center&quot;&gt;Pass Plus&lt;th style=&quot;text-align:center&quot;&gt;Proton Unlimited&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;無限密碼與裝置&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;Passkey&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;Hide-my-email 別名&lt;td style=&quot;text-align:center&quot;&gt;10 個&lt;td style=&quot;text-align:center&quot;&gt;不限&lt;td style=&quot;text-align:center&quot;&gt;不限&lt;tr&gt;&lt;td&gt;內建 2FA（TOTP）&lt;td style=&quot;text-align:center&quot;&gt;最多 3 個項目&lt;td style=&quot;text-align:center&quot;&gt;完整&lt;td style=&quot;text-align:center&quot;&gt;完整&lt;tr&gt;&lt;td&gt;暗網監控、緊急存取&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;自訂網域別名&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;Proton VPN／Mail／Drive 付費功能&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅（套裝）&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Unlimited 不是「Pass 的高級版」&lt;/strong&gt;——它是把 Mail、VPN、Drive、Calendar 等付費功能綁在一起。你若不用其他 Proton 服務，不必為了名稱升級。這很像點了全家桶，卻只吃裡面那包薯條。&lt;p&gt;若你已經訂了 Proton VPN 付費版，可以對照先前的 &lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/&quot;&gt;Proton VPN 評測文&lt;/a&gt;：VPN 解決的是&lt;strong&gt;連線加密與 IP 隱私&lt;/strong&gt;；Pass 解決的是&lt;strong&gt;帳密與信箱別名&lt;/strong&gt;。兩者互補，不是二選一。&lt;hr&gt;&lt;h2 id=&quot;Hide-my-email免費版最被低估的功能&quot;&gt;Hide-my-email：免費版最被低估的功能&lt;/h2&gt;&lt;p&gt;Hide-my-email 會產生一個&lt;strong&gt;轉寄到你主信箱&lt;/strong&gt;的隨機地址。網站只看到別名，看不到你的 Gmail 或 Proton Mail 本體。某個服務外洩或開始狂發廣告時，你可以&lt;strong&gt;只停掉那個別名&lt;/strong&gt;，不必換掉用了十年的主信箱。&lt;p&gt;這比每次外洩都改一次 email 優雅多了。後者比較像每次咖啡灑出來，就換一張桌子。&lt;p&gt;實用習慣：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情境&lt;th&gt;做法&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;網購、優惠、免費試用&lt;td&gt;每個服務一個別名 + 唯一密碼&lt;tr&gt;&lt;td&gt;銀行、政府、重要帳戶&lt;td&gt;可用別名，但別名不能取代身分驗證&lt;tr&gt;&lt;td&gt;不再使用的服務&lt;td&gt;先&lt;strong&gt;停用&lt;/strong&gt;別名觀察；確認帳戶已關閉再永久刪除&lt;/table&gt;&lt;p&gt;桌面瀏覽器：在註冊頁的 email 欄位點 Proton Pass 圖示 → 選 &lt;strong&gt;Hide my email&lt;/strong&gt;，同時產生隨機密碼並儲存。手機上 Android／iOS 也能在自動填入流程裡建立別名。&lt;p&gt;免費版 10 個別名用完，就是考慮 Pass Plus 的明確訊號之一。不是「突然變貴」，而是你的使用方式已經超過免費版設計的範圍。&lt;hr&gt;&lt;h2 id=&quot;從-Chrome-搬過來要多久?大約-15–30-分鐘&quot;&gt;從 Chrome 搬過來要多久？大約 15–30 分鐘&lt;/h2&gt;&lt;p&gt;決定用 Proton Pass 之後，遷移核心三步驟（官方支援頁也是這條路）：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Chrome 匯出 CSV&lt;/strong&gt;（Google Password Manager → 設定 → 匯出）&lt;li&gt;&lt;strong&gt;Proton Pass 擴充功能匯入&lt;/strong&gt;（Import → Provider 選 Chrome）&lt;li&gt;&lt;strong&gt;立刻刪除 CSV 並清空垃圾桶&lt;/strong&gt;——這是明文檔，誰拿到誰就能登入你的帳號&lt;/ol&gt;&lt;p&gt;匯入後建議：&lt;ul&gt;&lt;li&gt;抽 3–5 個重要網站測試自動填入&lt;li&gt;在 Chrome 關閉「儲存密碼」與「自動登入」，避免新密碼又寫回 Google&lt;li&gt;確認無誤後，可依官方步驟在 Google Password Manager 用 &lt;strong&gt;Delete Data&lt;/strong&gt; 清掉舊庫&lt;li&gt;手機把自動填入預設改成 Proton Pass&lt;/ul&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;項目&lt;th&gt;能否一次搬完&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;一般帳密&lt;td&gt;✅ CSV 匯入&lt;tr&gt;&lt;td&gt;Passkey&lt;td&gt;❌ 需在各網站重新建立&lt;tr&gt;&lt;td&gt;Chrome 內建 2FA&lt;td&gt;❌ 通常要在 Pass Plus 用 TOTP 掃 QR 重建&lt;/table&gt;&lt;p&gt;遷移本身&lt;strong&gt;不限筆數&lt;/strong&gt;，免費版就夠用。要無限別名或暗網監控，再考慮升級。Passkey 帶不走這件事，有點像搬家時發現保險箱焊在舊牆上——密碼可以裝箱，鑰匙孔得在新家重做。&lt;hr&gt;&lt;h2 id=&quot;跟-Bitwarden1Password-比,Proton-Pass-適合誰?&quot;&gt;跟 Bitwarden、1Password 比，Proton Pass 適合誰？&lt;/h2&gt;&lt;p&gt;若你還沒鎖定品牌，可以用這張表快速縮小範圍（價格為 2026-08 官網美元參考，不含稅；結帳前請回各官網確認）：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;th&gt;免費版&lt;th&gt;個人付費參考&lt;th&gt;適合誰&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Bitwarden&lt;td&gt;有；不限登入與裝置&lt;td&gt;Premium 約 US$19.80/年&lt;td&gt;要最便宜、可自架、開源生態&lt;tr&gt;&lt;td&gt;1Password&lt;td&gt;僅 14 天試用&lt;td&gt;Individual 年繳約 US$35.88&lt;td&gt;最在意跨平台 autofill 順手度&lt;tr&gt;&lt;td&gt;Proton Pass&lt;td&gt;有；10 個別名 + Passkey&lt;td&gt;Pass Plus 依官網顯示&lt;td&gt;在意隱私、瑞士管轄、已用或打算用 Proton 生態&lt;/table&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情境&lt;th&gt;先看哪個&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;已用 Proton Mail 或 VPN&lt;td&gt;Proton Pass 或 Unlimited 套裝&lt;tr&gt;&lt;td&gt;全家 Apple、帳號不多&lt;td&gt;Apple Passwords 可能已夠用&lt;tr&gt;&lt;td&gt;要脫離 Google、又要信箱別名&lt;td&gt;&lt;strong&gt;Proton Pass Free 先試&lt;/strong&gt;&lt;/table&gt;&lt;p&gt;Proton Pass 的差異化不在「介面最花俏」，而在 &lt;strong&gt;Hide-my-email 跟密碼庫同一個 app&lt;/strong&gt;，以及跟 Proton 其他服務打包時的整體性價比。花俏介面很好看，但不能幫你在購物網站外洩後只關掉一個信箱入口。&lt;hr&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;適合誰&lt;th&gt;說明&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass&lt;/a&gt;&lt;/strong&gt;（主推）&lt;td&gt;想離開 Chrome 密碼庫、在意隱私的一般使用者&lt;td&gt;免費版無限密碼 + 10 個別名；夠用再升 Plus 或 Unlimited&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Unlimited&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;已確定要 Mail + VPN + Pass 全套&lt;td&gt;單項加總通常比分開訂閱划算；見官方方案頁比價&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Bitwarden&lt;/strong&gt;&lt;td&gt;預算優先、或需要自架&lt;td&gt;客觀替代方案；免費版功能扎實&lt;tr&gt;&lt;td&gt;&lt;strong&gt;1Password&lt;/strong&gt;&lt;td&gt;家庭共享、最在意 UX&lt;td&gt;較貴但體驗公認好；無永久免費版&lt;/table&gt;&lt;hr&gt;&lt;h2 id=&quot;結語先免費試,再依需求升級&quot;&gt;結語：先免費試，再依需求升級&lt;/h2&gt;&lt;p&gt;整理三點帶走：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Proton Pass 免費版已經夠大多數人起步&lt;/strong&gt;——無限密碼、Passkey、10 個信箱別名，不是閹割版試用。&lt;li&gt;&lt;strong&gt;升級 Plus 的真正理由&lt;/strong&gt;通常是不限別名、完整 2FA、暗網監控與共享——不是「多存幾組密碼」。&lt;li&gt;&lt;strong&gt;Unlimited 是生態系套裝&lt;/strong&gt;——若你同時需要 VPN 與加密郵件，再一起算帳；若只要密碼管理，不必為名稱多付。&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;下一步：&lt;/strong&gt; 到 &lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass 官網&lt;/a&gt; 註冊免費帳號 → 安裝瀏覽器擴充功能 → 匯入 Chrome 密碼 → 為新註冊的網站開一個 Hide-my-email 別名試試看。用一兩週後，再對照本文決策表判斷要不要升級 Plus 或 Unlimited。&lt;p&gt;沒有一杯咖啡解決不了的密碼焦慮；如果有，就先把金庫從瀏覽器搬出來——然後記得，CSV 刪掉再喝下一杯。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;聯盟揭露：&lt;/strong&gt; 本文包含 Proton Pass 推薦連結。若你透過連結註冊或購買，我可能獲得推薦回饋；這不會增加你的費用。本文依研究筆記與官方文件撰寫，請依你的實際需求與官方當下方案頁做最終決定。&lt;/blockquote&gt;&lt;p&gt;👉 &lt;a href=&quot;https://go.getproton.me/SH2w3&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;&lt;strong&gt;免費申請 Proton Pass 帳號 →&lt;/strong&gt;&lt;/a&gt;&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://proton.me/support/proton-pass-plans-explained&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass plans explained&lt;/a&gt; — 官方整理 Free、Pass Plus、Pass Family 與 Unlimited 的功能差異，含免費版 10 個別名與最多 3 個 2FA 項目。&lt;li&gt;&lt;a href=&quot;https://proton.me/pass/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton Pass Pricing &amp;amp; Plans&lt;/a&gt; — 依地區與計費週期顯示的方案價格、功能對照與 30 天退款說明。&lt;li&gt;&lt;a href=&quot;https://proton.me/support/pass-2fa&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to use 2FA in Proton Pass&lt;/a&gt; — 內建 TOTP 設定方式，以及「不要用 Proton Pass 保護 Proton 帳號本身」的官方提醒。&lt;li&gt;&lt;a href=&quot;https://proton.me/support/pass-import-chrome&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to import to Proton Pass from Chrome&lt;/a&gt; — 從 Google Password Manager 匯出 CSV、匯入 Pass，以及刪除 Chrome 舊資料的步驟。&lt;li&gt;&lt;a href=&quot;https://proton.me/support/pass-email-alias&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hide-my-email aliases&lt;/a&gt; — 別名的建立、轉寄與停用說明。&lt;li&gt;&lt;a href=&quot;https://bitwarden.com/pricing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Bitwarden Pricing&lt;/a&gt; — Bitwarden Premium 年繳美元參考價。&lt;li&gt;&lt;a href=&quot;https://1password.com/pricing/personal&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;1Password Personal Pricing&lt;/a&gt; — 1Password Individual 方案與試用說明。&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>技術部落格怎麼留住讀者？版面、選單與頁面的設計筆記</title>
    <link href="https://kamadiam.com/tech-blog-retention-layout-menu/" />
    <updated>2026-08-12T00:54:00Z</updated>
    <id>https://kamadiam.com/tech-blog-retention-layout-menu/</id>
    <content type="html">&lt;p&gt;沒有一杯咖啡解決不了的「讀完就關掉」；如果有，通常不是再加一個漂浮動畫，而是讀者找不到下一杯該喝什麼。&lt;p&gt;技術部落格很容易變成這樣：文章一篇一篇寫得很認真，首頁卻像自助餐櫃——盤子很多，不知道先拿哪一道。訪客從搜尋引擎進來，讀完一篇，滑到底只看到「上一篇／下一篇」兩個跟主題無關的標題，然後就回去 Google 了。網站沒壞，只是沒有把人留下來的理由。&lt;p&gt;這篇是給&lt;strong&gt;以文章為主的技術筆記站&lt;/strong&gt;的設計筆記：分類清楚、有搜尋、效能也顧了的那種。重點不是改成電商或社群產品，而是讓訪客更容易做到三件事——找到適合自己的內容、連續讀下一篇、下次還想回來。&lt;p&gt;讀完你會帶走：主選單怎麼收、首頁怎麼排、文章頁結尾該放什麼，以及先做哪幾項就夠。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E5%85%88%E8%AC%9B%E7%B5%90%E8%AB%96%E7%95%99%E5%AD%98%E9%9D%A0%E3%80%8C%E4%B8%8B%E4%B8%80%E7%AF%87%E3%80%8D,%E4%B8%8D%E9%9D%A0%E8%A3%9D%E9%A3%BE&quot;&gt;先講結論：留存靠「下一篇」，不靠裝飾&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E4%B8%BB%E9%81%B8%E5%96%AE4~5-%E5%80%8B%E5%85%A5%E5%8F%A3%E5%B0%B1%E5%A4%A0&quot;&gt;主選單：4～5 個入口就夠&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E9%A6%96%E9%A0%81%E5%85%88%E8%AA%AA%E6%B8%85%E6%A5%9A%E7%B6%B2%E7%AB%99%E5%AE%9A%E4%BD%8D&quot;&gt;首頁：先說清楚網站定位&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E6%96%87%E7%AB%A0%E5%8D%A1%E7%89%87%E8%AE%93%E4%BA%BA-3-%E7%A7%92%E5%88%A4%E6%96%B7%E5%80%BC%E4%B8%8D%E5%80%BC%E5%BE%97%E9%BB%9E&quot;&gt;文章卡片：讓人 3 秒判斷值不值得點&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E6%96%87%E7%AB%A0%E9%A0%81%E7%B5%90%E5%B0%BE%E6%AF%94%E9%96%8B%E9%A0%AD%E6%9B%B4%E6%B1%BA%E5%AE%9A%E6%9C%83%E4%B8%8D%E6%9C%83%E7%95%99%E4%B8%8B&quot;&gt;文章頁：結尾比開頭更決定會不會留下&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E5%88%86%E9%A1%9E%E9%A0%81%E4%B8%8D%E8%A6%81%E5%8F%AA%E5%89%A9%E4%B8%80%E6%8E%92%E5%90%8D%E5%AD%97&quot;&gt;分類頁：不要只剩一排名字&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E8%A1%8C%E5%8B%95%E7%89%88%E9%A6%96%E5%B1%8F%E4%B8%8D%E8%A6%81%E8%A2%AB%E9%81%B8%E5%96%AE%E6%93%A0%E7%88%86&quot;&gt;行動版：首屏不要被選單擠爆&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E5%85%88%E5%81%9A%E9%80%99%E4%BA%94%E4%BB%B6,%E5%86%8D%E8%AB%87%E6%94%B6%E8%97%8F%E8%88%87%E9%9B%BB%E5%AD%90%E5%A0%B1&quot;&gt;先做這五件，再談收藏與電子報&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E7%B5%90%E8%AA%9E%E8%8F%9C%E5%96%AE%E5%8F%AF%E4%BB%A5%E7%9F%AD,%E8%B7%AF%E7%B7%9A%E8%A6%81%E6%B8%85%E6%A5%9A&quot;&gt;結語：菜單可以短，路線要清楚&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/tech-blog-retention-layout-menu/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先講結論留存靠「下一篇」,不靠裝飾&quot;&gt;先講結論：留存靠「下一篇」，不靠裝飾&lt;/h2&gt;&lt;p&gt;對這種網站，留存率的核心不是把版面做得更花，而是讓人&lt;strong&gt;更容易點到下一篇有用的文章&lt;/strong&gt;。&lt;p&gt;你可以把它想成咖啡店動線：客人不是要看完整菜單背起來，而是想被帶到「下一杯也適合他的」。選單、首頁、分類頁、文章結尾，都該服務這條動線：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;搜尋進來的一篇文章
→ 相關文章或學習路線
→ 同一主題再讀一篇
→ RSS／回訪理由&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;許多技術站已經把基礎做齊：最新文章 Hero、分類區塊、站內搜尋、RSS、文章目錄、上一篇／下一篇。接下來常見的瓶頸不是「再多一個區塊」，而是&lt;strong&gt;內容導覽&lt;/strong&gt;——讓單篇文章連成一條路。&lt;p&gt;Nielsen Norman Group 對網頁停留的研究也呼應這點：使用者常在前 10–20 秒就決定要不要留下來；頁面若能很快說清楚「這裡有什麼、為什麼值得看」，才比較可能換成幾分鐘的閱讀。技術站的首頁與文章開頭，都該在這段時間內把價值講明白，而不是先秀一排看不出差異的卡片。&lt;h2 id=&quot;主選單4~5-個入口就夠&quot;&gt;主選單：4～5 個入口就夠&lt;/h2&gt;&lt;p&gt;選單不是把全站分類平鋪出來。分類是內容管理方式；選單是幫讀者完成目標。&lt;p&gt;建議控制在這些入口：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;入口&lt;th&gt;它回答的問題&lt;th&gt;不要做成什麼&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;首頁&lt;td&gt;這站是誰、適合我嗎&lt;td&gt;只有最新一篇、沒有定位&lt;tr&gt;&lt;td&gt;學習路線&lt;td&gt;我想系統學會一件事，從哪開始&lt;td&gt;另一份文章清單&lt;tr&gt;&lt;td&gt;文章&lt;td&gt;我想逛最新或全部文章&lt;td&gt;跟首頁重複到分不清&lt;tr&gt;&lt;td&gt;分類&lt;td&gt;我想依主題瀏覽&lt;td&gt;只有分類名稱、沒有介紹&lt;tr&gt;&lt;td&gt;關於&lt;td&gt;作者是誰、為什麼該信這站&lt;td&gt;履歷全文&lt;/table&gt;&lt;p&gt;搜尋與深色模式放工具列就好，不必再佔一個選單字。桌面版選單維持可見；手機版若項目超過約四個，再收進漢堡選單——但 Logo、搜尋仍應留在首屏。NN/g 的研究很直白：隱藏導覽會降低內容被找到的機會；桌面有空間就不要藏，手機才是空間不夠時的取捨。&lt;p&gt;「分類」和「學習路線」不要混成同一個東西：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;分類&lt;/strong&gt;：這篇文章屬於後端、前端、效能、工具……方便過濾。&lt;li&gt;&lt;strong&gt;學習路線&lt;/strong&gt;：為了完成一個目標，建議依序讀哪幾篇。例如「從零架站」「效能調校」「某語言入門」。&lt;/ul&gt;&lt;p&gt;後者才比較容易讓人連續點下去。功能清單式的分類牆，看起來很完整，卻很少幫人決定「下一篇讀哪篇」。&lt;h2 id=&quot;首頁先說清楚網站定位&quot;&gt;首頁：先說清楚網站定位&lt;/h2&gt;&lt;p&gt;不少技術站的首頁會採類似排法：最新文章，接著一串精選分類。方向通常沒錯，但區塊一多，看起來就容易像目錄，不像入口。&lt;p&gt;較乾淨的順序是：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;網站定位與主要行動
↓
最新文章
↓
熱門學習路線（3 條就夠）
↓
熱門／推薦文章
↓
RSS 訂閱&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hero 不要只放最新一篇。新訪客需要先知道「這個網站適合誰」。例如：&lt;blockquote&gt;&lt;p&gt;給想系統學某項技術、或把實戰經驗整理成筆記的開發者。&lt;br&gt;分享教學、工具比較與架站實作。&lt;/blockquote&gt;&lt;p&gt;再配兩個清楚的按鈕：「開始學習」「瀏覽最新文章」。Nielsen Norman Group（尼爾森諾曼集團）把首頁的工作講得很白：要在短時間內強調網站獨特的價值，連結文字也要有資訊氣味——「閱讀全文 →」不如「開始這條效能優化路線」具體。&lt;p&gt;最新文章區塊可以保留大圖 Hero，但補上這些判斷資訊：&lt;ul&gt;&lt;li&gt;發布或更新日期&lt;li&gt;預估閱讀時間&lt;li&gt;文章類型（教學、比較、實戰）&lt;li&gt;明確的閱讀行動&lt;/ul&gt;&lt;p&gt;首頁主題區塊建議只留 3～4 個，其餘用「查看全部」進專題頁。精選區若每欄都長得一樣，大腦會把它當成同一道菜，連續點下去的意願會掉。&lt;h2 id=&quot;文章卡片讓人-3-秒判斷值不值得點&quot;&gt;文章卡片：讓人 3 秒判斷值不值得點&lt;/h2&gt;&lt;p&gt;常見的卡片已有圖片、標題、摘要、分類，但還差&lt;strong&gt;決策資訊&lt;/strong&gt;。建議固定露出：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;分類 · 2026-08-12 · 8 分鐘閱讀&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;閱讀時間可以用正文字數估算，不必人工維護；它不是科學實驗，只是讓讀者知道這杯咖啡大概要喝多久。一篇文章若同時屬於兩個相關分類，卡片上最多留兩個，比只露第一個更有幫助。&lt;p&gt;日期、閱讀時間、類型放在底部對齊，卡片才比較好比。缺這些時，訪客只能靠標題賭，賭輸就關掉——這不是文章不好，是菜單沒標熱量。&lt;h2 id=&quot;文章頁結尾比開頭更決定會不會留下&quot;&gt;文章頁：結尾比開頭更決定會不會留下&lt;/h2&gt;&lt;p&gt;文章開頭維持清楚即可：分類、標題、一句話摘要、更新日期、閱讀時間。長文若有目錄，這件事通常已經先做對。&lt;p&gt;真正容易漏的是&lt;strong&gt;結尾&lt;/strong&gt;。只放「上一篇／下一篇」時，排序是時間，不是主題。讀者剛讀完 PageSpeed 優化，下一篇卻可能是 VPN 評測——這比較像咖啡喝完店員推薦隔桌的三明治，不是同一產區的下一杯。&lt;p&gt;結尾比較有效的是：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;接下來可以閱讀
1. 同分類或同標籤的相關文章 A
2. 相關文章 B
3. 這個主題的學習路線&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;相關文章優先依分類、標籤或人工指定，時間序當備案。若是系列文，直接標「第 2／6 篇」——這比任何動畫都更像「請繼續喝」。&lt;p&gt;回訪入口也放這裡，但不要彈窗攔截。RSS 一句話就夠：&lt;blockquote&gt;&lt;p&gt;這篇若有幫到你，可用 RSS 訂閱同主題的新文章。&lt;/blockquote&gt;&lt;p&gt;電子報可以之後再加；一開始就跳窗要 Email，留存還沒開始，信任先扣分。&lt;h2 id=&quot;分類頁不要只剩一排名字&quot;&gt;分類頁：不要只剩一排名字&lt;/h2&gt;&lt;p&gt;只有分類名稱的頁面，比較像資料庫索引，不像入口。每個分類頁至少補這些：&lt;ul&gt;&lt;li&gt;這分類在講什麼、適合誰&lt;li&gt;文章數量&lt;li&gt;建議閱讀順序（3～5 篇）&lt;li&gt;最新文章列表&lt;/ul&gt;&lt;p&gt;例如某個「靜態網站」分類可以寫成：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;靜態網站建站
適合想建立快速、低維護成本網站的開發者。

建議閱讀順序：
1. 什麼是靜態網站
2. 選型與基礎設定
3. 加入站內搜尋
4. 進行效能優化&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這樣分類頁才會從「標籤牆」變成「從這裡開始」。一篇文章放進多個分類沒關係——同一個內容用不同入口找到，本來就比較符合讀者的腦內分類，只是每個入口都要講清楚自己的用途。&lt;h2 id=&quot;行動版首屏不要被選單擠爆&quot;&gt;行動版：首屏不要被選單擠爆&lt;/h2&gt;&lt;p&gt;窄螢幕上 Header 若直接換行把所有連結攤開，首屏會先被導覽吃掉。比較穩的做法：&lt;ul&gt;&lt;li&gt;Logo、搜尋、主題切換留著&lt;li&gt;其餘收進選單&lt;li&gt;選單裡放「學習路線」，不要把所有分類平鋪&lt;/ul&gt;&lt;p&gt;漢堡選單是手機的妥協，不是桌面的時尚。重點頁（最新文章、某條學習路線）仍應在首頁或文章結尾用一般連結露出，不要假設大家都願意先點那個三條線。&lt;h2 id=&quot;先做這五件,再談收藏與電子報&quot;&gt;先做這五件，再談收藏與電子報&lt;/h2&gt;&lt;p&gt;不必一次改完。建議分三輪，而且先做能接到「下一篇」的。&lt;p&gt;&lt;strong&gt;第一輪：導覽&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;卡片加上日期與閱讀時間&lt;li&gt;文章結尾改放相關文章，而不是只靠時間序&lt;li&gt;整理 3～5 條學習路線&lt;li&gt;分類頁加上介紹與建議順序&lt;li&gt;行動版收合選單&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;第二輪：回訪理由&lt;/strong&gt;&lt;p&gt;RSS 放進文章結尾、標出經典或近期更新文章、系列文標「第 N／M 篇」。收藏或稍後閱讀可以更晚再做——沒有「下一篇」時，收藏只是把迷路延後。&lt;p&gt;&lt;strong&gt;第三輪：用數據看哪條路有走通&lt;/strong&gt;&lt;p&gt;若已接上 GA4 或類似分析工具，不要只看停留時間：技術文章常會切分頁複製程式碼，前景時間會被低估。比較值得看的是：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;想知道什麼&lt;th&gt;比較有用的訊號&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;首頁有沒有把人送進文章&lt;td&gt;首頁到文章的點擊&lt;tr&gt;&lt;td&gt;讀完後有沒有留下&lt;td&gt;文章結尾相關連結的點擊&lt;tr&gt;&lt;td&gt;搜尋有沒有在幫忙&lt;td&gt;搜尋使用次數&lt;tr&gt;&lt;td&gt;分類頁是不是死路&lt;td&gt;分類頁再進入文章的比例&lt;tr&gt;&lt;td&gt;有沒有人回來&lt;td&gt;7 日／30 日回訪使用者&lt;/table&gt;&lt;p&gt;GA4 把「engaged session」定義成：停留超過約 10 秒、有關鍵事件，或至少兩個頁面瀏覽。對技術站來說，「讀完後是否點下一篇」通常比單頁停留秒數更接近真實留存。改完一輪就看同一組指標，才知道是相關文章有效，還是只是當週剛好有一篇爆文。&lt;h2 id=&quot;結語菜單可以短,路線要清楚&quot;&gt;結語：菜單可以短，路線要清楚&lt;/h2&gt;&lt;p&gt;技術部落格不難看，難的是讓人看完還想再看。版面、選單、頁面都該服務同一件事：把「剛好讀到一篇」變成「沿著一條路再讀一篇」。&lt;p&gt;帶走三點就夠：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;選單短、路線清楚&lt;/strong&gt;：分類負責管理，學習路線負責帶路。&lt;li&gt;&lt;strong&gt;首頁先自我介紹，再推最新文&lt;/strong&gt;：10 秒內講完網站適合誰。&lt;li&gt;&lt;strong&gt;文章結尾是留存開關&lt;/strong&gt;：相關文章與系列順序，比上一篇／下一篇更接近讀者要的下一杯。&lt;/ol&gt;&lt;p&gt;先改結尾的相關文章通常最划算——不用重做整個首頁，就能讓已經在讀的人多點一次。改完再來一杯。下一杯建議：挑一篇流量高的文章，看它滑到底之後，下一篇是不是真的相關。&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.nngroup.com/articles/how-long-do-users-stay-on-web-pages/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How Long Do Users Stay on Web Pages?（NN/g）&lt;/a&gt; — 說明前 10–20 秒的去留判斷，以及為何要在短時間內講清價值&lt;li&gt;&lt;a href=&quot;https://www.nngroup.com/articles/homepage-design-principles/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Homepage Design: 5 Fundamental Principles（NN/g）&lt;/a&gt; — 首頁要強調獨特價值、連結要有資訊氣味&lt;li&gt;&lt;a href=&quot;https://www.nngroup.com/articles/menu-design/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Menu-Design Checklist: 17 UX Guidelines（NN/g）&lt;/a&gt; — 選單應協助定位；桌面不宜無故隱藏導覽&lt;li&gt;&lt;a href=&quot;https://www.nngroup.com/articles/hamburger-menus/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hamburger Menus and Hidden Navigation Hurt UX Metrics（NN/g）&lt;/a&gt; — 隱藏導覽會降低可發現性；手機才較常需要這個取捨&lt;li&gt;&lt;a href=&quot;https://www.nngroup.com/articles/top-10-ia-mistakes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Top 10 Information Architecture (IA) Mistakes（NN/g）&lt;/a&gt; — 結構、導覽與搜尋要互相支援，並標示使用者目前在哪&lt;li&gt;&lt;a href=&quot;https://support.google.com/analytics/answer/12195621&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GA4 Engagement rate and bounce rate（Google Analytics Help）&lt;/a&gt; — engaged session 的官方定義，適合作為留存觀察的起點&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>VPN 跟 HTTPS 差在哪？兩者的保護範圍怎麼比？</title>
    <link href="https://kamadiam.com/vpn-vs-https-difference/" />
    <updated>2026-08-10T06:12:00Z</updated>
    <id>https://kamadiam.com/vpn-vs-https-difference/</id>
    <content type="html">&lt;p&gt;咖啡店連上 Wi-Fi，網址列出現鎖頭，很多人就以為「這台手機已經安全了」——鎖頭很可愛，但它只管你和&lt;strong&gt;某一個網站&lt;/strong&gt;之間的傳輸，不是整台手機的保護罩。也有人聽說 VPN 很神，開了以為能防釣魚、防病毒；結果在假網站輸入密碼，VPN 還是會很盡責地把資料加密送到那個假網站。唉。&lt;p&gt;其實 &lt;strong&gt;HTTPS 和 VPN 保護的是不同層次&lt;/strong&gt;：HTTPS 通常由網站和瀏覽器自動協商，保護你和「某個網站」之間的內容；VPN 則是使用者可以選擇啟用，保護裝置到 VPN 伺服器之間的連線。搞懂差異，你才能判斷：哪些情境只要確認 HTTPS 就夠，哪些情境在公共 Wi-Fi 上應該再開 VPN。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E4%B8%80%E5%8F%A5%E8%A9%B1%E8%A8%98%E4%BD%8F%E5%85%A9%E8%80%85%E4%BF%9D%E8%AD%B7%E7%9A%84%E7%AF%84%E5%9C%8D%E4%B8%8D%E5%90%8C&quot;&gt;一句話記住：兩者保護的範圍不同&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#HTTPS-%E4%BF%9D%E8%AD%B7%E4%BB%80%E9%BA%BC?%E9%8E%96%E9%A0%AD%E4%BB%A3%E8%A1%A8%E4%BB%80%E9%BA%BC?&quot;&gt;HTTPS 保護什麼？鎖頭代表什麼？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#VPN-%E8%A3%9C%E4%B8%8A%E5%93%AA%E4%B8%80%E5%A1%8A?%E7%82%BA%E4%BB%80%E9%BA%BC-HTTPS-%E5%A4%A0%E4%BA%86%E9%82%84%E6%9C%89%E4%BA%BA%E9%96%8B-VPN?&quot;&gt;VPN 補上哪一塊？為什麼 HTTPS 夠了還有人開 VPN？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E6%83%85%E5%A2%83%E6%B1%BA%E7%AD%96%E8%A1%A8%E6%88%91%E7%8F%BE%E5%9C%A8%E8%A6%81%E5%81%9A%E7%9A%84%E4%BA%8B,%E9%9C%80%E8%A6%81-VPN-%E5%97%8E?&quot;&gt;情境決策表：我現在要做的事，需要 VPN 嗎？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E5%B8%B8%E8%A6%8B%E8%AA%A4%E8%A7%A3%E5%88%A5%E6%8A%8A%E9%8E%96%E9%A0%AD%E6%88%96-VPN-%E7%95%B6%E8%90%AC%E8%83%BD%E8%97%A5&quot;&gt;常見誤解：別把鎖頭或 VPN 當萬能藥&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E4%B8%89%E5%88%86%E9%90%98%E5%AE%89%E5%85%A8%E6%AA%A2%E6%9F%A5%E6%B8%85%E5%96%AE&quot;&gt;三分鐘安全檢查清單&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7%E8%88%87%E8%B3%87%E6%BA%90&quot;&gt;推薦工具與資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E7%B5%90%E8%AA%9E%E5%85%88%E6%90%9E%E6%87%82%E4%BF%9D%E8%AD%B7%E7%AF%84%E5%9C%8D,%E5%86%8D%E6%B1%BA%E5%AE%9A%E8%A6%81%E4%B8%8D%E8%A6%81%E9%96%8B-VPN&quot;&gt;結語：先搞懂保護範圍，再決定要不要開 VPN&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/vpn-vs-https-difference/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;一句話記住兩者保護的範圍不同&quot;&gt;一句話記住：兩者保護的範圍不同&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;th&gt;HTTPS&lt;th&gt;VPN&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;誰決定是否使用&lt;/strong&gt;&lt;td&gt;網站與瀏覽器自動協商；使用者不能把普通 HTTP 網站「開成」HTTPS&lt;td&gt;使用者自行安裝、連線與關閉&lt;tr&gt;&lt;td&gt;&lt;strong&gt;保護對象&lt;/strong&gt;&lt;td&gt;你和&lt;strong&gt;某一個網站&lt;/strong&gt;之間的連線&lt;td&gt;你的裝置到 &lt;strong&gt;VPN 伺服器&lt;/strong&gt;之間的&lt;strong&gt;整段流量&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;主要功能&lt;/strong&gt;&lt;td&gt;加密內容、防止竄改、驗證網站身分&lt;td&gt;把本地網路／ISP 能看到的活動藏起來，換成 VPN 業者成為信任對象&lt;tr&gt;&lt;td&gt;&lt;strong&gt;典型比喻&lt;/strong&gt;&lt;td&gt;寄信時用密封信封，只有收信人能打開&lt;td&gt;整條路都走加密隧道，路邊的人較難看你去了哪裡&lt;tr&gt;&lt;td&gt;&lt;strong&gt;不能做的事&lt;/strong&gt;&lt;td&gt;不能證明網站不是假的；不保護其他 App 流量&lt;td&gt;不能防釣魚、不能防病毒；目的地若沒 HTTPS 仍可能明文&lt;/table&gt;&lt;p&gt;記這四句就夠（比背 VPN 協定名稱實用多了）：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;網站支援 HTTPS&lt;/strong&gt;：瀏覽器通常會自動使用；你要做的是確認網址是 &lt;code&gt;https://&lt;/code&gt; 且網域正確。&lt;li&gt;&lt;strong&gt;沒有 HTTPS&lt;/strong&gt;：公共 Wi-Fi 上的其他人可能看到或修改你與網站交換的內容；不要登入或輸入敏感資料。&lt;li&gt;&lt;strong&gt;有 HTTPS、沒有 VPN&lt;/strong&gt;：內容通常受保護，但本地網路仍可能知道你連到哪些網域。&lt;li&gt;&lt;strong&gt;有 VPN、沒有 HTTPS&lt;/strong&gt;：裝置到 VPN 這一段受保護，但網站端與 VPN 業者仍是信任問題。&lt;li&gt;&lt;strong&gt;兩者都有&lt;/strong&gt;：公共 Wi-Fi 上較完整的組合——確認 HTTPS 的同時開啟可信任 VPN；但仍不能取代防詐、更新、強密碼與 MFA。&lt;/ul&gt;&lt;h2 id=&quot;HTTPS-保護什麼?鎖頭代表什麼?&quot;&gt;HTTPS 保護什麼？鎖頭代表什麼？&lt;/h2&gt;&lt;p&gt;HTTPS 是 HTTP 加上 TLS 加密。依 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Transport_Layer_Security&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mozilla&lt;/a&gt; 等官方說明，它主要做三件事：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;加密&lt;/strong&gt;：傳輸中的資料不容易被旁觀者讀取。&lt;li&gt;&lt;strong&gt;完整性&lt;/strong&gt;：攻擊者不能在途中悄悄改內容而不被發現。&lt;li&gt;&lt;strong&gt;伺服器驗證&lt;/strong&gt;：瀏覽器透過憑證確認自己連到的是宣稱的網域。&lt;/ol&gt;&lt;p&gt;所以在沒有 HTTPS 的網站上（網址仍是 &lt;code&gt;http://&lt;/code&gt;），公共 Wi-Fi 上的其他人可能看到帳號、密碼或表單內容，也可能改頁面。&lt;strong&gt;千萬不要在 HTTP 網站輸入信用卡或登入資料&lt;/strong&gt;——那就像用透明信封寄密碼，鎖頭還沒上場。&lt;p&gt;但 HTTPS &lt;strong&gt;不是整台裝置的加密罩&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;它通常只保護&lt;strong&gt;瀏覽器與特定網站&lt;/strong&gt;之間的連線，不會自動保護其他 App。&lt;li&gt;網路觀察者通常仍可能知道你連到哪個&lt;strong&gt;網域&lt;/strong&gt;、連線時間與流量大小；不一定能看到具體頁面內容。&lt;li&gt;&lt;strong&gt;有 HTTPS 不代表網站可信&lt;/strong&gt;。假網站也可能申請有效憑證——鎖頭只代表傳輸加密，不代表這家公司是真的（證書不會幫你審核商業道德）。&lt;li&gt;若頁面載入未加密的圖片、腳本等混合內容，整體安全性可能被削弱。&lt;/ul&gt;&lt;p&gt;現代網站大多已強制 HTTPS，Google 也把它當 SEO 因素；Chrome 會把純 HTTP 標成「不安全」。對&lt;strong&gt;站長&lt;/strong&gt;來說，HTTPS 是建站基本功；對&lt;strong&gt;一般使用者&lt;/strong&gt;來說，重點不是「開 HTTPS」，而是：敏感操作前確認網址是 &lt;code&gt;https://&lt;/code&gt;，並核對網域拼字——&lt;code&gt;g00gle.com&lt;/code&gt; 有鎖頭也沒用。若網站只提供 &lt;code&gt;http://&lt;/code&gt;，使用者無法靠設定把它變成安全的 HTTPS；應離開網站。&lt;h2 id=&quot;VPN-補上哪一塊?為什麼-HTTPS-夠了還有人開-VPN?&quot;&gt;VPN 補上哪一塊？為什麼 HTTPS 夠了還有人開 VPN？&lt;/h2&gt;&lt;p&gt;VPN 會在裝置與 VPN 伺服器之間建立加密通道。對公共 Wi-Fi 業者或 ISP 而言，較難直接看到你通道內的瀏覽目的地；網站看到的來源 IP 也通常會變成 VPN 伺服器的 IP。&lt;p&gt;VPN 比較適合這些情境：&lt;ul&gt;&lt;li&gt;你不信任目前的網路（旅館、機場、咖啡店 Wi-Fi）。&lt;li&gt;你不希望本地網路業者直接看到你的瀏覽網域或 DNS 查詢。&lt;li&gt;你需要連回公司或家中的私有網路。&lt;/ul&gt;&lt;p&gt;但 VPN &lt;strong&gt;不是匿名按鈕&lt;/strong&gt;，也不是防毒軟體：&lt;ul&gt;&lt;li&gt;VPN 業者本身成為新的信任對象，可能看見部分連線資訊；挑選時要查隱私政策、商業模式與獨立稽核。&lt;li&gt;VPN 不會阻止釣魚網站、惡意下載、Cookie、帳號登入或裝置指紋追蹤。&lt;li&gt;若目的地網站沒有 HTTPS，VPN 伺服器到網站之間的內容仍可能沒有端對端保護。&lt;li&gt;連線中斷、設定錯誤或未更新時，保護效果可能不如預期。&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://ssd.eff.org/module/choosing-vpn-thats-right-you&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;EFF&lt;/a&gt; 在 2026 年更新的 VPN 指南也提醒：VPN 主要是在保護&lt;strong&gt;網路中繼資料&lt;/strong&gt;（例如你連了哪些網域），以及把信任從 ISP／本地網路&lt;strong&gt;轉移&lt;/strong&gt;到 VPN 業者。HTTPS 管你和網站之間的內容，VPN 管裝置到伺服器之間的通道——在咖啡店、機場、飯店這類公共 Wi-Fi 上，兩者搭配是合理的習慣。&lt;h2 id=&quot;情境決策表我現在要做的事,需要-VPN-嗎?&quot;&gt;情境決策表：我現在要做的事，需要 VPN 嗎？&lt;/h2&gt;&lt;p&gt;把「內容、網域、整台裝置流量」分開想，就不會把 HTTPS 和 VPN 當成同一個開關，也不會在查地圖時為了 HTTPS 反覆找不存在的設定。&lt;h3 id=&quot;公共-Wi-Fi-常見情境&quot;&gt;公共 Wi-Fi 常見情境&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情境&lt;th&gt;HTTPS 要確認什麼&lt;th&gt;沒有 VPN 的限制&lt;th&gt;較實際的做法&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;咖啡店登入銀行或信箱&lt;td&gt;確認網址、網域與官方 App；HTTPS 由瀏覽器自動協商&lt;td&gt;Wi-Fi 業者仍可能看到你連到哪些網域&lt;td&gt;確認 HTTPS &lt;strong&gt;並開啟&lt;/strong&gt;可信任 VPN&lt;tr&gt;&lt;td&gt;在家瀏覽一般 HTTPS 網站&lt;td&gt;確認網址是 &lt;code&gt;https://&lt;/code&gt;；不要把鎖頭當成網站真實性證明&lt;td&gt;ISP 通常仍能看到網域；網站也能用 Cookie 辨識你&lt;td&gt;HTTPS 通常已足夠；需要隱私時用 VPN，並保持系統更新&lt;/table&gt;&lt;h3 id=&quot;我要做什麼-→-怎麼連線一頁帶走&quot;&gt;我要做什麼 → 怎麼連線（一頁帶走）&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;我要做什麼&lt;th&gt;建議連線方式&lt;th&gt;VPN&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;看新聞、查地圖&lt;td&gt;公共 Wi-Fi；確認 HTTPS&lt;td&gt;可選&lt;tr&gt;&lt;td&gt;機場查航班&lt;td&gt;公共 Wi-Fi；確認 HTTPS&lt;td&gt;可選&lt;tr&gt;&lt;td&gt;飯店 Wi-Fi 看 YouTube&lt;td&gt;飯店 Wi-Fi + VPN；確認 HTTPS&lt;td&gt;可選&lt;tr&gt;&lt;td&gt;登入信箱、社群&lt;td&gt;公共 Wi-Fi + VPN；確認 HTTPS 與網域&lt;td&gt;✅ 建議&lt;tr&gt;&lt;td&gt;咖啡廳寄信&lt;td&gt;咖啡廳 Wi-Fi + VPN；確認 HTTPS 與網域&lt;td&gt;✅ 建議&lt;tr&gt;&lt;td&gt;登入銀行 App&lt;td&gt;公共 Wi-Fi + VPN；使用官方 App 或確認 HTTPS&lt;td&gt;✅ 建議&lt;tr&gt;&lt;td&gt;網銀轉帳&lt;td&gt;公共 Wi-Fi + VPN；使用官方 App 或確認 HTTPS&lt;td&gt;✅ 建議&lt;/table&gt;&lt;h3 id=&quot;只有-HTTPS-夠嗎?快速對照&quot;&gt;只有 HTTPS 夠嗎？快速對照&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;只做這件事&lt;th&gt;HTTPS 怎麼處理&lt;th&gt;VPN（公共 Wi-Fi 上）&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;看新聞、查地圖&lt;td&gt;確認 &lt;code&gt;https://&lt;/code&gt;；通常由瀏覽器自動使用&lt;td&gt;可選&lt;tr&gt;&lt;td&gt;登入信箱、社群&lt;td&gt;確認 &lt;code&gt;https://&lt;/code&gt; 與正確網域&lt;td&gt;✅ 建議&lt;tr&gt;&lt;td&gt;網銀、購物、公司系統&lt;td&gt;HTTPS 必須存在，並確認網域或官方 App&lt;td&gt;✅ 建議&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Q：公共 Wi-Fi 上需要 VPN 嗎？HTTPS 夠不夠？&lt;/strong&gt;&lt;p&gt;短答：這不是二選一。&lt;strong&gt;HTTPS 保護你和網站之間的內容&lt;/strong&gt;，網站支援時瀏覽器會自動使用，你要做的是確認網址與網域正確。&lt;strong&gt;VPN 保護裝置到 VPN 伺服器之間的整段流量&lt;/strong&gt;，在公共 Wi-Fi（咖啡店、機場、飯店）上&lt;strong&gt;建議開啟&lt;/strong&gt;，與 HTTPS 搭配使用。&lt;p&gt;HTTPS 保護你和&lt;strong&gt;正確網站&lt;/strong&gt;之間的傳輸內容；但它不能證明你連的是真網站，也不能完全隱藏網域、連線時間與流量模式。VPN 可以減少本地網路直接看到這些資訊，但會把部分信任轉移給 VPN 業者。兩者保護範圍不同，在公共 Wi-Fi 上應該一起用，而不是只依賴鎖頭。&lt;h2 id=&quot;常見誤解別把鎖頭或-VPN-當萬能藥&quot;&gt;常見誤解：別把鎖頭或 VPN 當萬能藥&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;「有鎖頭就安全」&lt;/strong&gt; — 假網站也可能有 HTTPS；要看網域是否正確，必要時用書籤或官方 App。&lt;li&gt;&lt;strong&gt;「開了 VPN 就不會被駭」&lt;/strong&gt; — VPN 不防釣魚；你若在仿冒 HTTPS 網站輸入密碼，VPN 仍會把資料加密送到那個假網站（加密很盡責，方向錯了）。&lt;li&gt;&lt;strong&gt;「飯店 Wi-Fi 有密碼就安全」&lt;/strong&gt; — 密碼通常只防路過的人；同飯店其他住客或被入侵的路由器仍有風險。連上後應開啟可信任 VPN，並確認 HTTPS 與網域。&lt;li&gt;&lt;strong&gt;「VPN 可以取代防毒、MFA、更新」&lt;/strong&gt; — 不能。完整防線還需要強密碼、多因素驗證、系統與瀏覽器更新。&lt;/ol&gt;&lt;h2 id=&quot;三分鐘安全檢查清單&quot;&gt;三分鐘安全檢查清單&lt;/h2&gt;&lt;p&gt;出門連陌生 Wi-Fi 前，照這六步做（比多下載三個「Wi-Fi 加速器」實用）：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;先確認網路名稱&lt;/strong&gt;：向店家或櫃檯確認 SSID，不要只選訊號最強的同名網路。&lt;li&gt;&lt;strong&gt;先看網址&lt;/strong&gt;：敏感操作前確認是 &lt;code&gt;https://&lt;/code&gt;，不要因為有鎖頭就忽略網域拼字。&lt;li&gt;&lt;strong&gt;連上公共 Wi-Fi 先開 VPN&lt;/strong&gt;：咖啡店、機場、飯店等陌生網路，確認 HTTPS 的同時啟用可信任 VPN。&lt;li&gt;&lt;strong&gt;選可信任的 VPN 服務&lt;/strong&gt;：查隱私政策、商業模式與獨立稽核；建議開啟 Kill Switch。&lt;li&gt;&lt;strong&gt;關閉自動連線與檔案分享&lt;/strong&gt;：公共網路上關閉自動加入 Wi-Fi、AirDrop／檔案分享等不需要的功能。&lt;li&gt;&lt;strong&gt;補上其他防線&lt;/strong&gt;：更新系統與瀏覽器、使用獨立強密碼、開啟 MFA，並保留裝置防毒與備份。&lt;/ol&gt;&lt;h2 id=&quot;推薦工具與資源&quot;&gt;推薦工具與資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;適合誰&lt;th&gt;說明&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN&lt;/a&gt;&lt;/strong&gt;（主推）&lt;td&gt;常在公共 Wi-Fi、旅行、需要免費入門的人&lt;td&gt;免費版已有 Kill Switch、無日誌政策與不限流量；連上咖啡店、機場 Wi-Fi 時建議先開。付費版解鎖更多國家、串流與進階功能。&lt;tr&gt;&lt;td&gt;密碼管理器 + MFA&lt;td&gt;所有有帳號的人&lt;td&gt;VPN 與 HTTPS 都不防帳號被盜；強密碼與驗證器 App 是基本配。&lt;/table&gt;&lt;p&gt;若你還在猶豫免費版夠不夠用，可參考站內 &lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/&quot;&gt;Proton VPN 付費版評價&lt;/a&gt; 或 &lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/&quot;&gt;免費版與付費版完整解析&lt;/a&gt;。&lt;h2 id=&quot;結語先搞懂保護範圍,再決定要不要開-VPN&quot;&gt;結語：先搞懂保護範圍，再決定要不要開 VPN&lt;/h2&gt;&lt;p&gt;HTTPS 和 VPN 不是同一個開關，而是&lt;strong&gt;保護範圍不同的工具&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;HTTPS 通常由網站與瀏覽器自動協商，保護你和網站之間的&lt;strong&gt;內容&lt;/strong&gt;有沒有被看見、被改掉。&lt;li&gt;VPN 由使用者選擇啟用，減少本地網路／ISP &lt;strong&gt;直接知道你連到哪些網域&lt;/strong&gt;，但新增 VPN 業者這個信任對象。&lt;/ul&gt;&lt;p&gt;看地圖、刷新聞，在公共 Wi-Fi 上確認 HTTPS 並&lt;strong&gt;開啟 VPN&lt;/strong&gt;；登入信箱、網銀或在飯店 Wi-Fi 上工作，同樣建議 &lt;strong&gt;HTTPS + 可信任 VPN&lt;/strong&gt; 一起用。VPN 不能取代防釣魚與 MFA，但能補上 HTTPS 管不到的網路通道保護。&lt;p&gt;若你常在咖啡店、機場或旅館上網，可以先從 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN&lt;/a&gt; 免費版試起——在家連一次、開好 Kill Switch，下次連公共 Wi-Fi 就知道該怎麼搭配 HTTPS 使用。沒有一杯咖啡解決不了的網路焦慮；如果有，就加一層 VPN——然後記得，咖啡還是要自己付。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;聯盟揭露：&lt;/strong&gt; 本文包含 Proton VPN 推薦連結。如果你透過連結註冊或購買，我可能獲得推薦回饋；這不會增加你的費用。&lt;/blockquote&gt;&lt;p&gt;👉 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;&lt;strong&gt;免費申請 Proton VPN 帳號 →&lt;/strong&gt;&lt;/a&gt;&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Transport_Layer_Security&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Mozilla MDN：Transport Layer Security (TLS)&lt;/a&gt; — TLS 的加密、完整性、驗證與混合內容說明。&lt;li&gt;&lt;a href=&quot;https://ssd.eff.org/module/choosing-vpn-thats-right-you&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;EFF Surveillance Self-Defense：Choosing the VPN That&#39;s Right for You&lt;/a&gt; — VPN 用途、限制、信任轉移與選擇準則。&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/news-events/news/securing-wireless-networks&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CISA：Securing Wireless Networks&lt;/a&gt; — 公共 Wi-Fi、假基地台與流量監聽風險。&lt;li&gt;&lt;a href=&quot;https://consumer.ftc.gov/articles/are-public-wi-fi-networks-safe-what-you-need-know&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;FTC：Are Public Wi-Fi Networks Safe?&lt;/a&gt; — 公共 Wi-Fi、HTTPS 與假網站提醒。&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/blog/public-wifi-and-https&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN：Why you need VPN to stay safe on public WiFi&lt;/a&gt; — DNS 查詢、公共 Wi-Fi 與 VPN 的差異說明。&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Proton VPN 付費版評價：VPN Plus 值得訂閱嗎？</title>
    <link href="https://kamadiam.com/proton-vpn-paid-review/" />
    <updated>2026-08-10T05:18:00Z</updated>
    <id>https://kamadiam.com/proton-vpn-paid-review/</id>
    <content type="html">&lt;p&gt;你已經用 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN&lt;/a&gt; 免費版一陣子了——不限流量、沒廣告，在咖啡店連公共 Wi‑Fi 還算安心。結果一到尖峰時段，影片轉圈圈、不能自己選國家、串流跟 BT 下載通通說再見，你就會開始想：&lt;strong&gt;付費版到底值不值得？還是免費版已經夠我這杯咖啡的預算？&lt;/strong&gt;&lt;p&gt;這篇不談「VPN 是什麼」（那篇留給入門文），專攻 &lt;strong&gt;VPN Plus 付費版評價&lt;/strong&gt;：速度差多少、哪些功能只有付費才有、跟 NordVPN、Surfshark 比怎麼選，以及訂閱前該確認的價格與退款條件。若你想先看免費版全貌，可搭配站內另一篇 &lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/&quot;&gt;Proton VPN 值得買嗎？免費版與付費版功能完整解析&lt;/a&gt;。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E5%85%88%E8%AC%9B%E7%B5%90%E8%AB%96%E4%BB%98%E8%B2%BB%E7%89%88%E9%81%A9%E5%90%88%E8%AA%B0?&quot;&gt;先講結論：付費版適合誰？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E4%BB%98%E8%B2%BB%E7%89%88%E5%A4%9A%E4%BA%86%E4%BB%80%E9%BA%BC?VPN-Plus-%E5%8A%9F%E8%83%BD%E8%A9%95%E5%83%B9&quot;&gt;付費版多了什麼？（VPN Plus 功能評價）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E4%BB%98%E8%B2%BB%E7%89%88%E5%80%BC%E5%BE%97%E8%B2%B7%E5%97%8E?%E6%B1%BA%E7%AD%96%E8%A1%A8&quot;&gt;付費版值得買嗎？決策表&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E5%83%B9%E6%A0%BC%E8%88%87%E6%96%B9%E6%A1%88%E5%88%A5%E5%8F%AA%E7%9C%8B%E4%BF%83%E9%8A%B7%E6%A8%99%E8%AA%9E&quot;&gt;價格與方案：別只看促銷標語&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E8%B7%9F-NordVPNSurfshark-%E6%AF%94%E4%BB%98%E8%B2%BB%E7%89%88%E7%AB%99%E5%BE%97%E4%BD%8F%E5%97%8E?&quot;&gt;跟 NordVPN、Surfshark 比：付費版站得住嗎？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E4%B8%B2%E6%B5%81%E5%AF%A6%E9%9A%9B%E8%A1%A8%E7%8F%BE%E4%BB%98%E8%B2%BB%E7%89%88%E7%9A%84%E7%9C%9F%E5%AF%A6%E6%9C%9F%E5%BE%85&quot;&gt;串流實際表現：付費版的真實期待&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E8%A8%82%E9%96%B1%E5%89%8D%E6%AA%A2%E6%9F%A5%E6%B8%85%E5%96%AE&quot;&gt;訂閱前檢查清單&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7/%E8%B3%87%E6%BA%90&quot;&gt;推薦工具／資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E7%B5%90%E8%AA%9E%E6%88%91%E7%9A%84%E8%A9%95%E5%83%B9&quot;&gt;結語：我的評價&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-paid-review/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2 id=&quot;先講結論付費版適合誰?&quot;&gt;先講結論：付費版適合誰？&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情境&lt;th&gt;建議&lt;th&gt;原因&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;只在咖啡店偶爾上網、1 台裝置就夠&lt;td&gt;&lt;strong&gt;先維持免費版&lt;/strong&gt;&lt;td&gt;免費版已有 Kill Switch、無日誌、不限流量；付費的串流／選國家你用不到&lt;tr&gt;&lt;td&gt;想看 Netflix、Disney+ 等地區片庫&lt;td&gt;&lt;strong&gt;VPN Plus&lt;/strong&gt;&lt;td&gt;官方串流支援僅限付費方案；免費版不包含&lt;tr&gt;&lt;td&gt;需要 BT／P2P 下載&lt;td&gt;&lt;strong&gt;VPN Plus&lt;/strong&gt;&lt;td&gt;免費版不支援 P2P；Plus 有專用高速伺服器&lt;tr&gt;&lt;td&gt;家中 2–10 台裝置同時連線&lt;td&gt;&lt;strong&gt;VPN Plus&lt;/strong&gt;&lt;td&gt;最多 10 個同時連線（每個使用中的瀏覽器擴充也算 1 個）&lt;tr&gt;&lt;td&gt;重視可驗證的隱私證據，偶爾需要 Secure Core&lt;td&gt;&lt;strong&gt;VPN Plus&lt;/strong&gt;&lt;td&gt;Secure Core、NetShield、Stealth 混淆協定都是付費功能&lt;tr&gt;&lt;td&gt;同時需要 Proton Mail、Drive、Pass&lt;td&gt;&lt;strong&gt;Proton Unlimited&lt;/strong&gt;&lt;td&gt;別只用 VPN 月費比；把整個生態系需求一起算&lt;tr&gt;&lt;td&gt;家中超過 10 台裝置常同時連線&lt;td&gt;&lt;strong&gt;先比 Surfshark&lt;/strong&gt;&lt;td&gt;Surfshark 付費方案不限同時連線；Proton Plus 上限 10 台&lt;tr&gt;&lt;td&gt;主要追求最低月費或電視 Smart DNS 便利&lt;td&gt;&lt;strong&gt;先比 NordVPN&lt;/strong&gt;&lt;td&gt;NordVPN 在串流設備與近距離延遲上常有優勢，但隱私透明度呈現方式不同&lt;/table&gt;&lt;p&gt;&lt;strong&gt;一句話總結&lt;/strong&gt;：付費版的核心價值不是「比免費版快一點點」——那是把 VPN 當成咖啡濃縮，其實你缺的是整杯。完整伺服器選擇、串流／P2P、多裝置，加上 Secure Core 等進階功能，才是升級理由。若你只用免費版做基本加密，其實已經比多數免費 VPN 安全；付費是為了解除那些「剛好卡住你」的限制。&lt;h2 id=&quot;付費版多了什麼?VPN-Plus-功能評價&quot;&gt;付費版多了什麼？（VPN Plus 功能評價）&lt;/h2&gt;&lt;h3 id=&quot;速度差距比你想的大&quot;&gt;速度：差距比你想的大&lt;/h3&gt;&lt;p&gt;Proton 不對免費版人工限速，但免費伺服器（美國、荷蘭、日本）負載高，尖峰時段常擠——就像尖峰時段只有三條免費高速公路可選，還不能自己挑出口。第三方測試與社群實測的參考區間如下：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指標&lt;th&gt;免費版&lt;th&gt;VPN Plus 付費版&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;典型下載速度&lt;td&gt;50–150 Mbps（尖峰可能 &amp;lt;30 Mbps）&lt;td&gt;950–1,500+ Mbps&lt;tr&gt;&lt;td&gt;典型上傳速度&lt;td&gt;30–80 Mbps&lt;td&gt;800–1,200+ Mbps&lt;tr&gt;&lt;td&gt;延遲（Ping）&lt;td&gt;20–200+ ms&lt;td&gt;本地 5–30 ms；跨國 80–150 ms&lt;tr&gt;&lt;td&gt;伺服器&lt;td&gt;3 國自動分配&lt;td&gt;140+ 國、20,000+ 台 10 Gbps 伺服器&lt;tr&gt;&lt;td&gt;網路優先權&lt;td&gt;低（排隊等頻寬）&lt;td&gt;高（Priority Access）&lt;/table&gt;&lt;p&gt;付費版還有 &lt;strong&gt;VPN Accelerator&lt;/strong&gt;：透過優化 TCP 擁塞控制，長途連線速度可提升數倍。日常 4K 串流、大檔下載、視訊會議，付費版的穩定度通常明顯好一截。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;誠實提醒&lt;/strong&gt;：以上數字來自第三方基準測試，你的實際結果會受 ISP、地理位置、伺服器負載與協定影響。訂閱前建議自己測——別讓評測文替你喝這杯苦澀的現實咖啡。&lt;/blockquote&gt;&lt;h3 id=&quot;只有付費版才有的功能&quot;&gt;只有付費版才有的功能&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;th&gt;做什麼&lt;th&gt;適合誰&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;完整伺服器選擇&lt;/strong&gt;&lt;td&gt;自由選 140+ 國家，不再被系統分配到美／荷／日&lt;td&gt;需要特定地區 IP 的人&lt;tr&gt;&lt;td&gt;&lt;strong&gt;串流支援&lt;/strong&gt;&lt;td&gt;官方列出的 Netflix、Disney+ 等 Plus 伺服器&lt;td&gt;旅行或跨區看自有訂閱的片庫&lt;tr&gt;&lt;td&gt;&lt;strong&gt;P2P／BT&lt;/strong&gt;&lt;td&gt;專用高速伺服器&lt;td&gt;合法的大檔傳輸需求&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Secure Core&lt;/strong&gt;&lt;td&gt;流量先經瑞士／冰島／瑞典入口，再到出口國&lt;td&gt;高風險地區出口、重視實體防禦的使用者&lt;tr&gt;&lt;td&gt;&lt;strong&gt;NetShield&lt;/strong&gt;&lt;td&gt;DNS 級別擋惡意網域、廣告與追蹤器&lt;td&gt;想少裝一個廣告攔截器的人&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Stealth 協議&lt;/strong&gt;&lt;td&gt;把 VPN 流量偽裝成 HTTPS，繞過 DPI 審查&lt;td&gt;在嚴格網路環境需要連線的人&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Split Tunneling&lt;/strong&gt;&lt;td&gt;指定哪些 App 走 VPN、哪些走直連&lt;td&gt;同時要本地銀行 App 與 VPN 的場景&lt;tr&gt;&lt;td&gt;&lt;strong&gt;瀏覽器擴充&lt;/strong&gt;&lt;td&gt;Chrome／Firefox 一鍵連線&lt;td&gt;只想保護瀏覽器、不想全機 VPN 的人&lt;/table&gt;&lt;p&gt;Secure Core 和 Stealth 是 Proton 付費版較有特色的進階功能，多數競品沒有同等架構。但若你只是在家看串流，這兩個功能不是必開——Secure Core 還會讓速度更慢，官方也不建議拿它來排串流。開 Secure Core 看 Netflix，就像穿三層雨衣去海邊——很安全，但你不會因此游得比較快。&lt;h3 id=&quot;隱私與安全付費版有比較安全嗎?&quot;&gt;隱私與安全：付費版有比較安全嗎？&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;加密標準免費與付費相同&lt;/strong&gt;（AES-256、WireGuard 等），差別在進階功能與伺服器架構：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;無日誌政策&lt;/strong&gt;：免費與付費共用同一套政策；Securitum 已連續第五年稽核，2026 年報告未發現伺服器記錄瀏覽活動或連線中繼資料。&lt;li&gt;&lt;strong&gt;瑞士管轄&lt;/strong&gt;：截至 2026 年 6 月的透明度報告，47 件外國請求全部標為無法提供資料——因為沒有紀錄可交。&lt;li&gt;&lt;strong&gt;開源 App&lt;/strong&gt;：程式碼公開在 GitHub，任何人可審計。&lt;li&gt;&lt;strong&gt;Kill Switch&lt;/strong&gt;：免費版也有；但 macOS 切換伺服器時可能有短暫 IP 暴露，各平台限制不同。&lt;/ul&gt;&lt;p&gt;付費版真正的安全加值是 &lt;strong&gt;Secure Core&lt;/strong&gt;（多一跳、實體防禦入口）和 &lt;strong&gt;NetShield&lt;/strong&gt;（擋已知惡意網域），不是「付費才加密」。若你重視可驗證的隱私證據，Proton 在公開稽核與開源這點上，確實比多數競品透明。&lt;h2 id=&quot;付費版值得買嗎?決策表&quot;&gt;付費版值得買嗎？決策表&lt;/h2&gt;&lt;p&gt;把「要不要付費」拆成可勾選的條件：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的需求&lt;th&gt;免費版夠嗎？&lt;th&gt;付費版加分多少？&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;公共 Wi‑Fi 基本加密&lt;td&gt;✅ 夠&lt;td&gt;付費主要是速度與穩定度&lt;tr&gt;&lt;td&gt;自己選伺服器國家&lt;td&gt;❌ 不夠&lt;td&gt;⭐⭐⭐ 必要&lt;tr&gt;&lt;td&gt;Netflix／Disney+ 串流&lt;td&gt;❌ 不夠&lt;td&gt;⭐⭐⭐ 必要（但仍不保證每部片）&lt;tr&gt;&lt;td&gt;BT／P2P 下載&lt;td&gt;❌ 不夠&lt;td&gt;⭐⭐⭐ 必要&lt;tr&gt;&lt;td&gt;同時 2 台以上裝置&lt;td&gt;❌ 免費只有 1 台&lt;td&gt;⭐⭐⭐ 必要&lt;tr&gt;&lt;td&gt;擋廣告／惡意網域&lt;td&gt;❌ 沒有 NetShield&lt;td&gt;⭐⭐ 加分&lt;tr&gt;&lt;td&gt;繞過嚴格網路審查&lt;td&gt;❌ 沒有 Stealth&lt;td&gt;⭐⭐ 加分&lt;tr&gt;&lt;td&gt;高風險出口監控&lt;td&gt;❌ 沒有 Secure Core&lt;td&gt;⭐⭐ 加分（少數人需要）&lt;tr&gt;&lt;td&gt;只要最低月費&lt;td&gt;✅ 免費 $0&lt;td&gt;付費未必最便宜——見下方競品比較&lt;/table&gt;&lt;p&gt;&lt;strong&gt;勾選 3 項以上「付費版必要」&lt;/strong&gt; → 升級 VPN Plus 很合理。&lt;br&gt;&lt;strong&gt;只勾 1 項「速度」&lt;/strong&gt; → 建議先在自己網路實測免費版尖峰速度，再決定。別為了「感覺比較快」付年費，結果發現瓶頸其實是你家 Wi‑Fi——那杯咖啡就白喝了。&lt;h2 id=&quot;價格與方案別只看促銷標語&quot;&gt;價格與方案：別只看促銷標語&lt;/h2&gt;&lt;p&gt;官方結帳頁價格會依幣別、地區與促銷變動，以下為研究時的快照，&lt;strong&gt;訂閱前請直接查官方頁面&lt;/strong&gt;：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;th&gt;計費方式&lt;th&gt;參考價格（快照）&lt;th&gt;適合誰&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Proton Free&lt;td&gt;—&lt;td&gt;$0&lt;td&gt;輕度使用者、先建立信任&lt;tr&gt;&lt;td&gt;VPN Plus&lt;td&gt;月繳&lt;td&gt;約 US$9.99／月&lt;td&gt;短期試用、不想一次付兩年&lt;tr&gt;&lt;td&gt;VPN Plus&lt;td&gt;年繳&lt;td&gt;約 US$3.99／月（一次 US$47.88）&lt;td&gt;確定會用滿一年&lt;tr&gt;&lt;td&gt;VPN Plus&lt;td&gt;兩年繳&lt;td&gt;約 US$2.99／月（一次 US$71.76）&lt;td&gt;長期使用者、單看 VPN 最划算&lt;tr&gt;&lt;td&gt;Proton Unlimited&lt;td&gt;依官方頁&lt;td&gt;含 Mail、Drive、Pass、VPN&lt;td&gt;本來就要用 Proton 全家桶&lt;/table&gt;&lt;p&gt;結帳前三件事：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;看「今天要付多少」&lt;/strong&gt;，不是只看每月折算價。&lt;li&gt;&lt;strong&gt;記下續費價格&lt;/strong&gt;——促銷期過後可能不同。&lt;li&gt;&lt;strong&gt;確認付款管道&lt;/strong&gt;——官網、App Store、Google Play 的退款入口不一樣。&lt;/ol&gt;&lt;h3 id=&quot;30-天退款訂閱前的安全網&quot;&gt;30 天退款：訂閱前的安全網&lt;/h3&gt;&lt;p&gt;首次直接向 Proton 購買，可在 &lt;strong&gt;30 天內&lt;/strong&gt;取消並申請退款（每位使用者退款選項通常只能用一次）。重點：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;取消 ≠ 退款&lt;/strong&gt;：兩個動作都要做。&lt;li&gt;&lt;strong&gt;刪除 App 不會停扣款&lt;/strong&gt;：必須在原付款管道取消續訂。&lt;li&gt;&lt;strong&gt;App Store／Google Play 購買&lt;/strong&gt;：退款要走 Apple 或 Google 的流程，不是 Proton 網站。&lt;li&gt;取消後通常仍可用到目前計費週期結束，之後降回免費版。&lt;/ul&gt;&lt;p&gt;若你只是不確定付費版好不好用，善用 30 天退款期在自己網路實測，比看十篇評測文更有說服力——畢竟你的 ISP 不會因為別人測速漂亮就對你特別溫柔。&lt;h2 id=&quot;跟-NordVPNSurfshark-比付費版站得住嗎?&quot;&gt;跟 NordVPN、Surfshark 比：付費版站得住嗎？&lt;/h2&gt;&lt;p&gt;若你已經決定要付費 VPN，但還在猶豫品牌：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;比較面向&lt;th&gt;Proton VPN Plus&lt;th&gt;NordVPN&lt;th&gt;Surfshark&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;同時連線數&lt;td&gt;10 台&lt;td&gt;10 台&lt;td&gt;不限&lt;tr&gt;&lt;td&gt;隱私透明度&lt;td&gt;Securitum 稽核公開、App 開源、瑞士管轄&lt;td&gt;Deloitte 查核（報告需登入查閱）、巴拿馬公司&lt;td&gt;Deloitte 查核、荷蘭管轄&lt;tr&gt;&lt;td&gt;免費入門&lt;td&gt;✅ 不限流量免費版&lt;td&gt;❌ 無&lt;td&gt;❌ 無&lt;tr&gt;&lt;td&gt;串流設備便利&lt;td&gt;路由器／支援的 App&lt;td&gt;Smart DNS 對電視較方便&lt;td&gt;Fire TV、Android TV 等官方支援完整&lt;tr&gt;&lt;td&gt;獨特功能&lt;td&gt;Secure Core、Stealth、NetShield&lt;td&gt;NordLynx、威脅防護套件&lt;td&gt;不限裝置、RAM-only 伺服器&lt;tr&gt;&lt;td&gt;30 天退款&lt;td&gt;✅（依付款管道）&lt;td&gt;✅（續費不在內）&lt;td&gt;✅（依方案與管道）&lt;/table&gt;&lt;p&gt;&lt;strong&gt;選 Proton 付費版&lt;/strong&gt;，若你已經用免費版、想無縫升級；重視公開稽核報告與開源；裝置數 ≤10 台；需要 Secure Core 或 Stealth。&lt;p&gt;&lt;strong&gt;先試 NordVPN&lt;/strong&gt;，若你主要在智慧電視／遊戲主機看串流（Smart DNS 較省事）；重視近距離低延遲；不在意沒有免費版可長期使用。&lt;p&gt;&lt;strong&gt;先試 Surfshark&lt;/strong&gt;，若你家中同時連線超過 10 台；預算優先、想要不限裝置。&lt;p&gt;沒有絕對贏家——兩家都有獨立無日誌查核，差別在證據呈現方式、功能取向與你的使用情境。建議在 30 天退款期內各測自己常用的串流服務與網路環境。&lt;h2 id=&quot;串流實際表現付費版的真實期待&quot;&gt;串流實際表現：付費版的真實期待&lt;/h2&gt;&lt;p&gt;付費版才支援官方串流伺服器，但這不代表「買了就能看全世界」：&lt;ul&gt;&lt;li&gt;Netflix、Disney+ 仍需&lt;strong&gt;另外訂閱&lt;/strong&gt;；VPN 訂閱不包含串流會員。&lt;li&gt;Netflix &lt;strong&gt;廣告方案&lt;/strong&gt;與&lt;strong&gt;直播活動&lt;/strong&gt;官方明確不支援 VPN。&lt;li&gt;串流平台會更新封鎖規則，&lt;strong&gt;不能保證永久解鎖&lt;/strong&gt;任何片名。&lt;li&gt;排串流問題時，&lt;strong&gt;不要用 Secure Core&lt;/strong&gt;——它為安全設計，不是為速度。&lt;li&gt;遇到「使用 VPN 或 Proxy」錯誤：換 Plus 伺服器 → 重開 App → 清快取 → 暫時關 NetShield 測試 → 用 ipleak.net 查 IP／DNS 洩漏。&lt;/ul&gt;&lt;p&gt;合理期待：付費版讓你在旅行或跨區時，&lt;strong&gt;有機會&lt;/strong&gt;用自有訂閱看原本的片庫；不是繞過版權的萬能鑰匙。VPN 不是 Netflix 會員卡的加購醬料包。&lt;h2 id=&quot;訂閱前檢查清單&quot;&gt;訂閱前檢查清單&lt;/h2&gt;&lt;p&gt;在按下付款前，逐項確認：&lt;ul&gt;&lt;li&gt;[ ] 我需要的功能（串流／P2P／多裝置／選國家）免費版確實做不到&lt;li&gt;[ ] 同時連線裝置數 ≤10（含瀏覽器擴充）&lt;li&gt;[ ] 已看過官方當下價格與&lt;strong&gt;續費價格&lt;/strong&gt;&lt;li&gt;[ ] 知道退款入口（官網／Apple／Google）&lt;li&gt;[ ] 會在 30 天內實測常用服務與網路速度&lt;li&gt;[ ] 不把 VPN 當成防毒或完全匿名工具&lt;/ul&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;產品&lt;th&gt;適合誰&lt;th&gt;說明&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN Plus&lt;/a&gt;&lt;/strong&gt;（主推）&lt;td&gt;已用免費版、需要串流／P2P／多裝置／完整伺服器&lt;td&gt;30 天退款可實測；開源 App + 公開無日誌稽核&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Unlimited&lt;/strong&gt;&lt;td&gt;同時需要 Mail、Drive、Pass 的 Proton 生態系使用者&lt;td&gt;別只用 VPN 單價比，把全家桶需求一起算&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Free&lt;/strong&gt;&lt;td&gt;輕度使用者、還不確定要不要付費&lt;td&gt;先建立信任，確認限制再升級&lt;tr&gt;&lt;td&gt;NordVPN&lt;td&gt;重視電視串流便利（Smart DNS）、近距離低延遲&lt;td&gt;隱私查核報告需登入查閱；無免費版&lt;tr&gt;&lt;td&gt;Surfshark&lt;td&gt;家中超過 10 台裝置同時連線&lt;td&gt;不限同時連線；荷蘭管轄、Deloitte 查核&lt;/table&gt;&lt;h2 id=&quot;結語我的評價&quot;&gt;結語：我的評價&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Proton VPN 付費版（VPN Plus）值得訂閱嗎？&lt;/strong&gt;——若你已經被免費版的「不能選國家、不能串流、只有 1 台裝置、尖峰變慢」卡住，&lt;strong&gt;值得&lt;/strong&gt;。付費版解的不只是速度，而是把 VPN 從「偶爾用用的安全網」變成「日常可用的完整工具」。&lt;p&gt;但若你只是偶爾在咖啡店上網、一台手機就夠，&lt;strong&gt;免費版已經是市場上少數真正可信的選擇&lt;/strong&gt;，不必為了「付費比較安心」而多花錢——加密標準是一樣的，你的錢包不會因為多付而多一層 AES-256。&lt;p&gt;三個重點帶走：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;付費版的核心價值&lt;/strong&gt;是串流、P2P、多裝置、完整伺服器與 Secure Core／NetShield／Stealth，不是「付費才安全」。&lt;li&gt;&lt;strong&gt;價格要看續費與付款管道&lt;/strong&gt;，善用 30 天退款在自己網路實測。&lt;li&gt;&lt;strong&gt;競品不是全面輸贏&lt;/strong&gt;——裝置數 &amp;gt;10 看 Surfshark，電視串流便利看 NordVPN，隱私透明度與免費漏斗看 Proton。&lt;/ol&gt;&lt;p&gt;若你確認需要 Plus 的功能，建議先到 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton 官網&lt;/a&gt; 領免費帳號（若還沒有）→ 在 30 天退款期內升級 VPN Plus 實測 → 不合適就依付款管道申請退款。決定好了再來一杯慶祝——或繼續喝免費版也沒關係，至少你的連線有加密。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;聯盟揭露：&lt;/strong&gt; 本文包含 Proton VPN 推薦連結。若你透過連結註冊或購買，我可能獲得推薦回饋；這不會增加你的費用。本文依研究筆記與官方文件撰寫，請依你的實際需求與測試結果做最終決定。&lt;/blockquote&gt;&lt;p&gt;👉 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer sponsored&quot;&gt;&lt;strong&gt;免費申請 Proton 帳號 →&lt;/strong&gt;&lt;/a&gt;&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/support/proton-vpn-plans&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN plans explained&lt;/a&gt; — 官方方案類型、Free 與 Plus 功能差異。&lt;li&gt;&lt;a href=&quot;https://account.protonvpn.com/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN official pricing&lt;/a&gt; — 結帳時的方案、幣別與促銷價格（以當日頁面為準）。&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/support/cancel-vpn-subscription&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to cancel a Proton VPN subscription&lt;/a&gt; — 取消步驟、退款管道與處理時間。&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/support/no-logs-vpn&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Does Proton VPN keep logs?&lt;/a&gt; — 無日誌政策說明。&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/blog/no-logs-audit&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN passes 5th annual external audit&lt;/a&gt; — 2026 年 Securitum 無日誌稽核。&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/support/watch-netflix-with-proton-vpn&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to watch Netflix with Proton VPN&lt;/a&gt; — 串流支援範圍與限制。&lt;li&gt;&lt;a href=&quot;https://protonvpn.com/support/protonvpn-features&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Proton VPN Features&lt;/a&gt; — Secure Core、NetShield、Stealth 等功能說明。&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>為什麼要發明 Pi？從作者角度理解 Pi vs Claude Code 該怎麼選</title>
    <link href="https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/" />
    <updated>2026-08-07T03:32:15Z</updated>
    <id>https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/</id>
    <content type="html">&lt;p&gt;終端裡的 AI 程式助手越來越多：Claude Code、Cursor，還有各種「多代理＋Plan Mode＋MCP」大禮包。功能清單看起來很強，但你有沒有遇過這種感覺——&lt;strong&gt;工具一更新，行為就變了&lt;/strong&gt;；你以為它在「幫你想」，其實有一段上下文是介面看不到的；出錯時又不知道該查哪一層？&lt;p&gt;（有點像咖啡店改菜單：你點的還叫同名，內容卻換了豆。AI 工具也會這樣，而且通常不會在杯子上貼告示。）&lt;p&gt;Pi Coding Agent 的作者 Mario Zechner，正是從這類痛點出發，選擇&lt;strong&gt;重做一個極小核心&lt;/strong&gt;，而不是繼續往既有工具堆功能。這篇不做沒有實測根據的「誰比較強」評比，也不喊誰全面勝利；目標很單純：用&lt;strong&gt;作者為什麼要發明 Pi&lt;/strong&gt; 當鏡頭，幫你看懂兩種哲學，再決定自己要的是 &lt;strong&gt;Pi 的可控性&lt;/strong&gt;，還是 &lt;strong&gt;Claude Code 的現成工作流&lt;/strong&gt;。&lt;p&gt;讀完你會帶走：作者動機怎麼對到設計、四個原則怎麼想、一張決策表幫你 30 秒對號入座。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#%E5%85%88%E8%AC%9B%E6%B8%85%E6%A5%9A%E9%80%99%E4%B8%8D%E6%98%AF%E3%80%8CClaude-Code-%E4%B8%8D%E5%A5%BD%E3%80%8D&quot;&gt;先講清楚：這不是「Claude Code 不好」&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#%E4%BD%9C%E8%80%85%E7%82%BA%E4%BB%80%E9%BA%BC%E8%A6%81%E9%87%8D%E6%96%B0%E5%81%9A%E4%B8%80%E5%80%8B-Coding-Agent?&quot;&gt;作者為什麼要重新做一個 Coding Agent？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#Pi-%E7%9A%84%E5%9B%9B%E5%80%8B%E8%A8%AD%E8%A8%88%E5%8E%9F%E5%89%87%E5%B0%8D%E7%85%A7-Claude-Code-%E6%80%8E%E9%BA%BC%E6%83%B3&quot;&gt;Pi 的四個設計原則（對照 Claude Code 怎麼想）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#%E6%B1%BA%E7%AD%96%E8%A1%A8%E6%88%91%E8%A9%B2%E9%81%B8-Pi-%E9%82%84%E6%98%AF-Claude-Code?&quot;&gt;決策表：我該選 Pi 還是 Claude Code？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#%E6%8E%A8%E8%96%A6%E5%B7%A5%E5%85%B7/%E8%B3%87%E6%BA%90&quot;&gt;推薦工具／資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#%E7%B5%90%E8%AA%9E%E9%81%B8%E5%93%B2%E5%AD%B8,%E5%86%8D%E9%81%B8%E6%8C%89%E9%88%95&quot;&gt;結語：選哲學，再選按鈕&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-vs-claude-code-why-author-built-pi/#%E5%8F%83%E8%80%83%E8%B3%87%E6%96%99&quot;&gt;參考資料&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先講清楚這不是「Claude-Code-不好」&quot;&gt;先講清楚：這不是「Claude Code 不好」&lt;/h2&gt;&lt;p&gt;作者的公開文章把 Claude Code 當成「既有 Coding Agent 逐漸變複雜」的對照例子——但那是&lt;strong&gt;他對自己工作流的取捨&lt;/strong&gt;，不是對所有人的判決。以下的功能描述以相關官方文件與文章目前列出的內容為準；這類工具更新很快，實際行為仍要以你使用的版本和設定為準。&lt;ul&gt;&lt;li&gt;Claude Code 適合：想要內建 Plan、子代理、MCP、斜線指令，少自己組裝。&lt;li&gt;Pi 適合：想看見上下文與中間產物、把工作流放在檔案／CLI／tmux，願意自己決定要加什麼。&lt;/ul&gt;&lt;p&gt;讀完這篇，你應該能回答一句話：「我比較怕&lt;strong&gt;黑箱變動&lt;/strong&gt;，還是比較怕&lt;strong&gt;自己組工具的成本&lt;/strong&gt;？」&lt;p&gt;答得出來，比背一百個功能還有用——功能清單只告訴你「有什麼」；真正幫你判斷怎麼修、怎麼選的，是你對工具的使用原則。&lt;h2 id=&quot;作者為什麼要重新做一個-Coding-Agent?&quot;&gt;作者為什麼要重新做一個 Coding Agent？&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;既有工具遇到的問題（作者說法）&lt;th&gt;Pi 的設計回應&lt;th&gt;你實際可以怎麼用&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Claude Code 從早期較簡單，逐漸變成作者用不到很多功能的複雜工具；發布常改 system prompt／工具定義，既有工作流與模型行為跟著變&lt;td&gt;核心「不需要就不建」；短 system prompt；差異放到外部擴充&lt;td&gt;固定自己的提示、&lt;code&gt;AGENTS.md&lt;/code&gt;、驗證流程；升級後重新檢查，不要假設行為永遠不變&lt;tr&gt;&lt;td&gt;Context engineering 很重要，但其他 harness 可能在 UI 看不到的地方注入上下文&lt;td&gt;Session、工具呼叫、來源與產物保持可見；規劃寫成檔案，不藏在黑箱代理裡&lt;td&gt;要求 Agent 把研究／計畫／檢查結果寫成可讀檔，人工看完再進下一階段&lt;tr&gt;&lt;td&gt;內建子代理把上下文傳遞與錯誤藏在另一層，出錯難追查&lt;td&gt;不提供專用子代理工具；需要時用 bash 再開一個 Pi，或用 Extension／Package 自己組&lt;td&gt;任務邊界與輸出格式清楚才拆 session，中間產物一律存檔&lt;/table&gt;&lt;p&gt;一句話總結作者動機：&lt;blockquote&gt;&lt;p&gt;當 Coding Agent 變得複雜、常改又不透明時，最可靠的回應不是再加一層功能——而是&lt;strong&gt;縮小核心、提高可觀測性，讓使用者自己決定要加什麼&lt;/strong&gt;。&lt;/blockquote&gt;&lt;p&gt;官方定位也呼應這點：「讓 Pi 適應你的工作流，而不是反過來。」——翻成口語：工具來遷就你的終端習慣，不是你遷就它的儀式流程。咖啡機有預設模式很方便；但如果你想自己調研磨度，誰也不能禁止你拿出手沖壺。&lt;h2 id=&quot;Pi-的四個設計原則對照-Claude-Code-怎麼想&quot;&gt;Pi 的四個設計原則（對照 Claude Code 怎麼想）&lt;/h2&gt;&lt;h3 id=&quot;1.-極簡核心,不是功能競賽&quot;&gt;1. 極簡核心，不是功能競賽&lt;/h3&gt;&lt;p&gt;作者文章描述：Pi 的 system prompt 與預設工具定義合計可低於約 1,000 tokens；預設核心大致是讀、寫、編輯與 bash。極簡&lt;strong&gt;不是&lt;/strong&gt;叫大家永遠只用四個工具，而是把 MCP、子代理、Plan Mode 等能力移到 Extensions、Skills、Prompt Templates、Packages——&lt;strong&gt;按痛點再加&lt;/strong&gt;。這裡的「四個」是核心設計的概括，不代表每個版本或擴充後都只剩四項能力。&lt;p&gt;Claude Code 走另一條路：代理人循環（收集上下文 → 執行動作 → 驗證結果）＋較豐富的內建工具與斜線指令（如 &lt;code&gt;/compact&lt;/code&gt;、&lt;code&gt;/diff&lt;/code&gt;、&lt;code&gt;/model&lt;/code&gt;），並以 &lt;code&gt;CLAUDE.md&lt;/code&gt;、Skills、MCP 擴充。對「我想立刻開工」的人，這通常比較省事。&lt;p&gt;白話對照：Claude Code 像開箱即用的咖啡機；Pi 像手沖壺——多一步，但你看得見水溫、粉量和時間。&lt;h3 id=&quot;2.-可觀測性優先&quot;&gt;2. 可觀測性優先&lt;/h3&gt;&lt;p&gt;Pi 偏好把計畫寫成 Markdown：人可以編、跨 session 重用，也能進版本控制。「Agent 做了什麼」變成可檢查的產物，而不是只信最後一句摘要。換句話說，規格、計畫和進度先落檔，人工過目再寫碼；這種做法也比較容易留下日後能追溯的線索。&lt;p&gt;Claude Code 也有規範檔與驗證迴圈，但作者批評的重點是：若規劃與子工作藏在內部狀態，除錯成本會變高。你若本來就習慣「先看 diff／計畫再准執行」，兩套都能做；差別在於&lt;strong&gt;狀態預設放在哪&lt;/strong&gt;——檔案系統，還是工具內建流程。&lt;h3 id=&quot;3.-用組合取代內建一體化&quot;&gt;3. 用組合取代內建一體化&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pi 刻意不內建&lt;th&gt;官方建議替代&lt;th&gt;什麼時候值得自己組&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MCP&lt;td&gt;小型 CLI＋README，或自行加 Extension&lt;td&gt;工具少、要控 token、輸出想直接寫檔串接&lt;tr&gt;&lt;td&gt;子代理&lt;td&gt;tmux 再開 Pi、Extension、Package&lt;td&gt;要看見子過程，或真的要平行任務&lt;tr&gt;&lt;td&gt;Plan Mode&lt;td&gt;計畫寫入檔案，或自行擴充&lt;td&gt;計畫要跨 session、共同編輯、版控&lt;tr&gt;&lt;td&gt;背景 bash&lt;td&gt;tmux&lt;td&gt;長跑測試、開發伺服器、互動除錯&lt;tr&gt;&lt;td&gt;權限彈窗&lt;td&gt;容器／隔離帳號／自訂確認&lt;td&gt;不可信程式碼或機密資料&lt;/table&gt;&lt;p&gt;作者對大型 MCP 的具體顧慮是：工具說明每次塞進上下文，token 貴，輸出還常得繞回 Agent 才能保存。他提的替代是「小型 CLI + README + bash」——需要時才讀，輸出可直寫檔。&lt;p&gt;Claude Code 官方文件列有 MCP 整合，對「接資料庫／瀏覽器／外部服務、不想自己包 CLI」的人是加分。你要選的是：&lt;strong&gt;內建方便&lt;/strong&gt; vs &lt;strong&gt;按需載入、看得見成本&lt;/strong&gt;。&lt;h3 id=&quot;4.-安全責任放回執行環境&quot;&gt;4. 安全責任放回執行環境&lt;/h3&gt;&lt;p&gt;Pi 預設不走「權限彈窗＝安全」這條路；作者認為 Agent 一旦能讀寫檔、跑指令，單靠彈窗很難形成完整邊界。這&lt;strong&gt;不是&lt;/strong&gt;宣稱 Pi 比較安全，而是要求你用容器、隔離帳號、網路限制等&lt;strong&gt;真邊界&lt;/strong&gt;。含機密的主機開 YOLO，風險在你，不能照抄作者個人設定。&lt;p&gt;Claude Code 提供權限確認與相關隔離選項；對不想自己從零設計沙箱的人，通常比較「有提示、有流程」。兩邊都不是魔法盾——差在&lt;strong&gt;預設假設誰負責安全&lt;/strong&gt;，而且最後仍要由你確認實際的執行環境。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;比喻&lt;th&gt;對應的做法&lt;th&gt;實際效果&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;門上貼「請勿打擾」&lt;td&gt;Agent 跳出權限彈窗，你點「允許」&lt;td&gt;只是&lt;strong&gt;提醒／確認&lt;/strong&gt;，對方真要闖還是進得去&lt;tr&gt;&lt;td&gt;門鎖上了&lt;td&gt;容器、隔離帳號、網路限制&lt;td&gt;&lt;strong&gt;物理／技術邊界&lt;/strong&gt;，進不去才是真隔離&lt;/table&gt;&lt;p&gt;彈窗是禮貌的提示；隔離才是真的鎖門。兩者看起來都在「管安全」，保護力差很多。&lt;h2 id=&quot;決策表我該選-Pi-還是-Claude-Code?&quot;&gt;決策表：我該選 Pi 還是 Claude Code？&lt;/h2&gt;&lt;p&gt;用這張表做決定（可以兩邊都裝，但同一目錄不要同時寫檔；要並行請用不同 worktree 或其他隔離方式）：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你的情境&lt;th&gt;較適合&lt;th&gt;先確認這件事&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;想快速使用整合好的流程，不想自己組工具&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;td&gt;能否接受 system prompt、工具與版本變動&lt;tr&gt;&lt;td&gt;想逐步檢查上下文與中間產物、計畫要進 Git&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;（或同等可觀測工作流）&lt;td&gt;是否願意維護 markdown、CLI、tmux&lt;tr&gt;&lt;td&gt;已在使用 Anthropic 生態、愛斜線指令與內建任務工作流&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;td&gt;MCP／Skills 的 token 與權限範圍&lt;tr&gt;&lt;td&gt;本地模型、控 token、設定要可移植（&lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;.pi/&lt;/code&gt;）&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;td&gt;短 prompt 在你的模型／專案規模是否夠用（要實測）&lt;tr&gt;&lt;td&gt;要查瀏覽器、資料庫、外部服務，且想少寫 glue code&lt;td&gt;Claude Code＋MCP，或 Pi＋按需 CLI／Extension&lt;td&gt;工具描述成本、輸出能否存檔&lt;tr&gt;&lt;td&gt;不可信程式碼或機密檔案&lt;td&gt;先隔離，再選任一 Agent&lt;td&gt;隔離是否真限制檔案與網路，而不只是警告&lt;/table&gt;&lt;h3 id=&quot;30-秒口訣&quot;&gt;30 秒口訣&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;怕&lt;strong&gt;黑箱與升級打破工作流&lt;/strong&gt; → 先試 &lt;strong&gt;Pi&lt;/strong&gt;。&lt;li&gt;怕&lt;strong&gt;自己組裝與維護成本&lt;/strong&gt; → 先用 &lt;strong&gt;Claude Code&lt;/strong&gt;。&lt;li&gt;都要一點 → 主流程用 Claude Code／IDE；終端批次、低成本實驗、可版控的 Agent 設定用 Pi。&lt;/ul&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;th&gt;適合誰&lt;th&gt;備註&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi Coding Agent&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;想要極簡核心、可觀測產物、按需擴充的終端使用者&lt;td&gt;先用裸 Pi 跑通小任務，再加 Package／Extension&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Claude Code&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;想要整合代理人工作流、MCP 與專案規範的 Anthropic 生態使用者&lt;td&gt;用 &lt;code&gt;CLAUDE.md&lt;/code&gt; 固定專案規範；升級後抽查行為&lt;tr&gt;&lt;td&gt;延伸閱讀&lt;td&gt;想了解 Pi 基本概念&lt;td&gt;站內：&lt;a href=&quot;https://kamadiam.com/blog/pi-coding-agent/&quot;&gt;認識 Pi Coding Agent&lt;/a&gt;&lt;/table&gt;&lt;p&gt;客觀取捨：Pi 把「省心的一體化」換成「可控、但需要自己組合」；Claude Code 則把更多流程先整合好，換取較低的起步成本。Pi 和 Claude Code 各有取捨，誰贏取決於你的風險與願不願意自己維護，不是全世界都該選同一個。&lt;h2 id=&quot;結語選哲學,再選按鈕&quot;&gt;結語：選哲學，再選按鈕&lt;/h2&gt;&lt;p&gt;作者發明 Pi，不是為了「功能贏過 Claude Code」，而是為了在&lt;strong&gt;複雜、常改、不透明&lt;/strong&gt;的 Coding Agent 浪潮裡，留下一個&lt;strong&gt;看得見、擴得動、核心夠小&lt;/strong&gt;的 harness。這個選擇不一定讓每個人都更省事，卻讓取捨本身變得比較清楚。&lt;p&gt;帶走三點：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;動機&lt;/strong&gt;：縮小核心＋可觀測性，對抗黑箱與工作流被升級拆掉。&lt;li&gt;&lt;strong&gt;取捨&lt;/strong&gt;：Claude Code 用整合換省心；Pi 用組合換控制權。&lt;li&gt;&lt;strong&gt;下一步&lt;/strong&gt;：用上面的決策表對號入座，不要只比功能勾選清單。&lt;/ol&gt;&lt;p&gt;先挑一個小任務（例如修一個測試失敗）——若你要「開箱即用」，用 Claude Code 跑完並檢查差異；若你要「計畫與驗證都落檔」，用 Pi 把計畫寫成 Markdown 再改碼。跑完一次，比再讀十篇比較文更準。畢竟工具比較文可以收藏，失敗的測試不會因為被收藏就自己修好。&lt;p&gt;審完再來一杯。下一杯建議：直接動手，別再收藏文章了。&lt;h2 id=&quot;參考資料&quot;&gt;參考資料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://mariozechner.at/posts/2025-11-30-pi-coding-agent/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;What I learned building an opinionated and minimal coding agent&lt;/a&gt; — Mario Zechner 說明為何做極簡 Pi、對照既有 Coding Agent 的痛點&lt;li&gt;&lt;a href=&quot;https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;What if you don&#39;t need MCP at all?&lt;/a&gt; — 作者對大型 MCP 成本與「小型 CLI + README」替代方案的論點&lt;li&gt;&lt;a href=&quot;https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi coding agent README&lt;/a&gt; — 官方定位、刻意不內建項目與擴充方向&lt;li&gt;&lt;a href=&quot;https://pi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pi Coding Agent 官網&lt;/a&gt; — 產品入口與文件入口&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Anthropic Claude Code 官方指南&lt;/a&gt; — Claude Code 的工作方式、MCP、&lt;code&gt;CLAUDE.md&lt;/code&gt; 與擴充能力&lt;li&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/building-pi-and-what-makes-self-modifying&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Building Pi, and what makes self-modifying software so fascinating&lt;/a&gt; — Pragmatic Engineer 訪談／整理，補作者背景脈絡&lt;/ul&gt;</content>
  </entry>
</feed>