<?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-03T07:45:00Z</updated>
  <id>https://kamadiam.com/</id>
  <author>
    <name>huihere</name>
  </author>
  <entry>
    <title>字型子集化：2026 中文網站如何減少字型載入、改善首屏速度</title>
    <link href="https://kamadiam.com/font-subsetting-reduce-font-loading/" />
    <updated>2026-08-03T07:45:00Z</updated>
    <id>https://kamadiam.com/font-subsetting-reduce-font-loading/</id>
    <content type="html">&lt;p&gt;繁體中文網站最容易被忽略的效能成本，往往不是第三方腳本，而是字型。&lt;p&gt;一套完整的 CJK 字型可能超過 10MB；如果把它整包送給每位訪客，手機使用者會先等字型下載，才看到穩定的文字。這篇整理 2026 年比較實用的做法：先用系統字體扛住大部分內文，再把真正需要品牌風格的字型做子集化。少載一點，咖啡就能早一點喝到。&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/font-subsetting-reduce-font-loading/#%E5%85%88%E5%88%A4%E6%96%B7%E4%BD%A0%E7%9C%9F%E7%9A%84%E9%9C%80%E8%A6%81-Web-Font-%E5%97%8E?&quot;&gt;先判斷：你真的需要 Web Font 嗎？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/font-subsetting-reduce-font-loading/#%E4%B8%89%E7%A8%AE%E5%AD%97%E5%9E%8B%E7%AD%96%E7%95%A5%E6%80%8E%E9%BA%BC%E9%81%B8?&quot;&gt;三種字型策略怎麼選？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/font-subsetting-reduce-font-loading/#%E7%82%BA%E4%BB%80%E9%BA%BC%E7%B9%81%E4%B8%AD%E5%AD%97%E5%9E%8B%E7%89%B9%E5%88%A5%E5%AE%B9%E6%98%93%E6%8B%96%E6%85%A2%E9%A6%96%E5%B1%8F?&quot;&gt;為什麼繁中字型特別容易拖慢首屏？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/font-subsetting-reduce-font-loading/#%E5%AD%90%E9%9B%86%E5%8C%96%E5%88%B0%E5%BA%95%E5%9C%A8%E5%81%9A%E4%BB%80%E9%BA%BC?&quot;&gt;子集化到底在做什麼？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/font-subsetting-reduce-font-loading/#%E8%87%AA%E6%9E%B6%E5%AD%90%E9%9B%86%E5%8C%96%E7%9A%84%E5%AF%A6%E4%BD%9C%E6%B5%81%E7%A8%8B&quot;&gt;自架子集化的實作流程&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/font-subsetting-reduce-font-loading/#%E5%B8%B8%E8%A6%8B%E9%8C%AF%E8%AA%A4%E8%88%87%E5%8F%96%E6%8D%A8&quot;&gt;常見錯誤與取捨&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/font-subsetting-reduce-font-loading/#%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/font-subsetting-reduce-font-loading/#%E7%B5%90%E8%AA%9E%E5%85%88%E5%B0%91%E8%BC%89%E5%85%A5,%E5%86%8D%E8%BF%BD%E6%B1%82%E4%B8%80%E8%87%B4&quot;&gt;結語：先少載入，再追求一致&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先判斷你真的需要-Web-Font-嗎?&quot;&gt;先判斷：你真的需要 Web Font 嗎？&lt;/h2&gt;&lt;p&gt;如果網站是內容型部落格、管理後台或文件站，最划算的選擇通常是&lt;strong&gt;系統字體優先&lt;/strong&gt;。系統字體不需要額外下載，對 LCP、FCP 和行動流量都比較友善：&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;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    system-ui&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -apple-system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; BlinkMacSystemFont&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Segoe UI&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Roboto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;PingFang TC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hiragino Sans GB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Microsoft JhengHei&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Noto Sans CJK TC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;Apple Color Emoji&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Segoe UI Emoji&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;/code&gt;&lt;/pre&gt;&lt;p&gt;macOS 與 iOS 通常會使用 &lt;code&gt;PingFang TC&lt;/code&gt;，Windows 則多半 fallback 到 &lt;code&gt;Microsoft JhengHei&lt;/code&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;td&gt;全站系統字體 + &lt;code&gt;font-display: optional&lt;/code&gt;&lt;td&gt;最快，但不同平台字形不完全一致&lt;tr&gt;&lt;td&gt;品牌官網或 Landing Page&lt;td&gt;標題使用子集化 Web Font，內文用系統字&lt;td&gt;兼顧美觀與速度，需維護字元清單&lt;tr&gt;&lt;td&gt;需要固定品牌字形的產品 UI&lt;td&gt;自架 WOFF2 + 動態或靜態子集化&lt;td&gt;控制力最高，但要加入 build 流程&lt;/table&gt;&lt;p&gt;不要為了「看起來專業」就讓整篇內文載入完整 Noto Sans TC。先把 Web Font 限制在 H1、H2 或少量 UI 元件，通常更容易得到可接受的效能與一致性。&lt;h2 id=&quot;為什麼繁中字型特別容易拖慢首屏?&quot;&gt;為什麼繁中字型特別容易拖慢首屏？&lt;/h2&gt;&lt;p&gt;中文字型需要涵蓋數千到數萬個漢字、標點與不同字重，完整檔案常達 10MB 以上。以一個實際靜態站案例來看，Google Fonts 曾依 Unicode 範圍送出 23 個請求、共約 1.78MB；改成依站內實際用字自架後，該案例收斂為 4 個請求。這是特定頁面與測試條件的案例，不是所有網站都會得到相同數字。&lt;p&gt;外部 CDN 通常還會多出 &lt;code&gt;fonts.googleapis.com&lt;/code&gt; 與 &lt;code&gt;fonts.gstatic.com&lt;/code&gt; 的連線設定成本；但自架不代表一定更快，還要看 CDN、HTTP 版本、CSS 發現時機與實際字型分片。瀏覽器快取也可能受分區策略影響，跨站共用快取的優勢不能直接當成保證，因此「同網域自架」值得納入實測比較。&lt;h2 id=&quot;子集化到底在做什麼?&quot;&gt;子集化到底在做什麼？&lt;/h2&gt;&lt;p&gt;子集化就是從完整字型裡只留下網站真的會用到的字，再輸出較小的 WOFF2。&lt;p&gt;有兩種常見模式：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;靜態子集化&lt;/strong&gt;：掃描一頁內容，只保留這頁的字。檔案最小，適合單頁 Landing Page；但內容一改就要重跑。&lt;li&gt;&lt;strong&gt;Unicode-range 分片&lt;/strong&gt;：把字型切成許多小碎片，CSS 用 &lt;code&gt;unicode-range&lt;/code&gt; 宣告每個碎片負責的範圍。瀏覽器會依頁面文字與範圍判斷需要哪些分片；一旦某分片匹配，通常會下載整個分片，而不是只下載其中一個字，適合內容持續增加的網站。&lt;/ol&gt;&lt;p&gt;子集裡沒有的字不會自動變成方框。瀏覽器會沿著 &lt;code&gt;font-family&lt;/code&gt; 堆疊找下一個可用字型；真正的代價是那個字可能和周圍文字有些風格差異。&lt;h2 id=&quot;自架子集化的實作流程&quot;&gt;自架子集化的實作流程&lt;/h2&gt;&lt;h3 id=&quot;1.-保留-Latin-與站內實際-CJK-字元&quot;&gt;1. 保留 Latin 與站內實際 CJK 字元&lt;/h3&gt;&lt;p&gt;掃描文章、模板與導覽文字，收集漢字、全形標點和英文數字。Latin 子集則建議沿用 Google Fonts 原本的字元範圍，避免英文、貨幣符號或常用標點突然 fallback。&lt;h3 id=&quot;2.-用工具產出-WOFF2&quot;&gt;2. 用工具產出 WOFF2&lt;/h3&gt;&lt;p&gt;&lt;code&gt;cn-font-split&lt;/code&gt; 適合把大字型切成 Unicode 分片；如果想依整個網站實際用字產出單一子集，也可以使用 &lt;a href=&quot;https://github.com/nickbalestra/subset-font&quot;&gt;&lt;code&gt;subset-font&lt;/code&gt;&lt;/a&gt;，其底層是 HarfBuzz &lt;code&gt;hb-subset&lt;/code&gt; 的 WASM 封裝。&lt;p&gt;概念上的流程如下：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;掃描 .md / .njk
      ↓
收集 Latin + CJK 字元
      ↓
subset-font / cn-font-split
      ↓
輸出 .woff2
      ↓
CSS @font-face 掛載&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3.-用-@font-face-控制載入行為&quot;&gt;3. 用 &lt;code&gt;@font-face&lt;/code&gt; 控制載入行為&lt;/h3&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 atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Noto Sans TC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;/fonts/noto-sans-tc.woff2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;woff2&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 property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400 700&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; swap&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;swap&lt;/code&gt; 會先顯示系統字，再替換成 Web Font，適合品牌標題；內容型網站若更在意避免文字跳動，可考慮 &lt;code&gt;optional&lt;/code&gt;，讓載入不及時的訪客直接維持系統字。實際 block/swap 時間是瀏覽器依規格建議值實作，不是固定保證。&lt;h3 id=&quot;4.-把它接進-build-流程&quot;&gt;4. 把它接進 build 流程&lt;/h3&gt;&lt;p&gt;新增文章或修改導覽列後，重新執行例如 &lt;code&gt;pnpm run subset-fonts&lt;/code&gt;。原始字型可以快取，所以通常不需要每次重新下載；重點是讓「新增內容 → 重跑子集 → 測量效能」成為固定流程。&lt;h3 id=&quot;5.-移除不再需要的-CDN-標籤&quot;&gt;5. 移除不再需要的 CDN 標籤&lt;/h3&gt;&lt;p&gt;改成自架後，檢查 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 裡的 Google Fonts &lt;code&gt;preconnect&lt;/code&gt;、&lt;code&gt;preload&lt;/code&gt;、stylesheet 與 &lt;code&gt;noscript&lt;/code&gt; 標籤，避免新舊兩套字型同時載入。&lt;h2 id=&quot;常見錯誤與取捨&quot;&gt;常見錯誤與取捨&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;直接上傳 OTF/TTF&lt;/strong&gt;：檔案太大，應先輸出 WOFF2。&lt;li&gt;&lt;strong&gt;只留下漢字、忘了 Latin&lt;/strong&gt;：英文和數字可能換成不同風格，應保留常用 Latin 子集。&lt;li&gt;&lt;strong&gt;把整個網站都套品牌字體&lt;/strong&gt;：流量與載入成本會快速增加，先限制在標題或 UI。&lt;li&gt;&lt;strong&gt;以為 fallback 就代表沒有問題&lt;/strong&gt;：雖然不會 tofu，但罕見字的字形可能不一致，上線前要測試。&lt;li&gt;&lt;strong&gt;只看檔案大小、不測實際體驗&lt;/strong&gt;：請用 &lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt; 或自己的效能驗收流程觀察 LCP、FCP、CLS 與文字顯示是否改善。&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;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;td&gt;所有站長&lt;td&gt;檢查字型改動是否真的改善載入與 Core Web Vitals&lt;tr&gt;&lt;td&gt;&lt;code&gt;cn-font-split&lt;/code&gt;&lt;td&gt;需要 Unicode 分片的網站&lt;td&gt;讓瀏覽器按需載入字型&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/nickbalestra/subset-font&quot;&gt;&lt;code&gt;subset-font&lt;/code&gt;&lt;/a&gt;&lt;td&gt;想整合 Node.js build 流程的開發者&lt;td&gt;將站內實際用字打包成 WOFF2&lt;tr&gt;&lt;td&gt;系統字體堆疊&lt;td&gt;內容站與文件站&lt;td&gt;不需下載，載入成本最低&lt;/table&gt;&lt;h2 id=&quot;結語先少載入,再追求一致&quot;&gt;結語：先少載入，再追求一致&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;內容站先用系統字體，不要預設整包載入 CJK Web Font。&lt;li&gt;需要品牌字形時，只把標題或 UI 子集化並自架 WOFF2。&lt;li&gt;用 &lt;code&gt;font-display&lt;/code&gt;、fallback 與實際 CWV 測量確認取捨，而不是只看理論檔案大小。&lt;/ol&gt;&lt;p&gt;下一步很簡單：先用 PageSpeed Insights 記下改動前的數據，再選一個頁面做字型子集化，最後比較 LCP、CLS 和實際文字顯示。先測一頁就好，不必一口氣把整個網站的字型 pipeline 變成考古現場。</content>
  </entry>
  <entry>
    <title>LCP 優化實戰：首屏別 lazy-load，用 fetchpriority 把關鍵資源拉上來</title>
    <link href="https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/" />
    <updated>2026-08-03T06:45:00Z</updated>
    <id>https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/</id>
    <content type="html">&lt;p&gt;PageSpeed 分數掉下來，你第一個想到的通常是「圖太大了」。有時候沒錯，但有時候更慘的是：你把主視覺圖設成 &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt;，等於叫瀏覽器故意晚一點載入主角——LCP 當然跟著往後延，比咖啡涼掉還難受。&lt;p&gt;LCP（Largest Contentful Paint）量的是「首屏最大的那個元素，什麼時候真的被畫出來」。這篇只做一件事：把 LCP 優化拆成可以動手驗收的策略，並把你最容易踩的坑講清楚。如果你剛處理完 CLS（圖片預留寬高），這篇剛好接著把「載入速度」補齊。&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/lcp-optimization-no-lazy-fetchpriority/#%E5%85%88%E6%8A%93%E5%88%B0%E4%BD%A0%E7%9C%9F%E6%AD%A3%E7%9A%84-LCP-%E5%85%83%E7%B4%A0&quot;&gt;先抓到你真正的 LCP 元素&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/#%E6%B1%BA%E7%AD%96%E8%A1%A8lazyfetchprioritypreload-%E6%80%8E%E9%BA%BC%E9%81%B8?&quot;&gt;決策表：lazy、fetchpriority、preload 怎麼選？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/#LCP-%E5%84%AA%E5%8C%96%E7%AD%96%E7%95%A5%E6%A0%B8%E5%BF%83%E5%84%AA%E5%85%88%E7%B4%9A-+-%E4%B8%8D%E8%A2%AB-lazy&quot;&gt;LCP 優化策略（核心：優先級 + 不被 lazy）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/#%E4%B8%80%E5%80%8B%E5%BF%AB%E9%80%9F%E9%A9%97%E6%94%B6%E5%BF%83%E6%B3%95%E5%85%88-CLS-%E7%A9%A9,%E5%86%8D%E8%AB%87-LCP&quot;&gt;一個快速驗收心法：先 CLS 穩，再談 LCP&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/#%E6%A1%86%E6%9E%B6%E5%BF%AB%E9%80%9F%E5%B0%8D%E7%85%A7&quot;&gt;框架快速對照&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/lcp-optimization-no-lazy-fetchpriority/#%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/lcp-optimization-no-lazy-fetchpriority/#%E7%B5%90%E8%AA%9ELCP-%E5%84%AA%E5%8C%96%E6%98%AF%E3%80%8C%E4%B8%8D%E8%A6%81%E6%8B%96%E9%97%9C%E9%8D%B5%E8%B3%87%E6%BA%90%E3%80%8D%E7%9A%84%E5%B7%A5%E7%A8%8B%E7%B4%80%E5%BE%8B&quot;&gt;結語：LCP 優化是「不要拖關鍵資源」的工程紀律&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先抓到你真正的-LCP-元素&quot;&gt;先抓到你真正的 LCP 元素&lt;/h2&gt;&lt;p&gt;不要猜「應該是主視覺圖」。流程是：&lt;ol&gt;&lt;li&gt;開 &lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt; 或 Chrome DevTools → &lt;strong&gt;Performance&lt;/strong&gt; 錄一次載入&lt;li&gt;看報告標出的 &lt;strong&gt;LCP 元素&lt;/strong&gt; 是什麼（圖片、文字區塊或 H1）&lt;li&gt;記下它的 URL 或 DOM 節點，後面改碼才有對象&lt;/ol&gt;&lt;p&gt;靜態網站常見 LCP 來源：&lt;strong&gt;主視覺圖&lt;/strong&gt;、&lt;strong&gt;H1 標題&lt;/strong&gt;、&lt;strong&gt;產品截圖&lt;/strong&gt;。Google 2026 門檻仍是 &lt;strong&gt;LCP ≤ 2.5 秒&lt;/strong&gt;（CrUX 第 75 百分位），不是 Lighthouse 實驗室分數。想先搞懂欄位資料 vs 實驗室差異，可看站內 &lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/&quot;&gt;PageSpeed Insights 與 Core Web Vitals 2026&lt;/a&gt;。&lt;h2 id=&quot;決策表lazyfetchprioritypreload-怎麼選?&quot;&gt;決策表：lazy、fetchpriority、preload 怎麼選？&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;確認是 LCP 的主視覺圖&lt;td&gt;&lt;code&gt;loading=&amp;quot;eager&amp;quot;&lt;/code&gt; + &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;&lt;td&gt;不要延遲載入主角；拉高下載優先級&lt;tr&gt;&lt;td&gt;LCP 是 CSS 背景圖或 JS 動態插入&lt;td&gt;&lt;code&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot; as=&amp;quot;image&amp;quot; fetchpriority=&amp;quot;high&amp;quot;&amp;gt;&lt;/code&gt;&lt;td&gt;瀏覽器從 HTML 掃不到，要主動宣告&lt;tr&gt;&lt;td&gt;內文圖、頁尾圖、側欄縮圖&lt;td&gt;&lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt;（預設即可）&lt;td&gt;不在首屏，延後載入省頻寬&lt;tr&gt;&lt;td&gt;全站只有 1–2 張關鍵圖&lt;td&gt;只對那 1–2 張用 &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;&lt;td&gt;濫用高優先級會把佇列分流掉&lt;tr&gt;&lt;td&gt;Eleventy Image Transform 預設 &lt;code&gt;lazy&lt;/code&gt;&lt;td&gt;主視覺圖手動覆寫 &lt;code&gt;loading=&amp;quot;eager&amp;quot;&lt;/code&gt;&lt;td&gt;管道預設 lazy ≠ 每張都該 lazy&lt;/table&gt;&lt;p&gt;&lt;strong&gt;一句話心法&lt;/strong&gt;：LCP 元素 &lt;strong&gt;不要 lazy&lt;/strong&gt;；關鍵圖 &lt;strong&gt;拉高優先級&lt;/strong&gt;；其餘圖片照常 lazy。&lt;h2 id=&quot;LCP-優化策略核心優先級-+-不被-lazy&quot;&gt;LCP 優化策略（核心：優先級 + 不被 lazy）&lt;/h2&gt;&lt;h3 id=&quot;1.-不要-lazy-load-LCP&quot;&gt;1. 不要 lazy-load LCP&lt;/h3&gt;&lt;p&gt;最常見的壞操作：把 LCP 圖片加上 &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt;。這會刻意延遲「載入 → 解碼 → 繪製」，LCP 就跟著往後延。&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 comment&quot;&gt;&amp;lt;!-- ❌ 自殺操作：主視覺圖被 lazy --&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;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/hero.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;loading&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;lazy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&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 comment&quot;&gt;&amp;lt;!-- ✅ 首屏主角：明確 eager + 高優先級 --&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;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/hero.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;alt&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 attr-name&quot;&gt;width&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;1200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;height&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;630&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;loading&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;eager&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;fetchpriority&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;high&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;順便補 &lt;code&gt;width&lt;/code&gt;／&lt;code&gt;height&lt;/code&gt; 預留版面——LCP 和 CLS 常常同一張圖一起修。細節見站內 &lt;a href=&quot;https://kamadiam.com/image-size-cls-preallocation/&quot;&gt;圖片最佳化與 CLS 解決方案&lt;/a&gt;。&lt;h3 id=&quot;2.-用-fetchpriority-把關鍵資源拉到前面&quot;&gt;2. 用 fetchpriority 把關鍵資源拉到前面&lt;/h3&gt;&lt;p&gt;當 LCP 是圖片時，方向是：&lt;ul&gt;&lt;li&gt;主視覺圖：加 &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;&lt;li&gt;配合（需要時）在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 用 preload 宣告，讓瀏覽器先知道「這張是主角」&lt;/ul&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 comment&quot;&gt;&amp;lt;!-- CSS 背景 LCP 或較晚才出現在 DOM 的圖：head 預載 --&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;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fetchpriority&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;high&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;as&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;image&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;/img/hero.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&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;image/webp&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 comment&quot;&gt;&amp;lt;!-- HTML 直接宣告的 LCP 圖 --&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;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/hero.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;fetchpriority&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;high&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;alt&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;網站主視覺 Banner&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;width&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;1200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;height&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;630&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;&lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt; 適用在 LCP／首圖這種關鍵資源；&lt;strong&gt;不要濫用&lt;/strong&gt;，不然你會把優先權分流掉，大家都變「高優先級」就等於沒有。&lt;h3 id=&quot;3.-Eleventy-靜態站管道預設-lazy-的陷阱&quot;&gt;3. Eleventy 靜態站：管道預設 lazy 的陷阱&lt;/h3&gt;&lt;p&gt;若你用 &lt;code&gt;@11ty/eleventy-img&lt;/code&gt; 的 HTML Transform，設定裡常見預設 &lt;code&gt;loading: &amp;quot;lazy&amp;quot;&lt;/code&gt;——對內文圖很好，對 &lt;strong&gt;主視覺圖是災難&lt;/strong&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;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/hero.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;alt&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 attr-name&quot;&gt;loading&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;eager&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;fetchpriority&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;high&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;sizes&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;(max-width: 800px) 100vw, 1200px&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;同時確認主視覺圖檔案大小合理（目標 &lt;strong&gt;&amp;lt; 150KB&lt;/strong&gt;）、顯示寬度對齊（手機 400px 寬就不要傳 4000px 原圖）。格式用 WebP／AVIF 通常比 JPEG 小 25–50%。&lt;h3 id=&quot;4.-避免-render-blocking-讓首屏後面卡住&quot;&gt;4. 避免 render-blocking 讓首屏後面卡住&lt;/h3&gt;&lt;p&gt;如果你把非關鍵 JS／CSS 搞成阻塞鏈，LCP 再怎麼優先級也可能等不到繪製窗口。快速檢查：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;資源類型&lt;th&gt;建議&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;非關鍵 JavaScript&lt;td&gt;&lt;code&gt;defer&lt;/code&gt; 或 &lt;code&gt;async&lt;/code&gt;；第三方標籤延後到 &lt;code&gt;requestIdleCallback&lt;/code&gt;&lt;tr&gt;&lt;td&gt;CSS&lt;td&gt;避免 &lt;code&gt;@import&lt;/code&gt; 串接；關鍵 CSS &amp;lt; 14KB 可考慮 inline&lt;tr&gt;&lt;td&gt;Web 字體&lt;td&gt;&lt;code&gt;font-display: swap&lt;/code&gt;；關鍵字體可 &lt;code&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot; as=&amp;quot;font&amp;quot;&amp;gt;&lt;/code&gt;&lt;/table&gt;&lt;p&gt;GTM 延遲載入的具體寫法，可參考站內 &lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/&quot;&gt;GTM 延遲載入：用 requestIdleCallback 降低 PSI 的 TBT&lt;/a&gt;。&lt;h2 id=&quot;一個快速驗收心法先-CLS-穩,再談-LCP&quot;&gt;一個快速驗收心法：先 CLS 穩，再談 LCP&lt;/h2&gt;&lt;p&gt;LCP 是「什麼時候畫出來」，CLS 是「有沒有抖」。有些站看起來 LCP 差，其實是版面在動，最後量測也會一起變差。&lt;p&gt;建議順序：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;先確保圖片／嵌入不會讓版面在載入期抖動（CLS 預留）&lt;/strong&gt;&lt;li&gt;再回頭把 LCP 圖片的優先級拉到位&lt;li&gt;最後用 GSC → 體驗 → Core Web Vitals 對 &lt;strong&gt;欄位資料&lt;/strong&gt; 驗收（28 天週期）&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;LCP 注意事項&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;td&gt;&lt;code&gt;resources.Get&lt;/code&gt; + &lt;code&gt;Resize&lt;/code&gt;／&lt;code&gt;webp&lt;/code&gt;&lt;td&gt;主視覺圖模板別加 lazy&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Eleventy&lt;/strong&gt;&lt;td&gt;&lt;code&gt;@11ty/eleventy-img&lt;/code&gt;&lt;td&gt;Transform 預設 lazy，主視覺圖覆寫 eager + fetchpriority&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;td&gt;&lt;code&gt;astro:assets&lt;/code&gt; 或 &lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt;&lt;td&gt;內建 lazy，記得 LCP 關 lazy&lt;/table&gt;&lt;h2 id=&quot;推薦工具/資源&quot;&gt;推薦工具／資源&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;/strong&gt; — 看 LCP 元素與子項目診斷（TTFB、資源載入延遲、元素渲染延遲）&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://search.google.com/search-console&quot;&gt;Google Search Console&lt;/a&gt;&lt;/strong&gt; — 體驗 → Core Web Vitals，以真實使用者資料為準&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://zerossl.com/?fpr=janet52&quot;&gt;ZeroSSL&lt;/a&gt;&lt;/strong&gt; — 若 LCP 慢且 TTFB 高，先確認 HTTPS 正常、憑證鏈完整；混合內容或憑證問題會拖瀏覽器行為，進而連動體驗類指標&lt;/ul&gt;&lt;h2 id=&quot;結語LCP-優化是「不要拖關鍵資源」的工程紀律&quot;&gt;結語：LCP 優化是「不要拖關鍵資源」的工程紀律&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;用 PSI／DevTools 找出真正的 LCP 元素，別憑感覺改&lt;li&gt;LCP 元素 &lt;strong&gt;不要&lt;/strong&gt; &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt;；關鍵圖加 &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;，必要時 preload&lt;li&gt;Eleventy 管道預設 lazy 時，主視覺圖一定要手動覆寫&lt;li&gt;render-blocking 別讓首屏卡住；驗收以 GSC 欄位資料為準&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;下一步&lt;/strong&gt;：先把 LCP 圖片／資源優先級調到位；同時確保 HTTPS／憑證鏈完整——自架站可用 &lt;a href=&quot;https://zerossl.com/?fpr=janet52&quot;&gt;ZeroSSL&lt;/a&gt; 申請免費憑證，流程穩了再回 GSC 看 28 天滾動更新。改完記得再來一杯，這次是慶祝分數回來的那杯。</content>
  </entry>
  <entry>
    <title>GTM 延遲載入：用 requestIdleCallback 降低 PSI 的 TBT</title>
    <link href="https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/" />
    <updated>2026-08-03T06:00:00Z</updated>
    <id>https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/</id>
    <content type="html">&lt;p&gt;GTM 一掛上去，PageSpeed Insights（PSI）分數就往下掉？先別急著把它整個拔掉。很多時候，問題不是「有沒有 GTM」，而是它在首屏最忙的時候也跑進來搶頻寬、搶主執行緒。&lt;p&gt;這篇會帶你把 GTM 從「頁面一開就啟動」改成「使用者互動或瀏覽器有空時才啟動」，再用同一套流程檢查 LCP、TBT、INP，以及轉換事件有沒有被延遲到漏掉。簡單說，就是先讓瀏覽器把早餐吃完，再請 GTM 進來開會。&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/gtm-defer-requestidlecallback-psi-optimization/#%E7%82%BA%E4%BB%80%E9%BA%BC-GTM-%E6%9C%83%E6%8B%96%E6%85%A2-PSI?&quot;&gt;為什麼 GTM 會拖慢 PSI？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#%E6%A0%B8%E5%BF%83%E5%81%9A%E6%B3%95%E4%BA%92%E5%8B%95%E8%A7%B8%E7%99%BC%E5%8A%A0-idle-fallback&quot;&gt;核心做法：互動觸發加 idle fallback&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#%E5%8F%AF%E7%9B%B4%E6%8E%A5%E8%A4%87%E8%A3%BD%E7%9A%84%E6%9C%80%E5%B0%8F%E7%89%88%E6%9C%AC&quot;&gt;可直接複製的最小版本&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#timeout-%E8%A6%81%E8%A8%AD%E5%A4%9A%E5%B0%91?&quot;&gt;timeout 要設多少？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#dataLayer-%E6%9C%83%E4%BF%9D%E7%95%99%E4%BA%8B%E4%BB%B6,%E4%BD%86%E4%B8%8D%E6%98%AF%E8%B3%87%E6%96%99%E4%BF%9D%E9%9A%AA%E7%AE%B1&quot;&gt;dataLayer 會保留事件，但不是資料保險箱&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#%E5%BB%B6%E9%81%B2%E5%89%8D%E5%85%88%E5%81%9A%E7%9A%84%E5%85%A9%E4%BB%B6%E4%BA%8B&quot;&gt;延遲前先做的兩件事&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#%E6%80%8E%E9%BA%BC%E9%A9%97%E6%94%B6%E4%B8%8D%E8%A6%81%E5%8F%AA%E7%9C%8B%E4%B8%80%E6%AC%A1-PSI-%E5%88%86%E6%95%B8&quot;&gt;怎麼驗收：不要只看一次 PSI 分數&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/gtm-defer-requestidlecallback-psi-optimization/#%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/gtm-defer-requestidlecallback-psi-optimization/#%E7%B5%90%E8%AA%9E%E5%85%88%E8%AE%93%E4%B8%BB%E5%9F%B7%E8%A1%8C%E7%B7%92%E5%96%98%E5%8F%A3%E6%B0%A3&quot;&gt;結語：先讓主執行緒喘口氣&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;為什麼-GTM-會拖慢-PSI?&quot;&gt;為什麼 GTM 會拖慢 PSI？&lt;/h2&gt;&lt;p&gt;GTM 常見的影響大致分兩條線：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;網路頻寬競爭&lt;/strong&gt;：&lt;code&gt;gtm.js&lt;/code&gt; 下載時，可能和 hero 圖片、CSS 等首屏資源競爭，讓 LCP 晚一點出現。&lt;li&gt;&lt;strong&gt;主執行緒工作增加&lt;/strong&gt;：容器啟動後，GA4、Pixel、Hotjar 等標籤會執行 JavaScript。標籤太多或太重，就可能製造長任務，推高 TBT，也讓互動回饋變慢。&lt;/ol&gt;&lt;p&gt;延遲載入可以保護首屏，但它不是免費午餐：越晚啟動，越可能漏掉頁面剛開啟時的分析或轉換事件。因此要一起看效能和資料完整度。&lt;h2 id=&quot;核心做法互動觸發加-idle-fallback&quot;&gt;核心做法：互動觸發加 idle fallback&lt;/h2&gt;&lt;p&gt;可以讓以下兩條路都呼叫同一個 &lt;code&gt;boot()&lt;/code&gt;：&lt;ul&gt;&lt;li&gt;使用者真的開始使用頁面，例如滾動、按鍵或觸控。&lt;li&gt;使用者沒有互動時，等主執行緒進入 idle；如果瀏覽器不支援，就退回 &lt;code&gt;setTimeout&lt;/code&gt;。&lt;/ul&gt;&lt;p&gt;重點是用 &lt;code&gt;started&lt;/code&gt; flag 去重。&lt;code&gt;once: true&lt;/code&gt; 只會移除某一個事件的 listener，不能取消已排程的 idle callback，也不能保證兩條路不會同時進入函式。&lt;h2 id=&quot;可直接複製的最小版本&quot;&gt;可直接複製的最小版本&lt;/h2&gt;&lt;p&gt;把 &lt;code&gt;GTM-XXXXXXX&lt;/code&gt; 換成自己的 container ID。這段程式會先建立 &lt;code&gt;dataLayer&lt;/code&gt;，再在互動或 idle 時只載入一次 GTM。&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 parameter&quot;&gt;w&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; d&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; started &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&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; idleId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&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; events &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;pointerdown&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;keydown&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;touchstart&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;scroll&#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;

  w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataLayer &lt;span class=&quot;token operator&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;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;boot&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;started&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;
    started &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&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;idleId &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cancelIdleCallback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cancelIdleCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;idleId&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;

    w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataLayer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&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 string-property property&quot;&gt;&#39;gtm.start&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;now&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 literal-property property&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;gtm.js&#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 keyword&quot;&gt;var&lt;/span&gt; script &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;script&#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;
    script&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;async &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    script&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://www.googletagmanager.com/gtm.js?id=GTM-XXXXXXX&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;script&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;

  events&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&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 parameter&quot;&gt;type&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;
    d&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;type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; boot&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 literal-property property&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;passive&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&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 keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;requestIdleCallback&#39;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    idleId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;requestIdleCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boot&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 literal-property property&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&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;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    idleId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boot&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&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; document&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;requestIdleCallback&lt;/code&gt; 的 &lt;code&gt;timeout&lt;/code&gt; 不是精準鬧鐘。瀏覽器會先等 idle period；若期限到了還沒執行，才把 callback 排進 event loop。它能限制等待時間，但不代表 GTM 會在那一刻完成下載或執行。&lt;p&gt;另外，Safari 和不同 WebView 的支援狀況可能不同，所以用 feature detection 比寫死「Safari 不支援」安全。舊版環境才需要 fallback。&lt;h2 id=&quot;timeout-要設多少?&quot;&gt;timeout 要設多少？&lt;/h2&gt;&lt;p&gt;真正要平衡的是「首屏保護」和「資料多早開始收集」。沒有一個數字適合所有網站，先用實測建立基準比較可靠。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;timeout&lt;th&gt;優點&lt;th&gt;風險&lt;th&gt;適合情境&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1500–2500ms&lt;td&gt;適合先做第一輪實驗&lt;td&gt;早期 pageview 或轉換可能延後&lt;td&gt;一般內容站、非關鍵分析&lt;tr&gt;&lt;td&gt;1000ms 以下&lt;td&gt;較早啟動，資料風險較小&lt;td&gt;首屏和 TBT 的保護變弱&lt;td&gt;頁面很輕、轉換追蹤較重要&lt;tr&gt;&lt;td&gt;3000ms 以上&lt;td&gt;首屏保護較久&lt;td&gt;秒退與早期轉換漏算更多&lt;td&gt;只有實測支持時才用&lt;/table&gt;&lt;p&gt;如果登入、註冊或購買事件不能漏，不要把所有 tag 都綁在延遲初始化上。可以保留關鍵事件的即時路徑，只延後非必要的分析和行銷 tag。&lt;h2 id=&quot;dataLayer-會保留事件,但不是資料保險箱&quot;&gt;dataLayer 會保留事件，但不是資料保險箱&lt;/h2&gt;&lt;p&gt;GTM 載入前先建立陣列，並把資料與 &lt;code&gt;event&lt;/code&gt; 放在同一個 object：&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataLayer &lt;span class=&quot;token operator&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;dataLayer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&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 literal-property property&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;signup_complete&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;free&#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;/code&gt;&lt;/pre&gt;&lt;p&gt;這能保留「目前頁面、GTM 載入前已成功 push」的事件，GTM 載入後會依序處理 queue。但要記得三個界線：&lt;ul&gt;&lt;li&gt;&lt;code&gt;dataLayer&lt;/code&gt; 不會自動跨頁保存；下一頁要重新初始化和 push。&lt;li&gt;queue 被處理，不代表 tag 的網路請求已經送達。&lt;li&gt;使用者秒退或立即導向時，下載、執行或 beacon 仍可能被中斷。&lt;/ul&gt;&lt;p&gt;因此，GTM Preview 或 Tag Assistant 顯示「有 push」只是第一關，還要到分析或廣告平台的測試工具確認事件真的送出。&lt;h2 id=&quot;延遲前先做的兩件事&quot;&gt;延遲前先做的兩件事&lt;/h2&gt;&lt;h3 id=&quot;先精簡-GTM-container&quot;&gt;先精簡 GTM container&lt;/h3&gt;&lt;p&gt;每隔一段時間檢查 container：&lt;ul&gt;&lt;li&gt;刪掉過期活動和不再使用的第三方 tag。&lt;li&gt;把不需要每頁執行的 tag 改成 Window Loaded 或自訂事件。&lt;li&gt;減少會反覆掃描 DOM 的變數和觸發條件。&lt;/ul&gt;&lt;p&gt;如果只是把一堆不必要的 tag 延後，主執行緒只是晚點忙，並沒有真正變輕。&lt;h3 id=&quot;高階方案再考慮-Worker&quot;&gt;高階方案再考慮 Worker&lt;/h3&gt;&lt;p&gt;Partytown 等方案可以把部分第三方腳本移到 Web Worker，但需要額外整合，且依賴 DOM 的 tag 可能不相容。它比較適合已經完成 tag 審計、仍有明確長任務問題的技術型網站，不是第一個該按的按鈕。&lt;h2 id=&quot;怎麼驗收不要只看一次-PSI-分數&quot;&gt;怎麼驗收：不要只看一次 PSI 分數&lt;/h2&gt;&lt;p&gt;用下面流程比較立即載入版和延遲版：&lt;ol&gt;&lt;li&gt;固定同一個 URL、GTM container、裝置策略和 cookie／consent 狀態。&lt;li&gt;PSI 兩個版本都跑多次，記錄 LCP、TBT、CLS、FCP，不要用單次分數宣稱因果。&lt;li&gt;Lighthouse Navigation mode 看首屏；Timespan mode 則用來觀察互動後載入 GTM 的影響。&lt;li&gt;在 Performance trace 和 Network 面板確認 &lt;code&gt;gtm.js&lt;/code&gt;、tag 長任務與請求發生時間。&lt;li&gt;用 GTM Preview／Tag Assistant 檢查 queue、Custom Event trigger、consent 和轉換 tag。&lt;li&gt;以真實流量的 CrUX 或 PSI field data 觀察 INP。TBT 是 lab 指標，不能直接當成真實 INP。&lt;/ol&gt;&lt;p&gt;如果首屏改善了，但註冊或購買事件明顯少掉，這不是成功的優化；它只是把問題從 PSI 搬到分析資料裡。&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;首屏與 lab 指標比較&lt;td&gt;PageSpeed Insights、Chrome Lighthouse&lt;td&gt;想確認 LCP、TBT 是否改善的站長&lt;tr&gt;&lt;td&gt;真實互動體驗&lt;td&gt;CrUX／PSI field data&lt;td&gt;有足夠流量、要看 INP 的網站&lt;tr&gt;&lt;td&gt;Tag 行為驗證&lt;td&gt;GTM Preview、Tag Assistant&lt;td&gt;不能接受事件悄悄漏掉的網站&lt;tr&gt;&lt;td&gt;整理效能與 SEO 驗收&lt;td&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/&quot;&gt;SEO 與 Core Web Vitals 檢查流程&lt;/a&gt;&lt;td&gt;想把單次修正變成固定流程的站長&lt;/table&gt;&lt;h2 id=&quot;結語先讓主執行緒喘口氣&quot;&gt;結語：先讓主執行緒喘口氣&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;GTM 不一定要刪，先把它改成互動觸發加 idle fallback。&lt;li&gt;&lt;code&gt;timeout&lt;/code&gt; 越小，資料越早開始；越大，首屏保護越強，但早期事件風險也越高。&lt;li&gt;&lt;code&gt;dataLayer&lt;/code&gt; 能排隊目前頁面的事件，不能保證跨頁保存或請求送達。&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;下一步&lt;/strong&gt;：先用 2000ms 做基準，將立即載入版與延遲版各跑多次，同時核對轉換事件，再依 LCP、TBT、INP 和資料完整度調整。修完再喝一口咖啡，這次讓瀏覽器先喝。</content>
  </entry>
  <entry>
    <title>圖片最佳化與 CLS 解決方案：用 width、height 預防網頁版面跳動</title>
    <link href="https://kamadiam.com/image-size-cls-preallocation/" />
    <updated>2026-08-03T03:15:00Z</updated>
    <id>https://kamadiam.com/image-size-cls-preallocation/</id>
    <content type="html">&lt;p&gt;你有沒有遇過這種情況：正準備點一個連結，圖片突然載入，整段文字往下一跳。結果手指點到旁邊的空白，只能在心裡默念：「謝謝，咖啡涼了。」&lt;p&gt;圖片最佳化不是單純把檔案壓到越小越好。面對 PageSpeed 和 Core Web Vitals，你通常要同時處理兩件事：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;LCP（載入速度）&lt;/strong&gt;：首圖什麼時候真正顯示出來？檔案太大、尺寸又不合適，下載自然會變慢。&lt;li&gt;&lt;strong&gt;CLS（版面穩定度）&lt;/strong&gt;：圖片還沒載完之前，下面的內容會不會被往下推？沒有預留寬高，版面就容易跳動。&lt;/ol&gt;&lt;p&gt;網站通常有很多圖片，像是產品截圖、比較表和規格圖。這篇先專心處理三件事：&lt;strong&gt;控制檔案大小、符合顯示寬度，以及預留圖片版面&lt;/strong&gt;，並整理成可以直接照做的決策方式和範例。至於 LCP 的 &lt;code&gt;fetchpriority&lt;/code&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/image-size-cls-preallocation/#%E5%85%88%E6%90%9E%E6%B8%85%E6%A5%9A%E5%9C%96%E7%89%87%E6%9C%80%E5%B8%B8%E9%80%A0%E6%88%90%E5%85%A9%E7%A8%AE%E6%95%88%E8%83%BD%E5%95%8F%E9%A1%8C&quot;&gt;先搞清楚：圖片最常造成兩種效能問題&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/image-size-cls-preallocation/#%E6%B1%BA%E7%AD%96%E8%A1%A8%E4%B8%80width+height-%E9%82%84%E6%98%AF-aspect-ratio?&quot;&gt;決策表一：width+height 還是 aspect-ratio？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/image-size-cls-preallocation/#%E6%B1%BA%E7%AD%96%E8%A1%A8%E4%BA%8C%E6%AA%94%E6%A1%88%E5%A4%A7%E5%B0%8F%E9%A1%AF%E7%A4%BA%E5%AF%ACWebP/AVIF&quot;&gt;決策表二：檔案大小、顯示寬、WebP／AVIF&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/image-size-cls-preallocation/#%E6%B1%BA%E7%AD%96%E8%A1%A8%E4%B8%89%E6%89%8B%E5%8B%95%E8%A3%9C%E5%AF%AC%E9%AB%98,%E9%82%84%E6%98%AF%E4%B8%8A-Eleventy-%E5%9C%96%E7%89%87%E7%AE%A1%E9%81%93?&quot;&gt;決策表三：手動補寬高，還是上 Eleventy 圖片管道？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/image-size-cls-preallocation/#%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/image-size-cls-preallocation/#%E7%B5%90%E8%AA%9E%E5%9C%96%E7%89%87%E6%9C%80%E4%BD%B3%E5%8C%96,%E5%B0%B1%E6%98%AF%E5%88%A5%E8%AE%93-CLS-%E4%BA%82%E8%B7%B3%E4%B9%9F%E5%88%A5%E6%8B%96%E6%85%A2%E4%B8%8B%E8%BC%89&quot;&gt;結語：圖片最佳化，就是別讓 CLS 亂跳、也別拖慢下載&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;先搞清楚圖片最常造成兩種效能問題&quot;&gt;先搞清楚：圖片最常造成兩種效能問題&lt;/h2&gt;&lt;p&gt;靜態網站最常見的圖片問題，大概有這幾種：&lt;ul&gt;&lt;li&gt;圖沒有可預測的高度（CLS）&lt;li&gt;hero／內文圖過肥，或丟超大原圖給小螢幕（LCP）&lt;li&gt;圖很多卻全靠手壓，漏寫 &lt;code&gt;width&lt;/code&gt;／&lt;code&gt;height&lt;/code&gt;&lt;/ul&gt;&lt;p&gt;這篇會聚焦在：&lt;strong&gt;預留圖片尺寸、讓檔案大小和顯示寬度對得上，以及（可選的）Eleventy 圖片處理流程&lt;/strong&gt;。字體、Cookie 橫幅和第三方腳本造成的 CLS／INP，先留到另一篇處理。一次解決一類問題，才不會改到最後連自己在修什麼都忘了。&lt;p&gt;以 2026 年的標準來看，Google 建議 &lt;strong&gt;CLS ≤ 0.1&lt;/strong&gt;、&lt;strong&gt;LCP ≤ 2.5 秒&lt;/strong&gt;。這裡看的是 CrUX 第 75 百分位的真實使用者資料，不是本機 Lighthouse 跑到 100 分就代表一切沒問題。想先了解 PageSpeed Insights 和欄位資料的差異，可以參考 &lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/&quot;&gt;PageSpeed Insights 與 Core Web Vitals 2026&lt;/a&gt;。&lt;h2 id=&quot;決策表一width+height-還是-aspect-ratio?&quot;&gt;決策表一：width+height 還是 aspect-ratio？&lt;/h2&gt;&lt;p&gt;白話一點說，瀏覽器在下載圖片前，最好先知道「這張圖大概會佔多高」，才不會把下面的內容推歪。HTML 的 &lt;code&gt;width&lt;/code&gt; 和 &lt;code&gt;height&lt;/code&gt; 會提供&lt;strong&gt;比例提示&lt;/strong&gt;；再搭配 &lt;code&gt;max-width: 100%; height: auto;&lt;/code&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;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;（hero、內文、產品圖）&lt;td&gt;HTML 真實像素 &lt;code&gt;width&lt;/code&gt; + &lt;code&gt;height&lt;/code&gt; + CSS &lt;code&gt;max-width:100%; height:auto;&lt;/code&gt;&lt;td&gt;web.dev 推薦；瀏覽器自動算比例&lt;tr&gt;&lt;td&gt;比較表／圖牆：多張截圖要同一視覺框&lt;td&gt;外層容器 &lt;code&gt;aspect-ratio: 16/9&lt;/code&gt;（或 4/3），圖用 &lt;code&gt;object-fit: cover&lt;/code&gt;&lt;td&gt;各圖比例不一也能先佔固定高&lt;tr&gt;&lt;td&gt;iframe／YouTube 等嵌入&lt;td&gt;容器設 &lt;code&gt;aspect-ratio&lt;/code&gt; 或固定高度&lt;td&gt;嵌入預設比例常怪，容易抖&lt;tr&gt;&lt;td&gt;還沒定最終檔案尺寸的占位&lt;td&gt;先用 CSS &lt;code&gt;aspect-ratio&lt;/code&gt;，上線前補真實寬高&lt;td&gt;過渡方案&lt;/table&gt;&lt;p&gt;&lt;strong&gt;一般情況優先使用 HTML 寬高。&lt;/strong&gt; CSS 的 &lt;code&gt;aspect-ratio&lt;/code&gt; 比較適合容器、嵌入內容或需要統一裁切比例的情境，不能完全取代每張圖片的寬高屬性。&lt;h3 id=&quot;可複製一般內文/hero&quot;&gt;可複製：一般內文／hero&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;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/product-dashboard.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;width&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;1200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;height&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;675&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;alt&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 attr-name&quot;&gt;decoding&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;async&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;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 全站圖建議基底——不要寫 width: auto */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&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;width&lt;/code&gt; 和 &lt;code&gt;height&lt;/code&gt; 要填的是&lt;strong&gt;圖片檔案本身的像素尺寸&lt;/strong&gt;，不是圖片在螢幕上實際顯示的寬度。顯示大小交給 CSS 控制就好。&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;figure&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&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;shot&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;img&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/compare-a.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;width&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;1600&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;height&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;900&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;alt&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;方案 A 設定畫面&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;loading&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;lazy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;decoding&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;async&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;figure&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-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.shot&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16 / 9&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&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; #f2f2f2&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;.shot img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;object-fit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cover&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&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;常見錯誤預留會失效&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;code&gt;max-width: 100%&lt;/code&gt;，沒有 width/height&lt;td&gt;高度從 0 撐開 → 下面全跳&lt;td&gt;補真實 &lt;code&gt;width&lt;/code&gt;+&lt;code&gt;height&lt;/code&gt;&lt;tr&gt;&lt;td&gt;CSS 寫了 &lt;code&gt;img { width: auto; }&lt;/code&gt;&lt;td&gt;蓋掉 HTML 寬度 hint，未載入變 0×0&lt;td&gt;&lt;strong&gt;刪掉 &lt;code&gt;width: auto&lt;/code&gt;&lt;/strong&gt;，保留 &lt;code&gt;height: auto&lt;/code&gt;&lt;tr&gt;&lt;td&gt;width/height 比例填錯&lt;td&gt;先留錯高，圖載入再校正 → 仍算 CLS&lt;td&gt;用檔案真實像素核對&lt;tr&gt;&lt;td&gt;Lazy 圖沒預留&lt;td&gt;捲到才撐高 → post-load CLS&lt;td&gt;lazy 圖同樣要有寬高&lt;/table&gt;&lt;p&gt;&lt;strong&gt;5 分鐘快速檢查&lt;/strong&gt;：全站搜尋 &lt;code&gt;&amp;lt;img&lt;/code&gt;，確認每張圖都有寬高 → 檢查全域 CSS 沒有 &lt;code&gt;width: auto&lt;/code&gt; → 用 PSI 或 Performance 面板查看 Layout Shifts。修完再喝一口咖啡，版面和心情都會穩定不少。&lt;h2 id=&quot;決策表二檔案大小顯示寬WebP/AVIF&quot;&gt;決策表二：檔案大小、顯示寬、WebP／AVIF&lt;/h2&gt;&lt;p&gt;與其一直調低圖片品質，很多時候&lt;strong&gt;先符合顯示寬度&lt;/strong&gt;更有效。手機上的內容欄可能只有 400px，卻載入一張 4000px 的原圖，像素數量差了不只一點點，下載和解碼都會變慢。這就像點了全家桶外送，最後只吃一塊雞塊。&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;顯示寬（約）&lt;th&gt;建議產出寬（約，含 2× DPR）&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;手機全寬 ~360–430px&lt;td&gt;720–860px&lt;tr&gt;&lt;td&gt;內容欄 ~640–720px&lt;td&gt;1280–1440px&lt;tr&gt;&lt;td&gt;Hero 全寬桌面 ~1200px&lt;td&gt;1200–1600px（超過 2000 通常浪費）&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;用法&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hero／LCP 圖&lt;td&gt;&lt;strong&gt;&amp;lt; 150KB&lt;/strong&gt;&lt;td&gt;優先保證首屏最大圖下載快&lt;tr&gt;&lt;td&gt;內文圖／截圖&lt;td&gt;&lt;strong&gt;&amp;lt; 80KB&lt;/strong&gt;&lt;td&gt;長文多圖時累積流量很明顯&lt;tr&gt;&lt;td&gt;小縮圖／圖示&lt;td&gt;&lt;strong&gt;&amp;lt; 20–30KB&lt;/strong&gt;&lt;td&gt;能用 SVG／CSS 就別用照片&lt;/table&gt;&lt;p&gt;這些數字&lt;strong&gt;不是&lt;/strong&gt; Google 訂下的官方門檻；Google 真正關心的是載入時間和版面位移。把圖片控制在合理大小，是讓使用慢速手機或 4G 網路的讀者更容易通過 LCP 的實用做法。&lt;p&gt;如果圖片超過預算，可以按照這個順序處理：&lt;strong&gt;先縮小寬度 → 改用 AVIF／WebP → 微調壓縮品質 → 裁掉不重要的背景&lt;/strong&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;tbody&gt;&lt;tr&gt;&lt;td&gt;靜態站、build 一次產檔&lt;td&gt;&lt;strong&gt;AVIF + WebP + JPEG&lt;/strong&gt;（&lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;）&lt;tr&gt;&lt;td&gt;只想維護一種現代格式&lt;td&gt;&lt;strong&gt;WebP + JPEG&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;UI 截圖、文字要銳利&lt;td&gt;別壓太狠；必要時略提高品質&lt;tr&gt;&lt;td&gt;Logo／簡單圖示&lt;td&gt;&lt;strong&gt;SVG&lt;/strong&gt; 優先&lt;/table&gt;&lt;p&gt;&lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; 順序：先 AVIF，再 WebP，&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 用 JPEG／PNG 兜底。瀏覽器會選第一個它吃得下的。&lt;h3 id=&quot;最小可用srcset-+-sizes&quot;&gt;最小可用：srcset + sizes&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;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&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;/img/guide-800.webp&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;srcset&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;
    /img/guide-400.webp 400w,
    /img/guide-800.webp 800w,
    /img/guide-1200.webp 1200w
  &lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;sizes&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;(max-width: 768px) 100vw, 720px&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;width&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;1200&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;height&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;675&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;alt&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 attr-name&quot;&gt;loading&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;lazy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;decoding&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;async&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;&lt;code&gt;sizes&lt;/code&gt; 寫錯，瀏覽器常會下太大檔——等於你說「我只要一杯」，店員卻端來整壺。Hero／LCP 圖請用 &lt;code&gt;loading=&amp;quot;eager&amp;quot;&lt;/code&gt;（必要時加 &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;），別把首屏主角設成懶載入。&lt;p&gt;手動壓檔可用 &lt;a href=&quot;https://squoosh.app/&quot;&gt;Squoosh&lt;/a&gt;：先縮寬 → 試 AVIF／WebP → 符合 KB 預算 → 再寫真實寬高。&lt;h2 id=&quot;決策表三手動補寬高,還是上-Eleventy-圖片管道?&quot;&gt;決策表三：手動補寬高，還是上 Eleventy 圖片管道？&lt;/h2&gt;&lt;p&gt;圖片不多時，手動處理還可以接受；但如果網站每週都要放截圖，漏寫寬高或直接放出原始大圖，幾乎只是早晚的事。尤其是請 AI 產生 Markdown 時，它很愛順手塞一張超肥的 PNG。&lt;p&gt;如果你使用 Eleventy，可以考慮官方套件 &lt;strong&gt;&lt;code&gt;@11ty/eleventy-img&lt;/code&gt;&lt;/strong&gt;。建議先從 &lt;strong&gt;Image HTML Transform&lt;/strong&gt; 開始，它能在建置時自動產生多種尺寸和現代圖片格式，也會幫你補上 &lt;code&gt;width&lt;/code&gt;／&lt;code&gt;height&lt;/code&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;全站 &amp;lt; ~20 張圖、很少更新&lt;td&gt;手動縮圖 + 寫 &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; 可接受&lt;tr&gt;&lt;td&gt;部落格持續貼截圖／hero&lt;td&gt;&lt;strong&gt;HTML Transform&lt;/strong&gt;（推薦）&lt;tr&gt;&lt;td&gt;需要每圖不同裁切／藝術方向&lt;td&gt;Image shortcode 或 WebC&lt;tr&gt;&lt;td&gt;只要先救 CLS、暫不產多尺寸&lt;td&gt;至少手動補真實寬高&lt;/table&gt;&lt;p&gt;最小設定概念：&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; eleventyImageTransformPlugin &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@11ty/eleventy-img&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&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 parameter&quot;&gt;eleventyConfig&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;
  eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addPlugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;eleventyImageTransformPlugin&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 literal-property property&quot;&gt;formats&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;avif&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;webp&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jpeg&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 literal-property property&quot;&gt;widths&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;auto&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 literal-property property&quot;&gt;htmlOptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;imgAttributes&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;loading&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;decoding&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;async&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;sizes&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(max-width: 768px) 100vw, 720px&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 class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意：Transform 預設通常會使用 &lt;code&gt;loading: &amp;quot;lazy&amp;quot;&lt;/code&gt;。&lt;strong&gt;Hero／LCP 圖要改成 &lt;code&gt;eager&lt;/code&gt;&lt;/strong&gt;，必要時再加上 &lt;code&gt;fetchpriority=&amp;quot;high&amp;quot;&lt;/code&gt;。如果產生了多種寬度，也要記得設定合理的 &lt;code&gt;sizes&lt;/code&gt;，否則瀏覽器可能把它當成 &lt;code&gt;100vw&lt;/code&gt;，下載比實際需要更大的圖片。&lt;p&gt;建議按照這個順序導入：先檢查全站圖片並補上寬高，先把 CLS 穩住 → 再開啟 Transform，抽查建置結果 → 新文章只放合理尺寸的原圖。不要再丟一張 8000px 的巨圖，然後安慰自己「以後可能用得到」。&lt;p&gt;Hugo／Astro 也有對應圖片管道；原則相同：&lt;strong&gt;建置時產對的尺寸 + 寫上寬高&lt;/strong&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;手動壓到 KB 目標&lt;td&gt;&lt;a href=&quot;https://squoosh.app/&quot;&gt;Squoosh&lt;/a&gt;、ImageOptim&lt;td&gt;圖少、先驗流程&lt;tr&gt;&lt;td&gt;Eleventy 自動多尺寸＋寬高&lt;td&gt;&lt;code&gt;@11ty/eleventy-img&lt;/code&gt; Transform&lt;td&gt;持續發文的靜態站&lt;tr&gt;&lt;td&gt;驗收欄位資料&lt;td&gt;GSC → 體驗 → Core Web Vitals、PageSpeed Insights&lt;td&gt;修完要對真實使用者分數&lt;tr&gt;&lt;td&gt;圖都瘦了但全站仍慢（TTFB／憑證）&lt;td&gt;&lt;a href=&quot;https://zerossl.com/?fpr=janet52&quot;&gt;ZeroSSL&lt;/a&gt; 檢查／更新 HTTPS 憑證鏈&lt;td&gt;自架或憑證快到期、混合內容警告時&lt;/table&gt;&lt;p&gt;HTTPS 正常、憑證鏈完整，才不會在傳輸層又多出一個體驗問題。圖片預留和壓縮檔案，主要解決的是前端 CLS 與下載量；HTTPS 憑證則是另一個層次，兩者最好分開檢查。憑證設定可以參考站內的 &lt;a href=&quot;https://kamadiam.com/zerossl-tutorial/&quot;&gt;ZeroSSL 教學&lt;/a&gt;。&lt;h2 id=&quot;結語圖片最佳化,就是別讓-CLS-亂跳也別拖慢下載&quot;&gt;結語：圖片最佳化，就是別讓 CLS 亂跳、也別拖慢下載&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;每張 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 補真實 &lt;code&gt;width&lt;/code&gt;＋&lt;code&gt;height&lt;/code&gt;（或容器 &lt;code&gt;aspect-ratio&lt;/code&gt;）；刪掉會搞壞預留的 &lt;code&gt;width: auto&lt;/code&gt;&lt;li&gt;顯示寬符合再壓檔：hero 瞄準 &lt;strong&gt;&amp;lt; 150KB&lt;/strong&gt;、內文 &lt;strong&gt;&amp;lt; 80KB&lt;/strong&gt;；優先 AVIF／WebP&lt;li&gt;圖一多就上 build 管道（Eleventy 用 &lt;code&gt;eleventy-img&lt;/code&gt;），hero 記得覆寫勿 lazy&lt;li&gt;用 GSC／PSI 驗收；欄位資料大約看 28 天滾動&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;下一步&lt;/strong&gt;：先替全站圖片補齊寬高，並檢查 Hero 和內文圖片是否符合檔案預算。如果建置產物都沒問題，但 TTFB 仍然偏高，或憑證出現警告，再用 &lt;a href=&quot;https://zerossl.com/?fpr=janet52&quot;&gt;ZeroSSL&lt;/a&gt; 把 HTTPS 和憑證鏈處理好，最後回到 GSC 對照體驗資料。檢查完，再來一杯咖啡。</content>
  </entry>
  <entry>
    <title>Proton VPN 值得買嗎？免費版實測 + 付費版完整功能深度解析</title>
    <link href="https://kamadiam.com/proton-vpn-free-vs-paid-review/" />
    <updated>2026-08-02T13:25:00Z</updated>
    <id>https://kamadiam.com/proton-vpn-free-vs-paid-review/</id>
    <content type="html">&lt;p&gt;你是不是也曾經在 App Store 搜尋「免費 VPN」，然後下載了一個評分看起來還不錯的 App，結果沒多久卻看到新聞說「某某免費 VPN 洩露用戶資料」？&lt;p&gt;免費 VPN 的世界充滿陷阱——有些偷偷蒐集你的瀏覽紀錄販售給廣告商，有些在背景悄悄挖礦，有些甚至將你的裝置當成流量節點出租。但付費 VPN 動輒每月數百元，又讓人下不了手。&lt;p&gt;有沒有兩全其美的選擇？&lt;p&gt;有。而且它來自一家由 CERN（歐洲核子研究組織）科學家創立、總部設在瑞士的公司——&lt;strong&gt;Proton VPN&lt;/strong&gt;。&lt;p&gt;這篇文章會完整告訴你：Proton VPN 的免費版到底有多好用、付費版值不值得升級，以及它在技術安全層面為什麼與眾不同。&lt;p&gt;先說明我的使用背景：我自己使用 Proton VPN、Proton Drive 和 Proton Mail 已經超過兩年。選擇它們不是為了切換國家觀看 Netflix，也不是為了玩遊戲或追求其他特殊用途，完完全全就是為了提升日常的網路安全與隱私保護。對我來說，VPN 不只是「連到其他國家」的工具，而是平常使用網路時，多加一層保護的基本配備。&lt;p&gt;我去國外住飯店時，只要使用飯店 Wi-Fi，就會開啟 VPN。平常在外面遇到免費 Wi-Fi 也是一樣：只要它比手機網路更快、更順，我就會使用，但一定會先把 VPN 打開。畢竟免費 Wi-Fi 再方便，也不代表它值得完全信任。&lt;p&gt;另外，Proton Mail 也是一個非常好用的服務，可以透過別名等功能減少公開自己的主要電子郵件地址；Proton Pass 更是我認為值得列入必備清單的工具。&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-free-vs-paid-review/#%E7%82%BA%E4%BB%80%E9%BA%BC%E5%A4%A7%E5%A4%9A%E6%95%B8%E3%80%8C%E5%85%8D%E8%B2%BB-VPN%E3%80%8D%E5%BE%88%E5%8D%B1%E9%9A%AA?&quot;&gt;為什麼大多數「免費 VPN」很危險？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#Proton-VPN-%E5%85%8D%E8%B2%BB%E7%89%88%E5%B8%82%E5%A0%B4%E4%B8%8A%E7%9A%84%E7%95%B0%E9%A1%9E&quot;&gt;Proton VPN 免費版：市場上的異類&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#%E5%85%8D%E8%B2%BB%E7%89%88-vs-%E4%BB%98%E8%B2%BB%E7%89%88Plus%E5%AE%8C%E6%95%B4%E5%8A%9F%E8%83%BD%E5%B0%8D%E6%AF%94&quot;&gt;免費版 vs 付費版（Plus）：完整功能對比&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#%E8%AE%93-Proton-VPN-%E8%88%87%E7%9C%BE%E4%B8%8D%E5%90%8C%E7%9A%84%E5%9B%9B%E5%A4%A7%E6%8A%80%E8%A1%93%E7%89%B9%E8%89%B2&quot;&gt;讓 Proton VPN 與眾不同的四大技術特色&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#%E3%80%8C%E7%84%A1%E6%97%A5%E8%AA%8C%E3%80%8D%E4%B8%8D%E5%8F%AA%E6%98%AF%E5%BB%A3%E5%91%8A%E8%A9%9E%E2%80%94%E2%80%94%E5%A6%82%E4%BD%95%E9%A9%97%E8%AD%89-Proton-VPN-%E7%9A%84%E8%AA%A0%E4%BF%A1?&quot;&gt;「無日誌」不只是廣告詞——如何驗證 Proton VPN 的誠信？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#Proton-%E4%B8%8D%E5%8F%AA%E6%98%AF-VPN%E5%AE%8C%E6%95%B4%E9%9A%B1%E7%A7%81%E7%94%9F%E6%85%8B%E7%B3%BB&quot;&gt;Proton 不只是 VPN：完整隱私生態系&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#%E6%88%91%E6%8E%A8%E8%96%A6%E8%AA%B0%E6%87%89%E8%A9%B2%E9%81%B8%E6%93%87%E5%93%AA%E5%80%8B%E6%96%B9%E6%A1%88?&quot;&gt;我推薦誰應該選擇哪個方案？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#%E6%8E%A8%E8%96%A6%E8%B3%87%E6%BA%90&quot;&gt;推薦資源&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/proton-vpn-free-vs-paid-review/#%E7%B8%BD%E7%B5%90&quot;&gt;總結&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;hr&gt;&lt;h2 id=&quot;為什麼大多數「免費-VPN」很危險?&quot;&gt;為什麼大多數「免費 VPN」很危險？&lt;/h2&gt;&lt;p&gt;在討論 Proton VPN 之前，我們需要先理解免費 VPN 的商業模式——如果你不付錢，&lt;strong&gt;你就是商品&lt;/strong&gt;。&lt;p&gt;常見的免費 VPN 營利手法包括：&lt;ul&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;給其他人使用（你的 IP 可能被用來做你不知道的事）&lt;li&gt;&lt;strong&gt;記錄 DNS 查詢&lt;/strong&gt;並分析用戶行為&lt;/ul&gt;&lt;p&gt;選擇免費 VPN 的風險，有時候比完全不用 VPN 還大。&lt;hr&gt;&lt;h2 id=&quot;Proton-VPN-免費版市場上的異類&quot;&gt;Proton VPN 免費版：市場上的異類&lt;/h2&gt;&lt;p&gt;Proton VPN 免費版的特殊之處在於，它打破了「免費一定不安全」的慣例：&lt;ul&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;（AES-256）&lt;li&gt;✅ &lt;strong&gt;開源程式碼&lt;/strong&gt;，任何人都能審計&lt;/ul&gt;&lt;p&gt;那它的限制是什麼？&lt;h3 id=&quot;免費版的三個主要限制&quot;&gt;免費版的三個主要限制&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;僅支援三個國家的伺服器&lt;/strong&gt;：美國、荷蘭、日本。如果你需要連到特定地區（例如英國看 BBC iPlayer），免費版就力有未逮。&lt;li&gt;&lt;strong&gt;單一裝置連線&lt;/strong&gt;：同一時間只能在一台設備上使用。&lt;li&gt;&lt;strong&gt;低網路優先權&lt;/strong&gt;：免費伺服器使用者眾多，負載常年維持在 80–95%，尖峰時段速度明顯受影響。&lt;/ol&gt;&lt;h3 id=&quot;免費版-vs-付費版速度實測數據&quot;&gt;免費版 vs 付費版速度實測數據&lt;/h3&gt;&lt;p&gt;根據 2026 年 TechRadar、PCMag 等第三方機構的測速基準，以及 Proton VPN 社群實測數據，以下為免費版與 Plus 付費版的詳細效能對比（測試基底頻寬：1,000 Mbps）：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;評測指標&lt;th style=&quot;text-align:center&quot;&gt;免費方案 (Free)&lt;th style=&quot;text-align:center&quot;&gt;Plus 付費方案&lt;th style=&quot;text-align:center&quot;&gt;效能差異&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;下載速度&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;50–150 Mbps（尖峰可能降至 30 Mbps 以下）&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;950–1,500+ Mbps&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;付費版快 6–10 倍以上&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;上傳速度&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;30–80 Mbps&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;800–1,200+ Mbps&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;免費版不適合大型上傳或 P2P&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;延遲 (Ping)&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;20–200+ ms（受限於美、荷、日三地）&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;5–30 ms&lt;/strong&gt;（本地）/ 80–150 ms（跨國）&lt;td style=&quot;text-align:center&quot;&gt;付費版可選鄰近節點大幅降低延遲&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;網路優先權&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;低優先（Deprioritized）&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;高優先（Priority Access）&lt;/strong&gt;&lt;td style=&quot;text-align:center&quot;&gt;尖峰時段付費版無明顯卡頓&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;💡 免費版提速技巧&lt;/strong&gt;：若網頁載入緩慢，進入設定將連線協定強制切換為 &lt;strong&gt;WireGuard&lt;/strong&gt;，可有效改善頻寬擁擠時的效率。&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;速度差異的技術根因&lt;/strong&gt;：Proton VPN 並不對免費版進行人工限速，差異主要來自&lt;strong&gt;伺服器資源分配&lt;/strong&gt;——Plus 版提供全球 90+ 個國家、超過 20,000 個 10 Gbps 高速伺服器，平均負載維持在 30% 以下，並搭載 &lt;strong&gt;VPN Accelerator&lt;/strong&gt; 技術，透過優化 TCP 擁塞控制算法，能將長途連線速度提升達 400% 以上。&lt;hr&gt;&lt;h2 id=&quot;免費版-vs-付費版Plus完整功能對比&quot;&gt;免費版 vs 付費版（Plus）：完整功能對比&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;th style=&quot;text-align:center&quot;&gt;免費版&lt;th style=&quot;text-align:center&quot;&gt;Plus 付費版&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;tr&gt;&lt;td&gt;可用伺服器國家&lt;td style=&quot;text-align:center&quot;&gt;3 個&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;90+ 個&lt;/strong&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;strong&gt;20,000+ 個&lt;/strong&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;strong&gt;高（10 Gbps 專屬通道）&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;同時連線裝置數&lt;td style=&quot;text-align:center&quot;&gt;1 台&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;10 台&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;Netflix / 串流解鎖&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;P2P / BT 下載&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;Secure Core（雙重跳板）&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;NetShield（廣告 &amp;amp; 惡意軟體攔截）&lt;td style=&quot;text-align:center&quot;&gt;❌&lt;td style=&quot;text-align:center&quot;&gt;✅&lt;tr&gt;&lt;td&gt;Stealth 混淆協定&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;關鍵升級理由&lt;/strong&gt;：如果你的主要需求是&lt;strong&gt;解鎖串流平台&lt;/strong&gt;、&lt;strong&gt;P2P 下載&lt;/strong&gt;，或&lt;strong&gt;在高審查地區穩定使用&lt;/strong&gt;，免費版將會讓你明顯感到受限。&lt;hr&gt;&lt;h2 id=&quot;讓-Proton-VPN-與眾不同的四大技術特色&quot;&gt;讓 Proton VPN 與眾不同的四大技術特色&lt;/h2&gt;&lt;h3 id=&quot;1.-Secure-Core雙重跳板防禦&quot;&gt;1. Secure Core：雙重跳板防禦&lt;/h3&gt;&lt;p&gt;一般 VPN 的流量路徑是：你的設備 → VPN 伺服器 → 目標網站。&lt;p&gt;如果 VPN 的出口伺服器被監控（例如國家級的流量分析），理論上可以關聯輸入與輸出流量，找出你的真實 IP。&lt;p&gt;Proton VPN 的 Secure Core 解決了這個問題：流量會先通過 &lt;strong&gt;Proton 自有、實體安全等級極高的伺服器&lt;/strong&gt;（部分位於瑞士舊軍事掩體、冰島及瑞典），再轉接至目標國家的出口伺服器。即使出口伺服器被駭，攻擊者也無法回溯你的真實位置。&lt;h3 id=&quot;2.-Stealth-協定突破深度封包檢測&quot;&gt;2. Stealth 協定：突破深度封包檢測&lt;/h3&gt;&lt;p&gt;標準的 OpenVPN 和 WireGuard 流量，其封包特徵是可被識別的。部分國家的防火牆（如中國的 GFW）會針對這些特徵進行阻斷。&lt;p&gt;Proton 的 Stealth 協定運用了雙重混淆機制：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;TLS 偽裝&lt;/strong&gt;：將 VPN 數據封裝在標準 TLS 加密通道中，讓流量看起來與銀行網站的 HTTPS 完全相同&lt;li&gt;&lt;strong&gt;主動探測防禦&lt;/strong&gt;：當防火牆向 VPN 端口發送探測包驗證時，伺服器會返回普通的網頁響應，騙過 DPI 系統&lt;/ol&gt;&lt;p&gt;這對在高審查地區旅行或居住的用戶（如往返中國大陸、中東的商務人士）至關重要。&lt;h3 id=&quot;3.-NetShieldDNS-層廣告與惡意軟體防護&quot;&gt;3. NetShield：DNS 層廣告與惡意軟體防護&lt;/h3&gt;&lt;p&gt;NetShield 是一個基於 DNS 的網路層過濾器。當你啟用它後，DNS 請求會在 Proton 伺服器端即時與已知的廣告伺服器、追蹤器及惡意網域列表進行比對，&lt;strong&gt;在資源載入之前&lt;/strong&gt;就直接封鎖該請求。&lt;p&gt;實際效益：&lt;ul&gt;&lt;li&gt;加速網頁載入（跳過廣告載入時間）&lt;li&gt;節省行動數據流量&lt;li&gt;降低連到已知惡意網域的風險&lt;/ul&gt;&lt;p&gt;這也是我覺得 NetShield 很必要的原因。平常瀏覽網站時，偶爾會遇到一些奇奇怪怪的網站，頁面裡可能塞滿廣告、追蹤器，甚至導向可疑的下載連結。Proton VPN 會先在 DNS 層級擋掉部分已知的廣告、追蹤與惡意網域，讓這些內容沒有機會正常載入。當然，它不是萬能的防毒軟體，不能保證攔截所有木馬或病毒；遇到不熟悉的網站和自動下載的檔案，還是要保持警覺。&lt;h3 id=&quot;4.-瑞士法律管轄權法律層面的最強隱私盾牌&quot;&gt;4. 瑞士法律管轄權：法律層面的最強隱私盾牌&lt;/h3&gt;&lt;p&gt;Proton VPN 總部設在瑞士，這不只是一個「聽起來很安全」的賣點，而是有實質法律意義的。&lt;p&gt;瑞士於 2023 年 9 月正式生效的&lt;strong&gt;全新《聯邦數據保護法》(nFADP)&lt;/strong&gt; 確立了以下關鍵保護：&lt;ul&gt;&lt;li&gt;瑞士&lt;strong&gt;不屬於五眼、九眼、十四眼情報聯盟&lt;/strong&gt;，情報機構無法互通資料&lt;li&gt;瑞士法律&lt;strong&gt;不將 VPN 列為電信業者&lt;/strong&gt;，因此不適用強制數據保留法——Proton 在法律上被允許實施徹底的「無日誌政策」&lt;li&gt;&lt;strong&gt;禁言令（Gag Orders）在瑞士不存在&lt;/strong&gt;：任何外國情報機構索取用戶資料，必須通過正式的 MLAT 國際司法協助程序，並由瑞士聯邦法院獨立審查&lt;li&gt;若請求涉及的事項在瑞士不構成犯罪，或違反瑞士憲法與人權標準，請求將&lt;strong&gt;直接被拒絕&lt;/strong&gt;&lt;/ul&gt;&lt;p&gt;相較之下，設立在巴拿馬（NordVPN）或英屬維京群島（ExpressVPN）的競爭者，雖然同樣聲稱無日誌，但其法律架構的透明度與可驗證性不及瑞士法律體系完整。&lt;hr&gt;&lt;h2 id=&quot;「無日誌」不只是廣告詞——如何驗證-Proton-VPN-的誠信?&quot;&gt;「無日誌」不只是廣告詞——如何驗證 Proton VPN 的誠信？&lt;/h2&gt;&lt;p&gt;市面上幾乎每一家 VPN 都宣稱自己是「無日誌（No-Logs）」，但如何辨真假？以下是三個硬核驗證指標：&lt;h3 id=&quot;驗證指標-1第三方獨立安全審計&quot;&gt;驗證指標 1：第三方獨立安全審計&lt;/h3&gt;&lt;p&gt;Proton VPN 定期委託全球頂尖的資安機構（包括 Cure53 等）進行代碼審查與實地伺服器架構稽核，並公開發布完整審計報告，任何人皆可下載查閱。&lt;h3 id=&quot;驗證指標-2真實法庭案例的考驗最強鐵證&quot;&gt;驗證指標 2：真實法庭案例的考驗（最強鐵證）&lt;/h3&gt;&lt;p&gt;再嚴謹的審計，都比不上執法機關實際索取資料失敗的真實案例：&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Proton VPN 法庭紀錄&lt;/strong&gt;：曾收到法庭命令要求提供特定用戶的資料，但因為無日誌架構，Proton 最終僅能回覆「無法提供，因為我們沒有這些資料」——這是最有說服力的隱私承諾。&lt;/blockquote&gt;&lt;h3 id=&quot;驗證指標-3開源程式碼任何人都可以審計&quot;&gt;驗證指標 3：開源程式碼（任何人都可以審計）&lt;/h3&gt;&lt;p&gt;Proton VPN 的客戶端程式碼&lt;strong&gt;全部開源&lt;/strong&gt;發布在 GitHub，任何具備能力的開發者都可以自行審計其是否有隱藏的日誌收集行為。這一點是封閉原始碼的競爭對手（如 Surfshark、NordVPN 的部分元件）所做不到的。&lt;hr&gt;&lt;h2 id=&quot;Proton-不只是-VPN完整隱私生態系&quot;&gt;Proton 不只是 VPN：完整隱私生態系&lt;/h2&gt;&lt;p&gt;如果你開始關注數位隱私，Proton VPN 只是第一步。Proton 還提供一整套替代主流科技巨頭的隱私產品：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Proton 產品&lt;th&gt;替代方案&lt;th&gt;核心優勢&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Mail&lt;/strong&gt;&lt;td&gt;Gmail&lt;td&gt;端對端加密，Proton 本身也無法讀取你的郵件&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Drive&lt;/strong&gt;&lt;td&gt;Google Drive&lt;td&gt;零知識加密，檔案在上傳前就已加密&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Pass&lt;/strong&gt;&lt;td&gt;Chrome 密碼管理器&lt;td&gt;獨立加密金庫，整合 2FA 與別名生成&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proton Calendar&lt;/strong&gt;&lt;td&gt;Google Calendar&lt;td&gt;端對端加密行事曆&lt;/table&gt;&lt;p&gt;購買 &lt;strong&gt;Proton Unlimited&lt;/strong&gt; 套餐可一次解鎖所有服務，對於希望全面「去 Google 化」的用戶來說，性價比遠高於分別訂閱各項服務。&lt;h3 id=&quot;💰-Proton-方案台灣地區定價估算-以-1-USD-≈-31.9-TWD-換算&quot;&gt;💰 Proton 方案台灣地區定價估算 (以 1 USD ≈ 31.9 TWD 換算)&lt;/h3&gt;&lt;p&gt;目前 Proton 官方網站採美元、歐元與瑞士法郎結帳，台灣讀者可直接使用台灣信用卡刷卡扣款（下表為折合台幣的估算，不含海外刷卡手續費）：&lt;p&gt;&lt;strong&gt;Proton VPN Plus（單純 VPN 升級方案）&lt;/strong&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:center&quot;&gt;計費週期&lt;th style=&quot;text-align:center&quot;&gt;月費（USD）&lt;th style=&quot;text-align:center&quot;&gt;折合台幣（估算）&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;按月付費&lt;td style=&quot;text-align:center&quot;&gt;$9.99 / 月&lt;td style=&quot;text-align:center&quot;&gt;約 &lt;strong&gt;$319 TWD / 月&lt;/strong&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;按年付費&lt;td style=&quot;text-align:center&quot;&gt;$3.99 / 月&lt;td style=&quot;text-align:center&quot;&gt;約 &lt;strong&gt;$127 TWD / 月&lt;/strong&gt;（年結共約 $1,527 TWD）&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;兩年付費&lt;td style=&quot;text-align:center&quot;&gt;$2.99 / 月&lt;td style=&quot;text-align:center&quot;&gt;約 &lt;strong&gt;$95 TWD / 月&lt;/strong&gt;（兩年結共約 $2,289 TWD）⭐ 最划算&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Proton Unlimited（含 VPN Plus + Mail + Drive 500GB + Pass + Calendar）&lt;/strong&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:center&quot;&gt;計費週期&lt;th style=&quot;text-align:center&quot;&gt;月費（USD）&lt;th style=&quot;text-align:center&quot;&gt;折合台幣（估算）&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;按月付費&lt;td style=&quot;text-align:center&quot;&gt;$12.99 / 月&lt;td style=&quot;text-align:center&quot;&gt;約 &lt;strong&gt;$414 TWD / 月&lt;/strong&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;按年付費&lt;td style=&quot;text-align:center&quot;&gt;$9.99 / 月&lt;td style=&quot;text-align:center&quot;&gt;約 &lt;strong&gt;$319 TWD / 月&lt;/strong&gt;（年結共約 $3,824 TWD）&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;兩年付費&lt;td style=&quot;text-align:center&quot;&gt;$7.99 / 月&lt;td style=&quot;text-align:center&quot;&gt;約 &lt;strong&gt;$255 TWD / 月&lt;/strong&gt;（兩年結共約 $6,117 TWD）&lt;/table&gt;&lt;hr&gt;&lt;h2 id=&quot;我推薦誰應該選擇哪個方案?&quot;&gt;我推薦誰應該選擇哪個方案？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;✅ 選免費版，如果你：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;只是偶爾需要 VPN 保護公共 Wi-Fi 安全&lt;li&gt;不需要解鎖串流平台或 P2P 下載&lt;li&gt;想先試用後再決定是否付費&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;✅ 選 Plus 付費版，如果你：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;需要解鎖 Netflix、Disney+、YouTube Premium 等地區限制內容&lt;li&gt;需要 P2P / BT 下載高速伺服器&lt;li&gt;在高審查地區（需要 Stealth 協定）&lt;li&gt;需要多裝置同時連線（最多 10 台）&lt;li&gt;重視最高等級的匿名性（Secure Core + NetShield）&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;✅ 選 Proton Unlimited，如果你：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;想全面從 Google / Microsoft 生態系遷移到隱私優先的替代品&lt;li&gt;是自由工作者、律師、獨立記者，需要保護客戶機密資料的專業人士&lt;li&gt;需要一個涵蓋郵件、雲端、密碼管理的一站式隱私解決方案&lt;/ul&gt;&lt;hr&gt;&lt;h2 id=&quot;推薦資源&quot;&gt;推薦資源&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;🔐 &lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot;&gt;Proton VPN 官方網站&lt;/a&gt; — 免費帳號申請入口，無需信用卡&lt;li&gt;📦 &lt;a href=&quot;https://proton.me/pricing&quot;&gt;Proton Unlimited 套餐&lt;/a&gt; — 包含 Mail、Drive、Pass、VPN 全套&lt;li&gt;📋 &lt;a href=&quot;https://proton.me/blog/security-audit&quot;&gt;Proton VPN 安全審計報告&lt;/a&gt; — 第三方審計公開報告&lt;/ul&gt;&lt;h3 id=&quot;推薦回饋怎麼算?&quot;&gt;推薦回饋怎麼算？&lt;/h3&gt;&lt;p&gt;透過本文的專屬推薦連結註冊後，如果受邀朋友訂閱符合活動資格的 Proton 付費方案，推薦人與朋友雙方各可獲得 &lt;strong&gt;20 美元的帳戶回饋金（credit）&lt;/strong&gt;。符合資格的方案、活動期限與實際金額，仍應以 Proton 當時公布的推薦計畫條款為準。&lt;p&gt;這筆回饋金不是直接匯出的現金，而是存入 Proton 帳戶，用於折抵之後的 Proton 服務續訂費用。換句話說，朋友完成符合資格的付費訂閱後，雙方拿到的是帳戶 credit，不是可以自由提領的現金。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;聯盟揭露：&lt;/strong&gt; 本文包含 Proton VPN 推薦連結。如果你透過連結註冊或購買，我可能獲得推薦回饋；這不會增加你的費用。本文仍應依實際功能、限制與使用需求做選擇。&lt;/blockquote&gt;&lt;hr&gt;&lt;h2 id=&quot;總結&quot;&gt;總結&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Proton VPN 免費版&lt;/strong&gt;是市場上極少數真正安全、不限流量的免費選擇，適合輕度用戶入門&lt;li&gt;&lt;strong&gt;速度差異顯著&lt;/strong&gt;：付費版可達 950–1,500+ Mbps，是免費版的 6–10 倍；延遲也從 20–200ms 降至 5–30ms&lt;li&gt;&lt;strong&gt;付費版&lt;/strong&gt;的核心升級點是：串流解鎖、P2P 支援、NetShield 廣告攔截、Stealth 混淆協定與 Secure Core&lt;li&gt;&lt;strong&gt;瑞士法律管轄&lt;/strong&gt;、&lt;strong&gt;開源程式碼&lt;/strong&gt;與&lt;strong&gt;法庭實證紀錄&lt;/strong&gt;是 Proton VPN 在安全信任度上的真正護城河&lt;li&gt;若有全面隱私需求，&lt;strong&gt;Proton Unlimited&lt;/strong&gt; 提供一站式的 Google 替代方案，每月僅需 $255 TWD（兩年方案）&lt;/ul&gt;&lt;p&gt;準備好保護你的數位隱私了嗎？點擊下方連結免費申請 Proton 帳號，體驗看看——不需要信用卡，隨時可以升級。&lt;p&gt;👉 &lt;strong&gt;&lt;a href=&quot;https://pr.tn/ref/SZX2CCB0&quot;&gt;免費申請 Proton 帳號 →&lt;/a&gt;&lt;/strong&gt;</content>
  </entry>
  <entry>
    <title>AI 時代還需要學習 CSS 嗎？從「語法背誦」到「架構審查」的思維轉向</title>
    <link href="https://kamadiam.com/ai-age-css-learning-strategy/" />
    <updated>2026-07-31T03:17:00Z</updated>
    <id>https://kamadiam.com/ai-age-css-learning-strategy/</id>
    <content type="html">&lt;p&gt;沒有一杯咖啡解決不了的 CSS，如果有，就交給 AI 吧——然後你發現 AI 把整頁都 &lt;code&gt;position: absolute&lt;/code&gt; 了，跑版跑到懷疑人生，只好再來一杯。&lt;p&gt;你是不是也遇過：打開 Cursor 或 Claude，丟一句「幫我做響應式產品頁」，幾秒鐘就吐出一堆看起來很漂亮的 CSS。你心裡想：太好了，以後不用學了。結果換個螢幕寬度，版面像被貓踩過一樣。&lt;p&gt;&lt;strong&gt;結論先講：要學。但學法跟以前完全不一樣。&lt;/strong&gt; 你現在的任務不是背語法，是當 AI 的「版面審查員」——它負責產碼，你負責把關，別讓它把 PageSpeed 分數和 SEO 一起帶去陪葬。&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/ai-age-css-learning-strategy/#%E4%BD%A0%E4%B8%8D%E5%86%8D%E6%98%AF%E3%80%8C%E5%AF%AB-CSS-%E7%9A%84%E4%BA%BA%E3%80%8D,%E6%98%AF%E3%80%8C%E5%AF%A9-CSS-%E7%9A%84%E4%BA%BA%E3%80%8D&quot;&gt;你不再是「寫 CSS 的人」，是「審 CSS 的人」&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/ai-age-css-learning-strategy/#AI-%E8%B6%8A%E5%BC%B7,%E4%BD%A0%E8%B6%8A%E9%9C%80%E8%A6%81-CSS-%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B&quot;&gt;AI 越強，你越需要 CSS 心智模型&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/ai-age-css-learning-strategy/#CSS-%E8%B7%9F-SEO-%E5%85%B6%E5%AF%A6%E7%B6%81%E5%9C%A8%E4%B8%80%E8%B5%B7Google-%E4%B9%9F%E5%9C%A8%E7%9C%8B&quot;&gt;CSS 跟 SEO 其實綁在一起（Google 也在看）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/ai-age-css-learning-strategy/#%E5%9B%9B%E9%9A%8E%E6%AE%B5%E5%AD%B8%E7%BF%92%E8%B7%AF%E7%B7%9A%E9%82%8A%E5%81%9A%E9%82%8A%E8%B7%9F-AI-%E7%B7%B4,%E5%88%A5%E4%B9%BE%E8%AE%80&quot;&gt;四階段學習路線（邊做邊跟 AI 練，別乾讀）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/ai-age-css-learning-strategy/#%E5%88%A5%E5%8F%AA%E8%AA%AA%E3%80%8C%E5%B9%AB%E6%88%91%E5%81%9A%E4%B8%80%E5%80%8B%E5%8D%A1%E7%89%87%E3%80%8D%E2%80%94%E2%80%94%E7%B5%A6%E5%AE%83%E4%B8%80%E5%80%8B%E5%A5%BD-Prompt&quot;&gt;別只說「幫我做一個卡片」——給它一個好 Prompt&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/ai-age-css-learning-strategy/#%E7%B5%90%E8%AA%9E%E6%9C%83%E5%AF%AB-CSS-%E7%9A%84%E4%BA%BA%E8%AE%8A%E5%A4%9A%E4%BA%86,%E6%9C%83%E5%AF%A9-CSS-%E7%9A%84%E4%BA%BA%E6%9B%B4%E5%80%BC%E9%8C%A2&quot;&gt;結語：會寫 CSS 的人變多了，會審 CSS 的人更值錢&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;你不再是「寫-CSS-的人」,是「審-CSS-的人」&quot;&gt;你不再是「寫 CSS 的人」，是「審 CSS 的人」&lt;/h2&gt;&lt;p&gt;以前學 CSS，很大一塊時間花在背屬性——&lt;code&gt;align-content&lt;/code&gt; 有幾個值、&lt;code&gt;flex-shrink&lt;/code&gt; 預設是多少。老實說，現在 Google 一下就好，死背這些就像記咖啡機型號：知道有這台就好，不必背到能朗誦說明書。&lt;p&gt;真正值錢的，是你能不能一眼看出 AI 寫的版面哪裡怪怪的，然後用一句話把它拉回正軌。不然你就會陷入那種經典循環：跟 AI 來回對話十輪，Bug 還在，咖啡倒是喝了三杯。&lt;h3 id=&quot;AI-是乘數底子越厚,它幫你越猛&quot;&gt;AI 是乘數：底子越厚，它幫你越猛&lt;/h3&gt;&lt;p&gt;Josh Comeau 和 Kevin Powell 這類前端大師都說，我們正在進入「後開發者時代」。AI 跟你的關係比較像&lt;strong&gt;乘數&lt;/strong&gt;，不是替身：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;底子薄 (1) × AI (10) = 10&lt;/strong&gt;：MVP 很快做出來，但 Bug 一來就卡死，成品也上不了檯面。&lt;li&gt;&lt;strong&gt;底子厚 (10) × AI (10) = 100&lt;/strong&gt;：繁瑣 code 交給 AI，你用真的懂的東西（效能、a11y、可維護性）把關。&lt;/ul&gt;&lt;p&gt;白話說：AI 會放大你的能力，也會放大你的盲點。底子不夠，它幫你「快」；底子夠，它幫你「又快又好」。&lt;h2 id=&quot;AI-越強,你越需要-CSS-心智模型&quot;&gt;AI 越強，你越需要 CSS 心智模型&lt;/h2&gt;&lt;p&gt;AI 能寫 code，但它沒有眼睛，也沒有「這樣排版合理嗎」的直覺。所以它常給你&lt;strong&gt;看起來對、實際很慘&lt;/strong&gt;的解法——像自動咖啡機偶爾會出現一杯看起來是拿鐵、喝起來是苦水的東西：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;亂用 &lt;code&gt;position: absolute&lt;/code&gt;&lt;/strong&gt;：對不齊就硬拉，換個螢幕寬度整頁跑版。經典 AI 起手式。&lt;li&gt;&lt;strong&gt;還在堆 &lt;code&gt;@media&lt;/code&gt; 斷點&lt;/strong&gt;：訓練資料裡舊 code 太多，很少主動用 &lt;code&gt;clamp()&lt;/code&gt; 或 Container Queries。&lt;li&gt;&lt;strong&gt;&lt;code&gt;z-index: 9999&lt;/code&gt; 加到手酸還是沒用&lt;/strong&gt;：不懂層疊上下文，你就只能跟 AI 無限對話，永遠修不好。這時候再來一杯咖啡也沒用，得先搞懂概念。&lt;/ol&gt;&lt;h3 id=&quot;這幾件事,AI-真的替不了你&quot;&gt;這幾件事，AI 真的替不了你&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;概念&lt;th style=&quot;text-align:left&quot;&gt;AI 常犯的錯&lt;th style=&quot;text-align:left&quot;&gt;你要會的&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;正常流 (Flow)&lt;/strong&gt;&lt;td style=&quot;text-align:left&quot;&gt;版面一亂就加定位硬撐&lt;td style=&quot;text-align:left&quot;&gt;知道元素預設怎麼排、什麼時候才該脫離流&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;佈局選型&lt;/strong&gt;&lt;td style=&quot;text-align:left&quot;&gt;簡單橫排用 Grid、二維版面用 Flex&lt;td style=&quot;text-align:left&quot;&gt;1D 用 Flex、2D 用 Grid——選錯工具後面全慘&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Intrinsic Sizing&lt;/strong&gt;&lt;td style=&quot;text-align:left&quot;&gt;直接 &lt;code&gt;width: 300px&lt;/code&gt; 寫死&lt;td style=&quot;text-align:left&quot;&gt;讓內容決定大小，別讓 AI 把寬高焊死&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;設計系統 (Tokens)&lt;/strong&gt;&lt;td style=&quot;text-align:left&quot;&gt;到處 &lt;code&gt;#3b82f6&lt;/code&gt; 這種 hardcode&lt;td style=&quot;text-align:left&quot;&gt;逼它用 &lt;code&gt;--color-primary&lt;/code&gt; 這類變數&lt;/table&gt;&lt;h2 id=&quot;CSS-跟-SEO-其實綁在一起Google-也在看&quot;&gt;CSS 跟 SEO 其實綁在一起（Google 也在看）&lt;/h2&gt;&lt;p&gt;很多人以為 CSS 只影響長相。錯。在 2026 年，它直接碰 &lt;strong&gt;Core Web Vitals (CWV)&lt;/strong&gt;——Google 拿來衡量體驗的分數，跟排名也有關係。版面再漂亮，分數掉光，搜尋流量也會跟著掉，這比咖啡涼掉還難受。&lt;p&gt;AI 亂寫的 CSS，很容易搞出這些問題：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;CLS（版面位移）&lt;/strong&gt;：圖片沒尺寸、內容突然插入，頁面會跳來跳去。你要自己檢查有沒有用 &lt;code&gt;aspect-ratio&lt;/code&gt;，或預留空間。&lt;li&gt;&lt;strong&gt;INP（互動延遲）&lt;/strong&gt;：動畫用 &lt;code&gt;width&lt;/code&gt; 會觸發重排，卡卡的。引導它改用 &lt;code&gt;transform&lt;/code&gt;，分數通常好看很多。&lt;/ul&gt;&lt;p&gt;想搞懂門檻跟優化清單，可以看這篇：&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/&quot;&gt;PageSpeed Insights 與 Core Web Vitals 2026 完全指南&lt;/a&gt;。&lt;h2 id=&quot;四階段學習路線邊做邊跟-AI-練,別乾讀&quot;&gt;四階段學習路線（邊做邊跟 AI 練，別乾讀）&lt;/h2&gt;&lt;p&gt;如果你現在要重新學 CSS，我會建議照這張地圖走——每完成一階段，可以獎勵自己一杯咖啡，但別邊喝邊讓 AI 自由發揮：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;階段 1：先把心智模型建起來&lt;/strong&gt;——拿 AI 生成的卡片，把裡面所有 &lt;code&gt;absolute&lt;/code&gt; 拔掉，改用 Flex 對齊。你會很快發現「流」是什麼感覺。&lt;li&gt;&lt;strong&gt;階段 2：Flex + Grid 分工&lt;/strong&gt;——外層 12 欄用 Grid，內層元件用 Flex。練習下指令：「1D 用 Flex、2D 用 Grid，並說明為什麼。」&lt;li&gt;&lt;strong&gt;階段 3：元件級響應式&lt;/strong&gt;——少靠全局 &lt;code&gt;@media&lt;/code&gt;，多學 Container Queries。可以要求 AI：「父層設 &lt;code&gt;container-type&lt;/code&gt;，不要只靠斷點。」&lt;li&gt;&lt;strong&gt;階段 4：效能實戰&lt;/strong&gt;——把 AI 產出的 code 丟進 PageSpeed Insights，看 LCP、CLS 掉在哪。順便學 &lt;code&gt;content-visibility&lt;/code&gt; 怎麼救長頁面。&lt;/ol&gt;&lt;h2 id=&quot;別只說「幫我做一個卡片」——給它一個好-Prompt&quot;&gt;別只說「幫我做一個卡片」——給它一個好 Prompt&lt;/h2&gt;&lt;p&gt;模糊指令 = 模糊產出。就像你走進咖啡店只說「給我一杯好喝的」，店員也只能猜。你可以直接複製下面這個結構，再依專案改：&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;請為我實作一個響應式文章卡片元件：
&lt;span class=&quot;token list punctuation&quot;&gt;1.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;佈局&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;：使用語意化 HTML5；圖片在上、標題在下、按鈕靠底對齊（使用 Flex + margin-top: auto）。
&lt;span class=&quot;token list punctuation&quot;&gt;2.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;設計系統&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;：嚴格使用 var(--color-primary-600) 與 var(--spacing-md)，禁止使用 Hardcode 色碼。
&lt;span class=&quot;token list punctuation&quot;&gt;3.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;響應式&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;：使用 Container Queries。當寬度小於 280px 時，切換為緊湊模式。
&lt;span class=&quot;token list punctuation&quot;&gt;4.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;效能&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;：hover 效果僅限 transform 與 box-shadow，確保動畫流暢。
&lt;span class=&quot;token list punctuation&quot;&gt;5.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;a11y&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;：確保 focus 狀態可見，且文字對比符合 WCAG AA 標準。
&lt;span class=&quot;token list punctuation&quot;&gt;6.&lt;/span&gt; &lt;span class=&quot;token bold&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token content&quot;&gt;要求&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;**&lt;/span&gt;&lt;/span&gt;：請先解釋你選擇佈局模式的理由，再提供 CSS 代碼。&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重點不是 prompt 很長，而是&lt;strong&gt;把決策權留給你&lt;/strong&gt;——先讓它解釋為什麼這樣排，你再決定要不要採用。AI 是外骨骼，腦袋還是你的。&lt;h2 id=&quot;結語會寫-CSS-的人變多了,會審-CSS-的人更值錢&quot;&gt;結語：會寫 CSS 的人變多了，會審 CSS 的人更值錢&lt;/h2&gt;&lt;p&gt;「會寫 CSS」這件事本身，價值正在變薄。真正有差的是：你能不能交付一個&lt;strong&gt;能上線、好維護、分數也好看&lt;/strong&gt;的成品。&lt;p&gt;最後一句送給你：&lt;strong&gt;沒有一杯咖啡解決不了的 CSS，如果有，就交給 AI——但記得，審完再來一杯。&lt;/strong&gt;</content>
  </entry>
  <entry>
    <title>Pi Coding Agent 完整指南：極簡終端 AI 程式助手入門與實戰工作流</title>
    <link href="https://kamadiam.com/pi-coding-agent/" />
    <updated>2026-07-28T08:20:00Z</updated>
    <id>https://kamadiam.com/pi-coding-agent/</id>
    <content type="html">&lt;p&gt;你是不是也遇過這種情況：開了某個 AI 程式助手，它硬要你走「先規劃 → 再開子代理 → 再審查」的流程，結果改一個小 bug 也要等它跑完一整串儀式？&lt;p&gt;市面上很多 Coding Agent 越來越像「整套 IDE 替代品」，而不是「幫你省時間的夥伴」。如果你想要的是：&lt;strong&gt;極簡、快、能嵌進自己習慣的終端工作流&lt;/strong&gt;，那值得認識 &lt;strong&gt;Pi Coding Agent&lt;/strong&gt;（&lt;a href=&quot;https://pi.dev/&quot;&gt;pi.dev&lt;/a&gt;）。&lt;p&gt;這篇會帶你從「它是什麼」一路走到「怎麼裝、怎麼設定、怎麼跟 Cursor 分工」——讀完你可以決定要不要試，以及該用哪種工作流模式。&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-coding-agent/#%E4%BB%80%E9%BA%BC%E6%98%AF-Pi-Coding-Agent?&quot;&gt;什麼是 Pi Coding Agent？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#Pi-vs-Cursor-vs-Claude-Code%E8%A9%B2%E9%81%B8%E8%AA%B0?&quot;&gt;Pi vs Cursor vs Claude Code：該選誰？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%9B%9B%E7%A8%AE%E9%81%8B%E4%BD%9C%E6%A8%A1%E5%BC%8F&quot;&gt;四種運作模式&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8BPi-%E7%9C%9F%E6%AD%A3%E5%8E%B2%E5%AE%B3%E7%9A%84%E5%9C%B0%E6%96%B9&quot;&gt;上下文工程：Pi 真正厲害的地方&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E7%82%BA%E4%BB%80%E9%BA%BC-Pi-%E5%88%BB%E6%84%8F%E4%B8%8D%E5%85%A7%E5%BB%BA-MCP%E5%AD%90%E4%BB%A3%E7%90%86Plan-mode?&quot;&gt;為什麼 Pi 刻意不內建 MCP、子代理、Plan mode？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%A5%97%E4%BB%B6%E9%81%B8%E5%9E%8B%E4%B8%8D%E8%A6%81%E4%B8%80%E9%96%8B%E5%A7%8B%E8%A3%9D%E6%BB%BF%E6%8E%92%E8%A1%8C%E6%A6%9C&quot;&gt;套件選型：不要一開始裝滿排行榜&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E4%BA%94%E9%9A%8E%E6%AE%B5%E5%AF%A6%E6%88%B0%E5%B7%A5%E4%BD%9C%E6%B5%81&quot;&gt;五階段實戰工作流&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%AE%89%E8%A3%9D%E8%88%87%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%AF%A6%E6%88%B0%E7%B4%84-10-%E5%88%86%E9%90%98&quot;&gt;安裝與第一次實戰（約 10 分鐘）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%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/pi-coding-agent/#%E7%B5%90%E8%AA%9E%E5%9B%9E%E6%AD%B8%E6%A5%B5%E7%B0%A1,%E4%BD%86%E5%88%A5%E5%9B%9E%E6%AD%B8%E4%BD%8E%E6%95%88&quot;&gt;結語：回歸極簡，但別回歸低效&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;什麼是-Pi-Coding-Agent?&quot;&gt;什麼是 Pi Coding Agent？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Pi Coding Agent&lt;/strong&gt; 是跑在終端機（Terminal）裡的 AI 程式開發助手，由 Earendil Inc. 維護。它的設計哲學可以濃縮成一句話：&lt;blockquote&gt;&lt;p&gt;世界上有很多 Agent 框架，但這一個是&lt;strong&gt;你的&lt;/strong&gt;——工具來適應你，不是你來適應工具。&lt;/blockquote&gt;&lt;p&gt;跟 Devin、重度多代理編排系統不同，Pi 走的是 &lt;strong&gt;「極簡核心 + 按需擴充」&lt;/strong&gt;：&lt;p&gt;&lt;strong&gt;Devin&lt;/strong&gt; 是 Cognition 推出的自主 AI 軟體工程師（&lt;a href=&quot;https://devin.ai/&quot;&gt;devin.ai&lt;/a&gt;）：接到任務後會自行拆解步驟、讀 repo、寫 code、跑測試、開 PR，人類多半只需審核結果。這類「大而全」的 agent 平台內建規劃模式與子代理編排，能獨立完成整個 feature，但工作流往往也由工具決定，而不是開發者自己拼裝。&lt;ul&gt;&lt;li&gt;&lt;strong&gt;核心只有四個工具&lt;/strong&gt;：&lt;code&gt;read&lt;/code&gt;、&lt;code&gt;write&lt;/code&gt;、&lt;code&gt;edit&lt;/code&gt;、&lt;code&gt;bash&lt;/code&gt;&lt;li&gt;&lt;strong&gt;不內建&lt;/strong&gt; sub-agent、Plan mode、全專案向量索引&lt;li&gt;&lt;strong&gt;能力靠你自己加&lt;/strong&gt;：&lt;code&gt;AGENTS.md&lt;/code&gt;、Skills、Extensions、Pi Packages&lt;/ul&gt;&lt;p&gt;白話說：你在專案資料夾打 &lt;code&gt;pi&lt;/code&gt;，就能用自然語言叫 AI 讀檔、改 code、跑測試；要不要加 MCP、子代理、網頁搜尋，全由你決定。&lt;h3 id=&quot;四層架構看懂-Pi-在幹嘛&quot;&gt;四層架構（看懂 Pi 在幹嘛）&lt;/h3&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;CLI / TUI&lt;/strong&gt;&lt;td&gt;終端互動、顯示 token 與狀態、高風險操作的人工確認&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Agent 協調&lt;/strong&gt;&lt;td&gt;ReAct 迴圈：想 → 做 → 看結果 → 再修正&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工具與上下文&lt;/strong&gt;&lt;td&gt;四工具 + Extension 注入的 RAG / MCP&lt;tr&gt;&lt;td&gt;&lt;strong&gt;持久化&lt;/strong&gt;&lt;td&gt;Session 樹狀歷史、JSONL 日誌，可 fork、可匯出&lt;/table&gt;&lt;p&gt;把 AI 直接放在終端的好處很實際：不用再「複製錯誤訊息 → 貼到聊天窗 → 複製修復 code 回來」。Linter 報錯、測試失敗，Agent 可以直接讀輸出並迭代修正。&lt;h2 id=&quot;Pi-vs-Cursor-vs-Claude-Code該選誰?&quot;&gt;Pi vs Cursor vs Claude Code：該選誰？&lt;/h2&gt;&lt;p&gt;Pi 不是 Cursor 的平替，而是不同取捨。下面這張表幫你 30 秒判斷：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;維度&lt;th&gt;Pi Coding Agent&lt;th&gt;Claude Code&lt;th&gt;Cursor Agent&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;核心工具&lt;/strong&gt;&lt;td&gt;4 個（read/write/edit/bash）&lt;td&gt;10+ 內建&lt;td&gt;IDE + MCP + 多模型&lt;tr&gt;&lt;td&gt;&lt;strong&gt;上下文來源&lt;/strong&gt;&lt;td&gt;AGENTS.md + Extension 注入&lt;td&gt;CLAUDE.md + 選擇性讀檔&lt;td&gt;全專案向量索引 + &lt;code&gt;@&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sub-agents&lt;/strong&gt;&lt;td&gt;無（Package 自建）&lt;td&gt;內建 Task&lt;td&gt;Background Agent&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plan mode&lt;/strong&gt;&lt;td&gt;無（Prompt Template 替代）&lt;td&gt;內建&lt;td&gt;Composer 規劃&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAG / 索引&lt;/strong&gt;&lt;td&gt;社群 Extension（如 pi-local-rag）&lt;td&gt;grep + 讀檔&lt;td&gt;自動 codebase embedding&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;td&gt;&lt;strong&gt;樹狀分支&lt;/strong&gt; + compact&lt;td&gt;線性 + compact&lt;td&gt;多 chat tab&lt;tr&gt;&lt;td&gt;&lt;strong&gt;部署&lt;/strong&gt;&lt;td&gt;CLI / RPC / SDK 嵌入&lt;td&gt;CLI only&lt;td&gt;Desktop IDE&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Token 效率&lt;/strong&gt;&lt;td&gt;極小 system prompt&lt;td&gt;中等&lt;td&gt;較高&lt;tr&gt;&lt;td&gt;&lt;strong&gt;最適合&lt;/strong&gt;&lt;td&gt;終端實驗、SDK 嵌入、可版本控制的 Agent 設定&lt;td&gt;Anthropic 生態深度使用者&lt;td&gt;日常 IDE 多檔編輯&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;tbody&gt;&lt;tr&gt;&lt;td&gt;大型 monorepo、要靠自動索引&lt;td&gt;Cursor / Claude Code&lt;tr&gt;&lt;td&gt;Side project、終端一把梭&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;本地模型、低 VRAM、要控 token&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;Agent 設定要進 Git（&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;tr&gt;&lt;td&gt;自建產品要嵌 Agent（SDK）&lt;td&gt;&lt;strong&gt;Pi&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;UI 調像素、邊預覽邊改&lt;td&gt;Cursor&lt;/table&gt;&lt;p&gt;&lt;strong&gt;實戰分工&lt;/strong&gt;（很多人兩邊都裝）：主專案用 Cursor 改 UI、多檔 refactor；Pi 負責終端批次任務、長跑腳本、低成本實驗。&lt;strong&gt;同一目錄同一時間只讓一邊寫檔&lt;/strong&gt;——並行時用 git worktree 隔離。&lt;h2 id=&quot;四種運作模式&quot;&gt;四種運作模式&lt;/h2&gt;&lt;p&gt;Pi 不只有「開 TUI 聊天」：&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;Interactive（互動）&lt;/strong&gt;&lt;td&gt;專案目錄執行 &lt;code&gt;pi&lt;/code&gt;&lt;td&gt;日常對話、除錯、改 code&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Print / JSON&lt;/strong&gt;&lt;td&gt;&lt;code&gt;pi -p &amp;quot;分析此 repo&amp;quot;&lt;/code&gt;、&lt;code&gt;--mode json&lt;/code&gt;&lt;td&gt;腳本自動化、結構化事件流&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RPC&lt;/strong&gt;&lt;td&gt;stdin/stdout JSON 協議&lt;td&gt;非 Node 系統整合&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;td&gt;嵌入自己的 TS 應用&lt;td&gt;自建 Agent 產品&lt;/table&gt;&lt;p&gt;互動模式裡還有兩個很多人愛用的即時控制：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Steering（&lt;code&gt;Enter&lt;/code&gt;）&lt;/strong&gt;：Agent 還在跑時，你可以立刻送新指令糾偏；目前工具執行完就切方向，不會傻等整條鏈跑完。&lt;li&gt;&lt;strong&gt;Follow-up（&lt;code&gt;Alt + Enter&lt;/code&gt;）&lt;/strong&gt;：排程下一則訊息，等當前任務完成後自動接上。&lt;/ul&gt;&lt;p&gt;長對話別硬撐——用 &lt;code&gt;/compact&lt;/code&gt; 壓縮舊訊息，或 &lt;code&gt;/tree&lt;/code&gt; 開分支試另一條路，歷史都留在同一個 session 檔裡。&lt;h2 id=&quot;上下文工程Pi-真正厲害的地方&quot;&gt;上下文工程：Pi 真正厲害的地方&lt;/h2&gt;&lt;p&gt;AI 回得好不好，八成看上下文怎麼塞。Pi 的策略是：&lt;strong&gt;Harness 保持極簡，上下文全部可組合、可版本控制。&lt;/strong&gt;&lt;h3 id=&quot;1.-Context-FilesAGENTS.md-/-SYSTEM.md&quot;&gt;1. Context Files（&lt;code&gt;AGENTS.md&lt;/code&gt; / &lt;code&gt;SYSTEM.md&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;Pi 啟動時會串接多層指令檔：&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;code&gt;~/.pi/agent/AGENTS.md&lt;/code&gt;&lt;td&gt;個人通用規範&lt;tr&gt;&lt;td&gt;父目錄&lt;td&gt;向上遞迴的 &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;td&gt;Monorepo 子專案繼承&lt;tr&gt;&lt;td&gt;當前目錄&lt;td&gt;&lt;code&gt;./AGENTS.md&lt;/code&gt;&lt;td&gt;專案專屬規則&lt;/table&gt;&lt;p&gt;&lt;code&gt;SYSTEM.md&lt;/code&gt; 可&lt;strong&gt;完全替換或追加&lt;/strong&gt;預設 system prompt——適合鎖語言、安全邊界、角色人設。&lt;p&gt;實戰建議再配一份 &lt;code&gt;APPEND_SYSTEM.md&lt;/code&gt;（放 &lt;code&gt;~/.pi/agent/&lt;/code&gt;）：跨專案行為，例如「先讀本地、危險操作先問、不確定就停下來問人」。它的權重通常高於專案 &lt;code&gt;AGENTS.md&lt;/code&gt;。&lt;p&gt;範例（專案根 &lt;code&gt;AGENTS.md&lt;/code&gt;）：&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; Project Instructions&lt;/span&gt;
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; 改 code 後跑 &lt;span class=&quot;token code-snippet code keyword&quot;&gt;`npm run check`&lt;/span&gt;。
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; 不要動 production 設定檔。
&lt;span class=&quot;token list punctuation&quot;&gt;-&lt;/span&gt; 不確定時先問我。&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2.-Skills按需載入的能力包&quot;&gt;2. Skills：按需載入的能力包&lt;/h3&gt;&lt;p&gt;Skills 是 Markdown 檔，frontmatter 有 &lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;description&lt;/code&gt;。Pi 只在 system prompt 放&lt;strong&gt;摘要&lt;/strong&gt;；Agent 要用 &lt;code&gt;read&lt;/code&gt; 才載入全文——避免一次塞爆 context。&lt;p&gt;手動觸發：&lt;code&gt;/skill:git-workflow&lt;/code&gt;。發現路徑：&lt;code&gt;~/.pi/agent/skills/&lt;/code&gt;、&lt;code&gt;.pi/skills/&lt;/code&gt;、&lt;code&gt;.agents/skills/&lt;/code&gt;（專案 skills 需 trust 專案）。&lt;h3 id=&quot;3.-Prompt-Templates可重用的-/-指令&quot;&gt;3. Prompt Templates：可重用的 &lt;code&gt;/&lt;/code&gt; 指令&lt;/h3&gt;&lt;p&gt;帶參數的 Markdown 模板，例如 &lt;code&gt;/review src/auth.ts&lt;/code&gt; 展開成完整審查 prompt。支援 &lt;code&gt;$1&lt;/code&gt;、&lt;code&gt;$ARGUMENTS&lt;/code&gt; 等替換。適合標準化 code review、部署 checklist。&lt;h3 id=&quot;4.-Extensions動態注入-RAG&quot;&gt;4. Extensions：動態注入 RAG&lt;/h3&gt;&lt;p&gt;TypeScript 模組可訂閱 &lt;code&gt;context&lt;/code&gt; 事件，在每次 LLM 呼叫前改 message 陣列。社群 &lt;strong&gt;pi-local-rag&lt;/strong&gt; 就是典型：本地 BM25 + 向量混合檢索，按 turn 注入相關 chunks，不動 system prompt，維持 KV-cache 效率。&lt;h3 id=&quot;Project-Trust安全邊界&quot;&gt;Project Trust（安全邊界）&lt;/h3&gt;&lt;p&gt;專案含 &lt;code&gt;.pi/&lt;/code&gt; 或 &lt;code&gt;.agents/skills/&lt;/code&gt; 時，Pi 會問你是否 &lt;strong&gt;trust&lt;/strong&gt;。未信任前只載入 context files；信任後才載入專案 extensions——避免惡意 repo 配置執行任意程式碼。&lt;h2 id=&quot;為什麼-Pi-刻意不內建-MCP子代理Plan-mode?&quot;&gt;為什麼 Pi 刻意不內建 MCP、子代理、Plan mode？&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;MCP&lt;td&gt;傳統整合可吃掉半個 context&lt;td&gt;&lt;code&gt;pi install npm:pi-mcp-adapter&lt;/code&gt;&lt;tr&gt;&lt;td&gt;Sub-agents&lt;td&gt;避免核心膨脹、強制工作流&lt;td&gt;&lt;code&gt;pi install npm:pi-subagents&lt;/code&gt;&lt;tr&gt;&lt;td&gt;Plan mode&lt;td&gt;不想 opinionated 規劃儀式&lt;td&gt;Prompt Template 或 &lt;code&gt;/plan&lt;/code&gt; Extension&lt;tr&gt;&lt;td&gt;IDE 整合&lt;td&gt;專注終端 Harness&lt;td&gt;RPC / SDK 給外部嵌&lt;/table&gt;&lt;p&gt;官方態度很直白：&lt;strong&gt;Ask Pi to build it, or install a package.&lt;/strong&gt;&lt;p&gt;套件安裝範例：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:pi-mcp-adapter    &lt;span class=&quot;token comment&quot;&gt;# MCP 生態，~200 token 代理工具&lt;/span&gt;
pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:pi-subagents      &lt;span class=&quot;token comment&quot;&gt;# scout → planner → worker 鏈&lt;/span&gt;
pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:pi-web-access     &lt;span class=&quot;token comment&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://pi.dev/packages&quot;&gt;pi.dev/packages&lt;/a&gt; 已有 50+ 社群套件。&lt;strong&gt;最佳實務是 Tier 0 起步，痛點出現再加。&lt;/strong&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tier&lt;th&gt;組合&lt;th&gt;適合&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tier 0&lt;/strong&gt;&lt;td&gt;僅 &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;td&gt;小 patch、學習四工具&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tier 1&lt;/strong&gt;&lt;td&gt;+ &lt;code&gt;pi-mcp-adapter&lt;/code&gt; + &lt;code&gt;pi-subagents&lt;/code&gt;&lt;td&gt;日常 feature、review 迴圈&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tier 2&lt;/strong&gt;&lt;td&gt;+ &lt;code&gt;pi-web-access&lt;/code&gt; / &lt;code&gt;pi-codex-goal&lt;/code&gt; / &lt;code&gt;context-mode&lt;/code&gt;&lt;td&gt;長任務、context 膨脹&lt;/table&gt;&lt;h3 id=&quot;pi-mcp-adapterMCP-但不炸-context&quot;&gt;pi-mcp-adapter：MCP 但不炸 context&lt;/h3&gt;&lt;p&gt;傳統 MCP 可能一個 server 就 10k+ tokens。&lt;strong&gt;pi-mcp-adapter&lt;/strong&gt; 用單一 &lt;code&gt;mcp&lt;/code&gt; 代理工具（約 200 token）按需發現與呼叫：&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 function&quot;&gt;mcp&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 literal-property property&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;screenshot&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 function&quot;&gt;mcp&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 literal-property property&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chrome_devtools_take_screenshot&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 function&quot;&gt;mcp&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 literal-property property&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chrome_devtools_take_screenshot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;format&quot;: &quot;png&quot;}&#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;/code&gt;&lt;/pre&gt;&lt;p&gt;Server 預設 &lt;strong&gt;lazy 啟動&lt;/strong&gt;（第一次呼叫才連線）。常用工具可設 &lt;code&gt;directTools&lt;/code&gt; 升級為一級工具。&lt;h3 id=&quot;pi-subagents子代理怎麼編排&quot;&gt;pi-subagents：子代理怎麼編排&lt;/h3&gt;&lt;p&gt;內建 8 種角色：&lt;code&gt;scout&lt;/code&gt;、&lt;code&gt;researcher&lt;/code&gt;、&lt;code&gt;planner&lt;/code&gt;、&lt;code&gt;worker&lt;/code&gt;、&lt;code&gt;reviewer&lt;/code&gt;、&lt;code&gt;oracle&lt;/code&gt; 等。支援 &lt;strong&gt;單一、鏈式（chain）、並行（parallel）&lt;/strong&gt; 三種模式。&lt;p&gt;實戰 prompt 範例：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Use scout to map the auth flow, then planner for an implementation plan.
Run parallel reviewers: correctness, tests, and unnecessary complexity.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意：parallel 模式 token 成本會倍增；裝了套件也不會自動跑 reviewer——要在 prompt 或 &lt;code&gt;AGENTS.md&lt;/code&gt; 裡&lt;strong&gt;明確要求&lt;/strong&gt;。&lt;h2 id=&quot;五階段實戰工作流&quot;&gt;五階段實戰工作流&lt;/h2&gt;&lt;p&gt;Pi 沒有「唯一官方流程」，但下面這套在實戰中最穩：&lt;pre&gt;&lt;code&gt;Phase 0  設定層（一次性）
   AGENTS.md + APPEND_SYSTEM.md + 精選 packages
        ↓
Phase 1  任務釐清
   自然語言目標 → 大任務用 create_goal 或 planner
        ↓
Phase 2  探索（唯讀）
   scout / read+grep / web-access
        ↓
Phase 3  實作
   worker 或主 session 小步 edit
        ↓
Phase 4  驗證閉環
   bash 跑 test/lint → reviewer → 修正
        ↓
Phase 5  上下文維護
   /compact、/tree 分支、context-mode（長 session）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;三個反模式請避開：&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;一開始裝滿熱門榜——context 與認知負擔暴增&lt;li&gt;長專案只靠對話記憶——應寫進 &lt;code&gt;AGENTS.md&lt;/code&gt;、goal 檔或 &lt;code&gt;plan.md&lt;/code&gt;&lt;li&gt;沒給驗證條件就「改到好」——一定要指定 test/lint 成功才算完&lt;/ol&gt;&lt;p&gt;探索階段原則：&lt;strong&gt;計畫寫進檔案&lt;/strong&gt;（&lt;code&gt;plan.md&lt;/code&gt;、&lt;code&gt;context.md&lt;/code&gt;），先讀本地，不足再 web，大改前先跟人確認。&lt;h2 id=&quot;安裝與第一次實戰約-10-分鐘&quot;&gt;安裝與第一次實戰（約 10 分鐘）&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;前置&lt;/strong&gt;：Node.js &lt;strong&gt;≥ 22.19.0&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;# 方式 A：官方 npm（方便鎖版本）&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; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; --ignore-scripts @earendil-works/pi-coding-agent

&lt;span class=&quot;token comment&quot;&gt;# 方式 B：macOS / Linux 一鍵腳本&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://pi.dev/install.sh &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;確認：&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;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# ≥ 22.19.0&lt;/span&gt;
pi &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;~/.pi/agent/auth.json&lt;/code&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;cd&lt;/span&gt; /path/to/your-sandbox-project   &lt;span class=&quot;token comment&quot;&gt;# 先用可弄髒的 side project&lt;/span&gt;
pi
/login&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;支援 Claude / ChatGPT / Copilot 訂閱 OAuth，或各廠 API Key。CI 可用環境變數，例如 &lt;code&gt;export ANTHROPIC_API_KEY=...&lt;/code&gt;。&lt;p&gt;第一次驗證：&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Summarize this repository and tell me how to run its checks.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;進階試試：&lt;code&gt;@README.md&lt;/code&gt; 附加檔案、&lt;code&gt;!npm run lint&lt;/code&gt; 跑 shell、&lt;code&gt;pi -p &amp;quot;Summarize&amp;quot;&lt;/code&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;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pi: command not found&lt;/code&gt;&lt;td&gt;確認 npm global &lt;code&gt;bin&lt;/code&gt; 在 PATH&lt;tr&gt;&lt;td&gt;沒 API key&lt;td&gt;在 Pi 內 &lt;code&gt;/login&lt;/code&gt; 或設 env&lt;tr&gt;&lt;td&gt;AI 亂改重要檔&lt;td&gt;用 sandbox repo + &lt;code&gt;AGENTS.md&lt;/code&gt; 限制&lt;tr&gt;&lt;td&gt;聊越久越糊&lt;td&gt;&lt;code&gt;/compact&lt;/code&gt; 或 &lt;code&gt;/new&lt;/code&gt;&lt;tr&gt;&lt;td&gt;想要 MCP 但沒有&lt;td&gt;&lt;code&gt;pi install npm:pi-mcp-adapter&lt;/code&gt;&lt;/table&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;&gt;Pi Coding Agent&lt;/a&gt;&lt;/strong&gt;&lt;td&gt;想控 context、終端 workflow、SDK 嵌入&lt;td&gt;極簡四工具 + 按需擴充，&lt;strong&gt;本文明星推薦&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;td&gt;日常 IDE 多檔編輯、UI 調整&lt;td&gt;索引與預覽強，跟 Pi 互補而非互斥&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;td&gt;Anthropic 訂閱深度使用者&lt;td&gt;終端 Agent，內建功能較多、較 opinionated&lt;tr&gt;&lt;td&gt;&lt;strong&gt;pi-mcp-adapter&lt;/strong&gt;&lt;td&gt;要用 MCP 又怕 context 爆炸&lt;td&gt;Pi 生態 MCP 首選&lt;tr&gt;&lt;td&gt;&lt;strong&gt;pi-subagents&lt;/strong&gt;&lt;td&gt;需要 scout/reviewer 鏈&lt;td&gt;補 Pi 不內建子代理的缺口&lt;/table&gt;&lt;p&gt;延伸閱讀：&lt;a href=&quot;https://pi.dev/docs/latest/quickstart&quot;&gt;Pi Quickstart&lt;/a&gt;、&lt;a href=&quot;https://pi.dev/docs/latest/concepts/extensibility&quot;&gt;Extensibility 文件&lt;/a&gt;、&lt;a href=&quot;https://pi.dev/packages&quot;&gt;Pi Packages 目錄&lt;/a&gt;。&lt;h2 id=&quot;結語回歸極簡,但別回歸低效&quot;&gt;結語：回歸極簡，但別回歸低效&lt;/h2&gt;&lt;p&gt;Pi Coding Agent 重新定義了「AI 助手該怎麼存在於開發流程裡」——不試圖接管整個 IDE，而是當一個&lt;strong&gt;快、可配置、可版本控制&lt;/strong&gt;的終端夥伴。&lt;p&gt;三個 takeaway：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;極簡核心&lt;/strong&gt;（四工具）換來 token 效率與完整上下文控制權&lt;li&gt;&lt;strong&gt;能力按需加&lt;/strong&gt;（Packages / Skills / Extensions），不要一開始裝滿&lt;li&gt;&lt;strong&gt;跟 Cursor 分工&lt;/strong&gt;：IDE 改 UI、Pi 跑終端批次與實驗——同一 worktree 別兩邊同時寫&lt;/ol&gt;&lt;p&gt;若你厭倦了沉重、黑盒、硬塞工作流的 AI 工具，建議先用 sandbox 專案試一輪：&lt;strong&gt;到 &lt;a href=&quot;https://pi.dev/&quot;&gt;pi.dev&lt;/a&gt; 安裝 → &lt;code&gt;/login&lt;/code&gt; → 寫一份 &lt;code&gt;AGENTS.md&lt;/code&gt; → 跑一個小任務驗證四工具閉環&lt;/strong&gt;。覺得順了，再按需加 &lt;code&gt;pi-mcp-adapter&lt;/code&gt; 與 &lt;code&gt;pi-subagents&lt;/code&gt;。</content>
  </entry>
  <entry>
    <title>PageSpeed Insights 與 Core Web Vitals 2026 完全指南</title>
    <link href="https://kamadiam.com/pagespeed-core-web-vitals/" />
    <updated>2026-07-07T02:00:00Z</updated>
    <id>https://kamadiam.com/pagespeed-core-web-vitals/</id>
    <content type="html">&lt;p&gt;網站速度不只影響使用者體驗，也與 Google 搜尋排名相關。要衡量與改善效能，&lt;strong&gt;PageSpeed Insights（PSI）&lt;/strong&gt; 仍是最常用的免費工具——但 2024 年後 Core Web Vitals 已從 FID 改為 &lt;strong&gt;INP&lt;/strong&gt;，很多人還在用舊觀念解讀分數。&lt;p&gt;本文整理 2026 年門檻、實地數據（CrUX）與實驗室數據（Lighthouse）的差異，以及 WordPress／靜態網站各自該優先處理什麼。若你只想先動手，可直接跳到「30 分鐘優化 Checklist」。&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/pagespeed-core-web-vitals/#PageSpeed-Insights-%E6%98%AF%E4%BB%80%E9%BA%BC&quot;&gt;PageSpeed Insights 是什麼&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#Core-Web-Vitals-2026%E4%B8%89%E9%A0%85%E6%8C%87%E6%A8%99%E8%88%87%E9%96%80%E6%AA%BB&quot;&gt;Core Web Vitals 2026：三項指標與門檻&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#%E5%AF%A6%E5%9C%B0%E6%95%B8%E6%93%9A-vs-Lighthouse%E8%A9%B2%E4%BF%A1%E5%93%AA%E5%80%8B&quot;&gt;實地數據 vs Lighthouse：該信哪個&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#30-%E5%88%86%E9%90%98%E5%84%AA%E5%8C%96-Checklist&quot;&gt;30 分鐘優化 Checklist&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#WordPress-%E7%AB%99%E7%9A%84%E5%B8%B8%E8%A6%8B%E8%B7%AF%E5%BE%91&quot;&gt;WordPress 站的常見路徑&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#%E5%B7%A5%E5%85%B7%E5%B0%8D%E7%85%A7%E8%A1%A8&quot;&gt;工具對照表&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#%E5%B8%B8%E8%A6%8B%E8%BF%B7%E6%80%9D&quot;&gt;常見迷思&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pagespeed-core-web-vitals/#%E7%B5%90%E8%AA%9E&quot;&gt;結語&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;PageSpeed-Insights-是什麼&quot;&gt;PageSpeed Insights 是什麼&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt; 是 Google 提供的免費網頁效能檢測工具，輸入網址即可取得：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;實地數據（Field Data）&lt;/strong&gt;：來自 &lt;a href=&quot;https://developer.chrome.com/docs/crux&quot;&gt;Chrome User Experience Report（CrUX）&lt;/a&gt;，反映真實使用者在過去 28 天內的體驗。&lt;li&gt;&lt;strong&gt;實驗室數據（Lab Data）&lt;/strong&gt;：由 Lighthouse 在模擬環境中跑分，適合診斷「為什麼慢」，但不等於搜尋排名依據。&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;重點&lt;/strong&gt;：Google 評估 Core Web Vitals 是否達標，看的是 &lt;strong&gt;實地數據第 75 百分位數（p75）&lt;/strong&gt;，不是 Lighthouse 分數。Lighthouse 90 分但 CrUX 顯示「需要改善」的情況很常見。&lt;h2 id=&quot;Core-Web-Vitals-2026三項指標與門檻&quot;&gt;Core Web Vitals 2026：三項指標與門檻&lt;/h2&gt;&lt;p&gt;2024 年 3 月起，&lt;strong&gt;INP（Interaction to Next Paint）&lt;/strong&gt; 正式取代 FID，成為互動性指標。目前三項 Core Web Vitals 如下：&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指標&lt;th&gt;衡量面向&lt;th&gt;良好（Good）&lt;th&gt;需要改善&lt;th&gt;不佳（Poor）&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LCP&lt;/strong&gt; 最大內容繪製&lt;td&gt;載入速度&lt;td&gt;≤ 2.5 秒&lt;td&gt;2.5–4.0 秒&lt;td&gt;&amp;gt; 4.0 秒&lt;tr&gt;&lt;td&gt;&lt;strong&gt;INP&lt;/strong&gt; 互動至下次繪製&lt;td&gt;互動回應&lt;td&gt;≤ 200 毫秒&lt;td&gt;200–500 毫秒&lt;td&gt;&amp;gt; 500 毫秒&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLS&lt;/strong&gt; 累積版面位移&lt;td&gt;視覺穩定&lt;td&gt;≤ 0.1&lt;td&gt;0.1–0.25&lt;td&gt;&amp;gt; 0.25&lt;/table&gt;&lt;p&gt;要通過 Core Web Vitals 評估，&lt;strong&gt;三項指標必須同時&lt;/strong&gt;在「良好」門檻內（p75）。任一項落在「需要改善」或「不佳」，整體即視為未通過。&lt;h3 id=&quot;LCP最大內容繪製&quot;&gt;LCP：最大內容繪製&lt;/h3&gt;&lt;p&gt;LCP 測量頁面主要內容（通常是 hero 圖、大標題或主要文字區塊）出現在螢幕上的時間。&lt;p&gt;&lt;strong&gt;常見拖慢原因&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;伺服器回應慢（TTFB 過高）&lt;li&gt;未壓縮或未預載的大圖&lt;li&gt;阻塞渲染的 CSS / JavaScript&lt;li&gt;字型載入延遲&lt;/ul&gt;&lt;p&gt;PSI 近年提供 &lt;strong&gt;LCP 子項目診斷&lt;/strong&gt;（TTFB、資源載入延遲、元素渲染延遲），可快速判斷瓶頸在伺服器還是前端。&lt;h3 id=&quot;INP取代-FID-的互動指標&quot;&gt;INP：取代 FID 的互動指標&lt;/h3&gt;&lt;p&gt;舊版 &lt;strong&gt;FID&lt;/strong&gt; 只量測「第一次」互動的延遲；&lt;strong&gt;INP&lt;/strong&gt; 則看頁面上&lt;strong&gt;所有互動&lt;/strong&gt;中最慢的一次，更能反映整體操作流暢度。&lt;p&gt;&lt;strong&gt;常見拖慢原因&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;過多或過大的 JavaScript（長任務 &amp;gt; 50ms）&lt;li&gt;第三方腳本（廣告、追蹤、聊天外掛）&lt;li&gt;主執行緒被同步運算佔用&lt;/ul&gt;&lt;p&gt;診斷建議：用 Chrome DevTools → Performance 錄製，在手機模擬模式下點擊選單、按鈕、表單，找出最慢的互動。&lt;h3 id=&quot;CLS累積版面位移&quot;&gt;CLS：累積版面位移&lt;/h3&gt;&lt;p&gt;CLS 衡量版面在載入過程中「意外跳動」的程度，例如廣告插入、圖片沒預留高度、字型切換（FOIT/FOUT）。&lt;p&gt;&lt;strong&gt;修正方向&lt;/strong&gt;：&lt;ul&gt;&lt;li&gt;圖片與影片設定 &lt;code&gt;width&lt;/code&gt; / &lt;code&gt;height&lt;/code&gt; 或 &lt;code&gt;aspect-ratio&lt;/code&gt;&lt;li&gt;廣告與嵌入內容預留固定空間&lt;li&gt;使用 &lt;code&gt;font-display: swap&lt;/code&gt; 並搭配相近的 fallback 字型&lt;/ul&gt;&lt;h2 id=&quot;實地數據-vs-Lighthouse該信哪個&quot;&gt;實地數據 vs Lighthouse：該信哪個&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;th&gt;實地數據（CrUX）&lt;th&gt;實驗室數據（Lighthouse）&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;資料來源&lt;td&gt;真實 Chrome 使用者&lt;td&gt;模擬裝置與網路&lt;tr&gt;&lt;td&gt;用途&lt;td&gt;判斷是否達 CWV 門檻&lt;td&gt;找出具體優化項目&lt;tr&gt;&lt;td&gt;更新頻率&lt;td&gt;約 28 天滾動窗口&lt;td&gt;每次重新分析即時&lt;tr&gt;&lt;td&gt;新站 / 低流量站&lt;td&gt;可能顯示「沒有足夠資料」&lt;td&gt;仍可取得分數&lt;/table&gt;&lt;p&gt;&lt;strong&gt;實務流程&lt;/strong&gt;：&lt;ol&gt;&lt;li&gt;先看 Search Console →「體驗」→ Core Web Vitals 報表（整站概況）。&lt;li&gt;對問題 URL 跑 PSI，確認實地數據哪一項未達標。&lt;li&gt;往下捲看 Lighthouse「診斷」與「建議」，逐項修復。&lt;li&gt;部署後等待 CrUX 更新（通常需數週）再驗證。&lt;/ol&gt;&lt;h2 id=&quot;30-分鐘優化-Checklist&quot;&gt;30 分鐘優化 Checklist&lt;/h2&gt;&lt;p&gt;依影響力由高到低排列，適合多數內容型網站：&lt;h3 id=&quot;伺服器與快取優先&quot;&gt;伺服器與快取（優先）&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 啟用 HTTPS 與 HTTP/2 / HTTP/3&lt;li&gt;[ ] 使用 CDN 或邊緣快取&lt;li&gt;[ ] WordPress 站：啟用全頁快取（LiteSpeed Cache、WP Rocket 或主機內建快取）&lt;li&gt;[ ] 靜態站：確認託管商有邊緣快取（如 Cloudflare、Netlify）&lt;/ul&gt;&lt;h3 id=&quot;圖片與字型&quot;&gt;圖片與字型&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 轉換為 WebP / AVIF，並設定適當尺寸&lt;li&gt;[ ] 對 LCP 圖片使用 &lt;code&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot;&amp;gt;&lt;/code&gt;&lt;li&gt;[ ] 字型子集化，避免載入整個字型家族&lt;/ul&gt;&lt;h3 id=&quot;JavaScript-與-CSS&quot;&gt;JavaScript 與 CSS&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 延遲載入非關鍵 JS（&lt;code&gt;defer&lt;/code&gt; / &lt;code&gt;async&lt;/code&gt;）&lt;li&gt;[ ] 移除未使用的 CSS 與外掛腳本&lt;li&gt;[ ] 審查第三方腳本（GA、廣告、社群外掛）&lt;/ul&gt;&lt;h3 id=&quot;版面穩定&quot;&gt;版面穩定&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;[ ] 所有媒體元素預留尺寸&lt;li&gt;[ ] 避免在首屏上方動態插入橫幅&lt;/ul&gt;&lt;h2 id=&quot;WordPress-站的常見路徑&quot;&gt;WordPress 站的常見路徑&lt;/h2&gt;&lt;p&gt;若你使用 WordPress，效能優化通常分三層：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;主機&lt;/strong&gt;：優先選支援 HTTP/2／HTTP/3、物件快取，或 LiteSpeed／同等高效 Web Server 的方案。&lt;li&gt;&lt;strong&gt;快取外掛&lt;/strong&gt;：全頁快取、圖片 WebP／延遲載入、CSS／JS 延遲；Guest Mode 類功能可加速未登入訪客。&lt;li&gt;&lt;strong&gt;內容&lt;/strong&gt;：精簡外掛、媒體庫定期清理「尚無關聯」圖檔（先備份）、避免首屏塞過多第三方腳本。&lt;/ol&gt;&lt;p&gt;若考慮脫離 WordPress 的維護成本，可參考 &lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/&quot;&gt;WordPress vs Eleventy&lt;/a&gt; 的遷移經驗——靜態站天生在 LCP 與 INP 上有結構優勢。遷移內容時可用 &lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/&quot;&gt;eleventy-import&lt;/a&gt;（或先從 WP 匯出 WXR 再轉換）。&lt;h3 id=&quot;轉址與重複內容簡記&quot;&gt;轉址與重複內容（簡記）&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;改版或刪文後，用主機 Redirects／&lt;code&gt;.htaccess&lt;/code&gt; 做 &lt;strong&gt;301&lt;/strong&gt;，避免 404 流失權重。&lt;li&gt;多篇搶同一關鍵字時，合併成一篇支柱文並把舊 URL 301 過來，比硬留薄文更有效。&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;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;td&gt;實地 + 實驗室&lt;td&gt;單頁快速檢測&lt;tr&gt;&lt;td&gt;Google Search Console&lt;td&gt;實地（整站）&lt;td&gt;監控通過率與問題 URL&lt;tr&gt;&lt;td&gt;Chrome DevTools → Performance&lt;td&gt;實驗室&lt;td&gt;深入追蹤 INP / 長任務&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/GoogleChrome/web-vitals&quot;&gt;web-vitals&lt;/a&gt; JS 函式庫&lt;td&gt;自訂 RUM&lt;td&gt;送 GA4 做長期監控&lt;/table&gt;&lt;h2 id=&quot;常見迷思&quot;&gt;常見迷思&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：Lighthouse 滿分就代表 SEO 沒問題？&lt;/strong&gt;&lt;br&gt;A：不一定。Lighthouse 是實驗室環境；排名相關的是 CrUX 實地數據。兩者都要看。&lt;p&gt;&lt;strong&gt;Q：FID 還會出現在 PSI 嗎？&lt;/strong&gt;&lt;br&gt;A：部分舊報表或診斷可能仍提及 FID，但 &lt;strong&gt;Core Web Vitals 評估已改用 INP&lt;/strong&gt;。優化時以 INP 為準。&lt;p&gt;&lt;strong&gt;Q：新站沒有 CrUX 資料怎麼辦？&lt;/strong&gt;&lt;br&gt;A：先用 Lighthouse 修到合理分數，上線累積流量後再依 Search Console 調整。流量極低的頁面可能長期沒有實地數據，這是正常現象。&lt;p&gt;&lt;strong&gt;Q：改完多久才會在 PSI 看到改善？&lt;/strong&gt;&lt;br&gt;A：Lighthouse 即時反映；CrUX 實地數據通常需 &lt;strong&gt;數週&lt;/strong&gt; 才會更新。&lt;h2 id=&quot;結語&quot;&gt;結語&lt;/h2&gt;&lt;p&gt;2026 年解讀 PageSpeed Insights 的關鍵字是：&lt;strong&gt;實地數據優先、INP 取代 FID、三項同時達標&lt;/strong&gt;。先把 LCP 與伺服器/快取处理好，再處理 JavaScript 對 INP 的影響，最後補 CLS 的版面預留——這個順序在多數部落格與內容站上最省時間。&lt;p&gt;若你的 WordPress 站 LCP 長期卡在「需要改善」，先從主機快取與圖片著手；若已考慮遷移靜態站，本站 &lt;a href=&quot;https://kamadiam.com/11ty-generator/&quot;&gt;11ty 入門教學&lt;/a&gt; 可作為下一步參考。</content>
  </entry>
  <entry>
    <title>把文章從 WordPress 搬出來：eleventy-import 的匯出方式</title>
    <link href="https://kamadiam.com/11ty-import-tutorial/" />
    <updated>2025-12-15T10:00:00Z</updated>
    <id>https://kamadiam.com/11ty-import-tutorial/</id>
    <content type="html">&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-import-tutorial/#eleventy-import,%E7%B5%82%E6%96%BC%E5%8F%AF%E4%BB%A5%E6%8A%8A-WordPress-%E8%B3%87%E6%96%99%E5%A5%BD%E5%A5%BD%E6%90%AC%E5%87%BA%E4%BE%86&quot;&gt;eleventy-import，終於可以把 WordPress 資料好好搬出來&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%AE%98%E6%96%B9%E5%87%BA%E6%89%8B11ty-%E7%9A%84-WordPress-%E8%BD%89%E7%A7%BB%E6%95%99%E5%AD%B8&quot;&gt;官方出手：11ty 的 WordPress 轉移教學&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E4%BD%BF%E7%94%A8-eleventy-import-%E5%8C%AF%E5%87%BA-WordPress-%E6%96%87%E7%AB%A0&quot;&gt;使用 eleventy-import 匯出 WordPress 文章&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%8C%AF%E5%87%BA%E5%BE%8C%E7%9A%84%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B&quot;&gt;匯出後的目錄結構&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E4%B8%8B%E4%B8%80%E6%AD%A5%E9%81%B8%E6%93%87-11ty-Starter&quot;&gt;下一步：選擇 11ty Starter&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E6%9C%80%E5%BE%8C%E9%81%B8%E6%93%87&quot;&gt;最後選擇&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%95%9F%E5%8B%95-11ty,%E9%A9%97%E6%94%B6%E6%88%90%E6%9E%9C&quot;&gt;啟動 11ty，驗收成果&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E5%BE%9E%E9%80%99%E4%B8%80%E5%88%BB%E8%B5%B7,%E6%98%AF%E5%85%A8%E6%96%B0%E7%9A%84%E9%96%8B%E5%A7%8B&quot;&gt;從這一刻起，是全新的開始&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;老實說，&lt;strong&gt;從 WordPress 轉移到其他系統，最痛苦的永遠不是選框架，而是「資料怎麼搬」&lt;/strong&gt;。&lt;p&gt;這點大家應該都心有戚戚焉。&lt;h2 id=&quot;eleventy-import,終於可以把-WordPress-資料好好搬出來&quot;&gt;eleventy-import，終於可以把 WordPress 資料好好搬出來&lt;/h2&gt;&lt;p&gt;11ty 的作者真的很懂這個痛點，直接自己寫了一個官方匯入工具：&lt;strong&gt;eleventy-import&lt;/strong&gt;。&lt;p&gt;在真正遇到它之前，我其實也走過不少冤枉路。&lt;p&gt;一開始的想法很直覺：&lt;p&gt;👉 用 WordPress 外掛把文章匯出成 Markdown，再慢慢整理。&lt;p&gt;問題是——事情完全沒那麼單純。&lt;h3 id=&quot;為什麼一般-WordPress-匯出方式這麼痛苦?&quot;&gt;為什麼一般 WordPress 匯出方式這麼痛苦？&lt;/h3&gt;&lt;p&gt;之前試過幾個 WordPress 匯出外掛，產生出來的檔案大多有這些問題：&lt;ul&gt;&lt;li&gt;夾雜大量 &lt;strong&gt;WordPress 專用標籤&lt;/strong&gt;&lt;li&gt;各種外掛留下來的 &lt;strong&gt;短代碼（shortcode）&lt;/strong&gt;&lt;li&gt;XML / HTML 混在一起，格式不統一&lt;li&gt;有的圖片是外掛語法，還有各種奇怪的包法&lt;/ul&gt;&lt;p&gt;最麻煩的是：&lt;p&gt;👉 &lt;strong&gt;這些雜物沒有固定格式，根本沒辦法用一支 script 全部清乾淨&lt;/strong&gt;&lt;p&gt;每篇文章都像在開盲盒，例外狀況多到讓人直接放棄。&lt;p&gt;於是這件事就這樣被擱著了。&lt;h2 id=&quot;官方出手11ty-的-WordPress-轉移教學&quot;&gt;官方出手：11ty 的 WordPress 轉移教學&lt;/h2&gt;&lt;p&gt;直到有一天，在 11ty 官網亂逛時，看到這一頁：&lt;p&gt;👉 https://www.11ty.dev/docs/migrate/wordpress/&lt;p&gt;不只寫了完整教學，&lt;strong&gt;作者本人還拍了一支影片，標題是「Escape From WordPress」&lt;/strong&gt;，整個就是用意非常明顯 😂&lt;p&gt;影片在這裡：&lt;p&gt;https://www.youtube.com/watch?v=WuH5QYCdh6w&lt;p&gt;看到這裡才發現：&lt;p&gt;👉 原來 11ty 早就把「從 WordPress 逃離」這件事想好了。&lt;hr&gt;&lt;h2 id=&quot;使用-eleventy-import-匯出-WordPress-文章&quot;&gt;&lt;strong&gt;使用 eleventy-import 匯出 WordPress 文章&lt;/strong&gt;&lt;/h2&gt;&lt;h3 id=&quot;直接執行一行指令&quot;&gt;&lt;strong&gt;直接執行一行指令&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;使用方式非常暴力，也非常爽快：&lt;pre&gt;&lt;code&gt;npx @11ty/import wordpress https://your-site.com/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者如果習慣 pnpm&lt;pre&gt;&lt;code&gt;pnpm dlx @11ty/import wordpress https://your-site.com/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;第一次看到這行指令的反應是：&lt;blockquote&gt;&lt;p&gt;不是吧？就這樣？&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;沒了？&lt;/blockquote&gt;&lt;p&gt;結果真的就 &lt;strong&gt;完成了，YA。&lt;/strong&gt;&lt;h2 id=&quot;匯出後的目錄結構&quot;&gt;&lt;strong&gt;匯出後的目錄結構&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;eleventy-import 會直接幫你輸出成 &lt;strong&gt;11ty 最愛的格式&lt;/strong&gt;：&lt;pre&gt;&lt;code&gt;your_project/
  assets/
    image1
    image2

  article1.md
  article2.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;幾個我覺得「非常關鍵」的點：&lt;ul&gt;&lt;li&gt;每一篇文章都是 &lt;strong&gt;乾淨的 Markdown&lt;/strong&gt;&lt;li&gt;所有圖片自動整理進 assets/ 目錄&lt;li&gt;文章內的圖片連結也已經幫你改好&lt;li&gt;幾乎沒有 WordPress 遺毒&lt;/ul&gt;&lt;p&gt;一句話總結：&lt;p&gt;👉 &lt;strong&gt;這個輸出結果，完全就是為了「直接丟進 11ty」而設計的。&lt;/strong&gt;&lt;h2 id=&quot;下一步選擇-11ty-Starter&quot;&gt;&lt;strong&gt;下一步：選擇 11ty Starter&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;文章資料已經乾乾淨淨了，接下來就是選一個起始專案。&lt;h3 id=&quot;eleventy-base-blog&quot;&gt;eleventy-base-blog&lt;/h3&gt;&lt;p&gt;GitHub：&lt;p&gt;&lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot; target=&quot;_blank&quot;&gt;eleventy-base&lt;/a&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;官方範例，結構清楚&lt;li&gt;幾乎沒有多餘抽象&lt;li&gt;非常適合「想自己慢慢加功能」的人&lt;li&gt;好改、不綁架設計&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;功能極簡&lt;li&gt;SEO、樣式、搜尋、圖片優化都要自己補&lt;li&gt;一開始看起來有點「什麼都沒有」&lt;/ul&gt;&lt;h3 id=&quot;eleventy-excellent&quot;&gt;&lt;strong&gt;eleventy-excellent&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;網站：&lt;p&gt;&lt;a href=&quot;https://eleventy-excellent.netlify.app/&quot; target=&quot;_blank&quot;&gt;eleventy-excellent&lt;/a&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;幾乎什麼都幫你準備好了&lt;li&gt;包含 SEO、圖片處理、效能最佳化&lt;li&gt;設計完成度高，很快就能上線&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;設計與架構選擇比較多是「作者的想法」&lt;li&gt;想大改時，需要先理解一整套設計哲學&lt;li&gt;對我來說，反而有點太滿了&lt;/ul&gt;&lt;h2 id=&quot;最後選擇&quot;&gt;&lt;strong&gt;最後選擇&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;一開始其實是用 &lt;strong&gt;eleventy-excellent&lt;/strong&gt;，因為真的很省事。&lt;p&gt;但實際調整一陣子後發現：&lt;p&gt;👉 &lt;strong&gt;一定會有一些地方「不是自己想要的方式」&lt;/strong&gt;&lt;p&gt;而要改動那些地方，反而得先拆作者原本的設計。&lt;p&gt;最後決定回頭選擇 &lt;strong&gt;eleventy-base-blog&lt;/strong&gt;：&lt;blockquote&gt;&lt;p&gt;從最簡單的開始，&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;需要什麼，再一個一個加。&lt;/blockquote&gt;&lt;h2 id=&quot;啟動-11ty,驗收成果&quot;&gt;&lt;strong&gt;啟動 11ty，驗收成果&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;把剛剛匯出的文章與 assets 目錄，放進：&lt;pre&gt;&lt;code&gt;content/blog/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後啟動專案：&lt;pre&gt;&lt;code&gt;pnpm run start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;打開瀏覽器，直接進：&lt;pre&gt;&lt;code&gt;http://localhost:8080/文章名稱/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;你會看到一件很神奇的事：&lt;ul&gt;&lt;li&gt;文章內容完整&lt;li&gt;圖片全部正常&lt;li&gt;但樣式幾乎全沒了&lt;/ul&gt;&lt;p&gt;這一刻這是感動萬分！。&lt;p&gt;因為這代表：&lt;p&gt;👉 &lt;strong&gt;資料真的已經完全脫離 WordPress 了。&lt;/strong&gt;&lt;p&gt;若你還在 WordPress 端，也可先用後台「工具 → 匯出」產生 &lt;strong&gt;WXR&lt;/strong&gt;，再轉成 Markdown；本站實務路線是直接用 &lt;code&gt;eleventy-import&lt;/code&gt; 一次帶走文章與圖片。&lt;h2 id=&quot;從這一刻起,是全新的開始&quot;&gt;&lt;strong&gt;從這一刻起，是全新的開始&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;這樣的網站：&lt;ul&gt;&lt;li&gt;快到不行，幾乎是秒開&lt;li&gt;什麼功能都沒有&lt;li&gt;但結構乾淨、可控、沒有包袱&lt;/ul&gt;&lt;p&gt;這就是取捨啊。&lt;p&gt;WordPress 的功能真的很方便，&lt;p&gt;但當你選擇 11ty，簡單也不是壞事。&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;用效能、掌控感，交換即插即用的便利性。&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;接下來，才是真正有趣的地方。我想要網站愈來愈有趣，而不是愈來愈失去興趣。</content>
  </entry>
  <entry>
    <title>WordPress vs Eleventy：我為什麼把部落格遷到 11ty</title>
    <link href="https://kamadiam.com/wordpress-vs-11ty/" />
    <updated>2025-12-08T10:00:00Z</updated>
    <id>https://kamadiam.com/wordpress-vs-11ty/</id>
    <content type="html">&lt;p&gt;WordPress 作為全球最受歡迎的內容管理系統，已經幫助數百萬人建立了自己的網站。然而，近年來靜態網站生成器如 11ty 也逐漸受到開發者和內容創作者的青睞。這兩種工具各有優缺點，選擇哪一個取決於你的需求、技術背景和維護意願。&lt;p&gt;本文將比較 WordPress 與 11ty，從多個面向分析兩者的差異，幫助你做出最適合的選擇。&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/wordpress-vs-11ty/#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E8%88%87%E5%AE%9A%E4%BD%8D&quot;&gt;基本概念與定位&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E4%B8%BB%E8%A6%81%E5%B7%AE%E7%95%B0%E6%AF%94%E8%BC%83&quot;&gt;主要差異比較&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%81%A9%E5%90%88%E7%9A%84%E4%BD%BF%E7%94%A8%E6%83%85%E5%A2%83&quot;&gt;適合的使用情境&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%AF%A6%E9%9A%9B%E6%A1%88%E4%BE%8B%E5%88%86%E6%9E%90&quot;&gt;實際案例分析&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%81%B7%E7%A7%BB%E8%88%87%E8%BD%89%E6%8F%9B%E8%80%83%E9%87%8F&quot;&gt;遷移與轉換考量&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E7%B5%90%E8%AB%96%E6%B2%92%E6%9C%89%E7%B5%95%E5%B0%8D%E7%9A%84%E3%80%8C%E6%9C%80%E5%A5%BD%E3%80%8D&quot;&gt;結論：沒有絕對的「最好」&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;基本概念與定位&quot;&gt;基本概念與定位&lt;/h2&gt;&lt;h3 id=&quot;WordPress成熟的全功能-CMS&quot;&gt;WordPress：成熟的全功能 CMS&lt;/h3&gt;&lt;p&gt;WordPress 是一個功能完整的內容管理系統，提供完整的後端管理介面、資料庫儲存、動態內容生成等功能。它最初設計為部落格平台，但現在已經演變成一個全功能的 CMS，可以建立任何類型的網站。&lt;h3 id=&quot;11ty現代化的靜態網站生成器&quot;&gt;11ty：現代化的靜態網站生成器&lt;/h3&gt;&lt;p&gt;11ty（Eleventy）是一個以 JavaScript 為基礎的靜態網站生成器。它不依賴資料庫，而是將內容檔案轉換為靜態 HTML 檔案，在建置時生成完整網站。&lt;h2 id=&quot;主要差異比較&quot;&gt;主要差異比較&lt;/h2&gt;&lt;h3 id=&quot;技術架構&quot;&gt;技術架構&lt;/h3&gt;&lt;h4 id=&quot;WordPress-的動態架構&quot;&gt;WordPress 的動態架構&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;資料庫驅動&lt;/strong&gt;：所有內容都儲存在 MySQL/PostgreSQL 等資料庫中&lt;li&gt;&lt;strong&gt;動態生成&lt;/strong&gt;：每次頁面請求時，PHP 會從資料庫提取資料並動態生成 HTML&lt;li&gt;&lt;strong&gt;依賴關係&lt;/strong&gt;：需要 PHP 運行環境、資料庫伺服器、Web 伺服器（如 Apache/Nginx）&lt;/ul&gt;&lt;h4 id=&quot;11ty-的靜態架構&quot;&gt;11ty 的靜態架構&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;檔案驅動&lt;/strong&gt;：內容以 Markdown、HTML 等檔案格式儲存&lt;li&gt;&lt;strong&gt;預先建置&lt;/strong&gt;：在開發階段就生成所有靜態檔案&lt;li&gt;&lt;strong&gt;獨立部署&lt;/strong&gt;：只需要靜態檔案伺服器，無需資料庫或特定運行環境&lt;/ul&gt;&lt;h3 id=&quot;開發體驗&quot;&gt;開發體驗&lt;/h3&gt;&lt;h4 id=&quot;WordPress視覺化編輯優先&quot;&gt;WordPress：視覺化編輯優先&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&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;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;學習曲線&lt;/strong&gt;：雖然編輯簡單，但要客製化主題仍需學習 PHP、WordPress Hook 等&lt;li&gt;&lt;strong&gt;外掛相容性&lt;/strong&gt;：不同外掛間可能衝突，需要花時間測試和調試&lt;/ul&gt;&lt;p&gt;(現代 PHP 和 WordPress 也改善很多開發流程和工具了) 參考： &lt;a href=&quot;https://kamadiam.com/herd-wordpress/&quot;&gt;如何使用 Herd 在本機架設 WordPress 網站&lt;/a&gt;&lt;h4 id=&quot;11ty程式化開發體驗&quot;&gt;11ty：程式化開發體驗&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;版本控制友好&lt;/strong&gt;：所有內容和設定都以檔案形式存在，可以用 Git 完整管理&lt;li&gt;&lt;strong&gt;完全客製化&lt;/strong&gt;：從頭到尾控制每一個細節&lt;li&gt;&lt;strong&gt;現代開發工具鏈&lt;/strong&gt;：可以使用 npm scripts、現代 CSS 框架、模組化 JavaScript&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;缺點：&lt;/strong&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;h3 id=&quot;效能表現&quot;&gt;效能表現&lt;/h3&gt;&lt;h4 id=&quot;WordPress需要持續優化&quot;&gt;WordPress：需要持續優化&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;初始載入&lt;/strong&gt;：動態生成內容導致首次載入較慢&lt;li&gt;&lt;strong&gt;快取需求&lt;/strong&gt;：需要安裝快取外掛（如 WP Rocket、LiteSpeed Cache）來改善效能&lt;li&gt;&lt;strong&gt;伺服器負載&lt;/strong&gt;：高流量時需要更多伺服器資源&lt;/ul&gt;&lt;h4 id=&quot;11ty天生高效能&quot;&gt;11ty：天生高效能&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;極快載入&lt;/strong&gt;：純靜態檔案，CDN 快取效果極佳&lt;li&gt;&lt;strong&gt;低伺服器成本&lt;/strong&gt;：可以使用免費的靜態託管服務&lt;li&gt;&lt;strong&gt;無資料庫查詢&lt;/strong&gt;：沒有資料庫延遲問題&lt;/ul&gt;&lt;p&gt;在相同的機器規格上，11ty會消耗較少資源，也不需要資料庫的建置，但你也可以購買專用主機，直接提升效能。&lt;h3 id=&quot;安全性考量&quot;&gt;安全性考量&lt;/h3&gt;&lt;h4 id=&quot;WordPress常見攻擊目標&quot;&gt;WordPress：常見攻擊目標&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;風險點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;外掛漏洞&lt;/strong&gt;：許多安全性問題來自過時或有漏洞的外掛&lt;li&gt;&lt;strong&gt;PHP 環境&lt;/strong&gt;：動態執行的本質帶來更多攻擊面&lt;li&gt;&lt;strong&gt;資料庫安全&lt;/strong&gt;：需要保護資料庫免於攻擊&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&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;h4 id=&quot;11ty本質安全&quot;&gt;11ty：本質安全&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&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;/ul&gt;&lt;p&gt;&lt;strong&gt;考量點：&lt;/strong&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;11ty 的好處是沒有後台登入功能，會被破解的地方就是主機本身，如果主機使用不夠安全，用什麼架構都一樣不安全。&lt;h3 id=&quot;維護成本與複雜度&quot;&gt;維護成本與複雜度&lt;/h3&gt;&lt;h4 id=&quot;WordPress持續維護需求高&quot;&gt;WordPress：持續維護需求高&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;定期任務：&lt;/strong&gt;&lt;ul&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;li&gt;&lt;strong&gt;備份管理&lt;/strong&gt;：資料庫和檔案的備份策略&lt;/ul&gt;&lt;p&gt;雖然都很簡單的定期更新，就是很繁雜，但外掛版本和 WordPress 版本和 PHP 版本之間的相容性需要考量。&lt;h4 id=&quot;11ty一次性設定,長期穩定&quot;&gt;11ty：一次性設定，長期穩定&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;維護內容：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;內容更新&lt;/strong&gt;：只需要編輯 Markdown 檔案&lt;li&gt;&lt;strong&gt;相依性更新&lt;/strong&gt;：偶爾更新 npm 套件&lt;li&gt;&lt;strong&gt;重新部署&lt;/strong&gt;：修改後重新建置和部署&lt;/ul&gt;&lt;h3 id=&quot;內容管理與協作&quot;&gt;內容管理與協作&lt;/h3&gt;&lt;h4 id=&quot;WordPress多人協作友好&quot;&gt;WordPress：多人協作友好&lt;/h4&gt;&lt;ul&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;/ul&gt;&lt;p&gt;以我個人的情境來說（主要是一人維護與發文），WordPress 的角色權限與協作流程屬於「用得到很強，用不到就比較像是額外的系統功能」。相對地，我更在意的是內容變更是否能被精準追蹤與回溯。&lt;p&gt;而且你也很難追蹤另一個 WordPress 使用者動了什麼東西，改了什麼設定。&lt;h4 id=&quot;11ty開發者導向協作&quot;&gt;11ty：開發者導向協作&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Git 工作流程&lt;/strong&gt;：任何微小變動都清清楚楚，輕易追蹤管理版本。&lt;li&gt;&lt;strong&gt;內容即程式碼&lt;/strong&gt;：內容和程式碼使用相同工具管理&lt;li&gt;&lt;strong&gt;版本歷史&lt;/strong&gt;：完整的內容修改歷史記錄&lt;/ul&gt;&lt;h2 id=&quot;適合的使用情境&quot;&gt;適合的使用情境&lt;/h2&gt;&lt;h3 id=&quot;選擇-WordPress-的情境&quot;&gt;選擇 WordPress 的情境&lt;/h3&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;li&gt;&lt;strong&gt;預算有限&lt;/strong&gt;：不想花時間學習技術，希望快速上線&lt;li&gt;&lt;strong&gt;經常變更內容&lt;/strong&gt;：網站內容需要頻繁更新，希望即時生效&lt;/ol&gt;&lt;h3 id=&quot;選擇-11ty-的情境&quot;&gt;選擇 11ty 的情境&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;技術背景使用者&lt;/strong&gt;：熟悉 HTML、CSS、JavaScript，有程式設計基礎&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;li&gt;&lt;strong&gt;個人/小型專案&lt;/strong&gt;：部落格、作品集、文件網站等&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;h3 id=&quot;WordPress-適合案例&quot;&gt;WordPress 適合案例&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;新聞網站&lt;/strong&gt;：需要頻繁更新內容、多個編輯者協作&lt;li&gt;&lt;strong&gt;企業網站&lt;/strong&gt;：需要 CMS 整合、聯絡表單、會員系統&lt;li&gt;&lt;strong&gt;電子商務&lt;/strong&gt;：需要購物車、付款閘道、庫存管理&lt;li&gt;&lt;strong&gt;社群平台&lt;/strong&gt;：需要用戶生成內容、評論系統&lt;/ul&gt;&lt;h3 id=&quot;11ty-適合案例&quot;&gt;11ty 適合案例&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;個人部落格&lt;/strong&gt;：內容創作者專注於寫作而非維護&lt;li&gt;&lt;strong&gt;產品文件&lt;/strong&gt;：技術文件、API 文件等需要版本控制&lt;li&gt;&lt;strong&gt;作品集網站&lt;/strong&gt;：設計師、開發者的個人展示網站&lt;li&gt;&lt;strong&gt;公司官網&lt;/strong&gt;：簡單的企業介紹頁面，重視品牌形象&lt;/ul&gt;&lt;p&gt;事實上 11ty 能做的事，WordPress 都做得到，但選擇 11ty 通常不是太功能上的選擇，很多是想在技術上架構上簡單透明一點。&lt;h2 id=&quot;遷移與轉換考量&quot;&gt;遷移與轉換考量&lt;/h2&gt;&lt;h3 id=&quot;從-WordPress-遷移到-11ty&quot;&gt;從 WordPress 遷移到 11ty&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;大幅改善效能和安全性&lt;li&gt;降低託管成本&lt;li&gt;獲得更多控制權&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;挑戰：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;需要將動態功能改為靜態或外部服務&lt;li&gt;失去所見即所得編輯體驗&lt;li&gt;需要學習新的工作流程&lt;/ul&gt;&lt;h3 id=&quot;從-11ty-遷移到-WordPress&quot;&gt;從 11ty 遷移到 WordPress&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;優點：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;快速增加複雜功能&lt;li&gt;降低內容編輯門檻&lt;li&gt;支援更多非技術使用者&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;挑戰：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;效能下降&lt;li&gt;維護複雜度增加&lt;li&gt;安全性風險提高&lt;/ul&gt;&lt;h2 id=&quot;結論沒有絕對的「最好」&quot;&gt;結論：沒有絕對的「最好」&lt;/h2&gt;&lt;p&gt;WordPress 和 11ty 代表兩種不同的網站建置哲學：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt; 強調易用性和功能完整性，適合需要快速上線、複雜功能、或多人協作的專案&lt;li&gt;&lt;strong&gt;11ty&lt;/strong&gt; 強調效能、安全性和開發體驗，適合技術背景的使用者和重視長期維護的專案&lt;/ul&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;：願意投入多少時間在網站維護上？&lt;li&gt;&lt;strong&gt;成長規劃&lt;/strong&gt;：網站未來可能如何演變？&lt;/ol&gt;&lt;p&gt;建議你可以先評估自己的需求，必要時甚至可以考慮混合使用兩者。例如，使用 11ty 建立主要內容網站，WordPress 作為後台內容管理系統。&lt;p&gt;無論選擇哪一個工具，重點是找到最適合自己工作流程和需求的解決方案。技術工具應該服務於內容創作，而不是成為創作的障礙。&lt;p&gt;WordPress 看很多了，來看看幾個 11ty 的網站&lt;ul&gt;&lt;li&gt;https://chrisburnell.com/&lt;li&gt;https://www.zachleat.com/&lt;li&gt;https://eleventy-excellent.netlify.app/&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;相關資源：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty 官方文件&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://wordpress.org/&quot;&gt;WordPress 官方網站&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://jamstack.org/generators/&quot;&gt;靜態網站生成器比較&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://www.netlify.com/blog/2020/04/14/what-is-a-static-site-generator-and-3-ways-to-find-the-best-one/&quot;&gt;What is a Static Site Generator? And 3 ways to find the best one&lt;/a&gt;&lt;/ul&gt;</content>
  </entry>
</feed>