<?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>光輝咖碼是一個分享網站架設、WordPress、靜態網站生成器、程式開發等技術主題的部落格。提供實用的教學文章和工具介紹，幫助讀者建立和管理自己的網站。</subtitle>
  <link href="https://kamadiam.com/feed/feed.xml" rel="self" />
  <link href="https://kamadiam.com/" />
  <updated>2026-06-30T08:20:00Z</updated>
  <id>https://kamadiam.com/</id>
  <author>
    <name>huihere</name>
  </author>
  <entry>
    <title>Pi Coding Agent：一個為開發者量身打造的極簡終端 AI 程式助手</title>
    <link href="https://kamadiam.com/pi-coding-agent/" />
    <updated>2026-06-30T08:20:00Z</updated>
    <id>https://kamadiam.com/pi-coding-agent/</id>
    <content type="html">&lt;p&gt;隨著大型語言模型（LLM）的快速發展，AI 程式助手（Coding Agents）已成為現代開發者不可或缺的工具。然而，市面上許多 AI 助手往往設計得非常龐大，強加了特定的工作流程（如強制的規劃模式、子代理系統等）。&lt;p&gt;如果你正在尋找一個&lt;strong&gt;極簡、快速、且能完全融入你既有工作流程&lt;/strong&gt;的工具，那麼你一定要認識這款由 Earendil Inc. 開發的終端 AI 助手：&lt;strong&gt;Pi Coding Agent&lt;/strong&gt;（&lt;a href=&quot;https://pi.dev/&quot;&gt;pi.dev&lt;/a&gt;）。&lt;div class=&quot;table-of-contents&quot;&gt;&lt;h2 id=&quot;目錄&quot;&gt;目錄&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/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-Coding-Agent-%E7%9A%84%E5%9B%9B%E5%A4%A7%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F&quot;&gt;Pi Coding Agent 的四大工作模式&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E6%A0%B8%E5%BF%83%E4%BA%AE%E9%BB%9E%E5%8A%9F%E8%83%BD&quot;&gt;核心亮點功能&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#1.-%E7%8D%A8%E7%89%B9%E7%9A%84%E3%80%8CSteer-&amp;-Follow-up%E3%80%8D%E5%8D%B3%E6%99%82%E5%BC%95%E5%B0%8E%E6%A9%9F%E5%88%B6&quot;&gt;1. 獨特的「Steer &amp;amp; Follow-up」即時引導機制&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#2.-%E6%A8%B9%E7%8B%80%E7%B5%90%E6%A7%8B%E7%9A%84%E5%B0%8D%E8%A9%B1%E6%AD%B7%E5%8F%B2%E8%88%87%E5%85%B1%E4%BA%AB&quot;&gt;2. 樹狀結構的對話歷史與共享&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#3.-%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B(Context-Engineering)&quot;&gt;3. 上下文工程（Context Engineering）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E7%82%BA%E4%BB%80%E9%BA%BC-Pi-%E6%B2%92%E6%9C%89%E5%85%A7%E5%BB%BA-MCP%E5%AD%90%E4%BB%A3%E7%90%86%E8%88%87%E8%A6%8F%E5%8A%83%E6%A8%A1%E5%BC%8F?&quot;&gt;為什麼 Pi 沒有內建 MCP、子代理與規劃模式？&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%9D%E8%88%87%E9%96%8B%E5%A7%8B%E4%BD%BF%E7%94%A8-Pi?&quot;&gt;如何安裝與開始使用 Pi？&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#1.-%E4%BD%BF%E7%94%A8-curl-%E5%AE%89%E8%A3%9D(macOS/Linux)&quot;&gt;1. 使用 curl 安裝（macOS/Linux）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/pi-coding-agent/#2.-%E4%BD%BF%E7%94%A8-npm/pnpm/bun-%E5%85%A8%E5%9F%9F%E5%AE%89%E8%A3%9D&quot;&gt;2. 使用 npm/pnpm/bun 全域安裝&lt;/a&gt;&lt;/ul&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%E7%9A%84%E9%96%8B%E7%99%BC%E7%BE%8E%E5%AD%B8&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 程式開發助手。它的核心哲學非常簡單：&lt;blockquote&gt;&lt;p&gt;「這世界上有許多 Agent 框架，但唯有這一個是專屬於你的。」 （There are many agent harnesses, but this one is yours.）&lt;/blockquote&gt;&lt;p&gt;與其要求開發者去適應 AI 工具的規範，Pi 設計的初衷是&lt;strong&gt;讓工具來適應你的既有工作流程&lt;/strong&gt;。它去除了許多不必要的繁雜功能，僅保留最核心的執行邏輯，並透過極度彈性的擴充機制，讓開發者自行定義所需的行為。&lt;h2 id=&quot;Pi-Coding-Agent-的四大工作模式&quot;&gt;Pi Coding Agent 的四大工作模式&lt;/h2&gt;&lt;p&gt;為了適應不同的開發場景，Pi 提供了四種不同的運作模式：&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Interactive（互動模式）&lt;/strong&gt;： 提供完整的 TUI（Terminal User Interface）互動介面，適合日常的對話、除錯與程式碼生成。&lt;li&gt;&lt;strong&gt;Print/JSON（列印與 JSON 模式）&lt;/strong&gt;： 你可以直接在指令列運行例如 &lt;code&gt;pi -p &amp;quot;分析此檔案&amp;quot;&lt;/code&gt;，非常適合用來撰寫自動化腳本。使用 &lt;code&gt;--mode json&lt;/code&gt; 還可以輸出結構化的事件流。&lt;li&gt;&lt;strong&gt;RPC（遠端程序呼叫）&lt;/strong&gt;： 支援透過標準輸入輸出（stdin/stdout）進行 JSON 協議傳輸，便於與非 Node.js 的系統整合。&lt;li&gt;&lt;strong&gt;SDK（軟體開發套件）&lt;/strong&gt;： 允許開發者將 Pi 的核心能力直接嵌入到自己的應用程式中。&lt;/ol&gt;&lt;h2 id=&quot;核心亮點功能&quot;&gt;核心亮點功能&lt;/h2&gt;&lt;h3 id=&quot;1.-獨特的「Steer-&amp;-Follow-up」即時引導機制&quot;&gt;1. 獨特的「Steer &amp;amp; Follow-up」即時引導機制&lt;/h3&gt;&lt;p&gt;在許多 Agent 工具中，一旦按下送出，你只能靜靜等待它跑完所有步驟。如果發現它理解錯了，只能中斷並重來。 Pi 解決了這個痛點：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;即時引導（Steering）&lt;/strong&gt;：在 Agent 運行的過程中，按下 &lt;code&gt;Enter&lt;/code&gt; 即可發送引導訊息。Pi 會在目前工具執行完畢後立即接收引導，並中斷其餘規劃。&lt;li&gt;&lt;strong&gt;排程跟進（Follow-up）&lt;/strong&gt;：按下 &lt;code&gt;Alt + Enter&lt;/code&gt; 可以排程 follow-up 訊息，等 Agent 跑完目前的任務後自動接著處理。&lt;/ul&gt;&lt;h3 id=&quot;2.-樹狀結構的對話歷史與共享&quot;&gt;2. 樹狀結構的對話歷史與共享&lt;/h3&gt;&lt;p&gt;Pi 的對話紀錄是以「樹狀結構（Tree-structured）」進行儲存的。你可以使用 &lt;code&gt;/tree&lt;/code&gt; 指令導航至歷史對話的任意節點，並從該處拉出新的分支繼續對話。所有對話分支都會保存在同一個檔案中，你還可以使用 &lt;code&gt;/export&lt;/code&gt; 匯出成 HTML，或是使用 &lt;code&gt;/share&lt;/code&gt; 自動上傳至 GitHub Gist，生成一個可分享的網頁連結。&lt;h3 id=&quot;3.-上下文工程(Context-Engineering)&quot;&gt;3. 上下文工程（Context Engineering）&lt;/h3&gt;&lt;p&gt;AI 的回覆品質極度依賴 Prompt 與上下文管理。Pi 提供了極佳的上下文管理原語：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;AGENTS.md&lt;/strong&gt;：可以在專案根目錄、家目錄或任何父級目錄放置 &lt;code&gt;AGENTS.md&lt;/code&gt;，Pi 會在啟動時自動載入，這非常適合用來存放專案特定的開發規範或架構細節。&lt;li&gt;&lt;strong&gt;SYSTEM.md&lt;/strong&gt;：用於替換或附加預設的系統 Prompt。&lt;li&gt;&lt;strong&gt;自動壓縮（Compaction）&lt;/strong&gt;：當對話歷史接近 LLM 的上下文上限時，Pi 會自動對舊訊息進行摘要壓縮。開發者也可以透過擴充功能（Extensions）自訂壓縮演算法。&lt;li&gt;&lt;strong&gt;Skills（技能）&lt;/strong&gt;：透過 Markdown 檔案定義的即用型指令包，只在需要時才載入上下文，非常節省 Token。&lt;li&gt;&lt;strong&gt;Prompt 範本&lt;/strong&gt;：輸入 &lt;code&gt;/name&lt;/code&gt; 即可快速展開常用的 Prompt 範本。&lt;/ul&gt;&lt;hr&gt;&lt;h2 id=&quot;為什麼-Pi-沒有內建-MCP子代理與規劃模式?&quot;&gt;為什麼 Pi 沒有內建 MCP、子代理與規劃模式？&lt;/h2&gt;&lt;p&gt;這正是 Pi 與眾不同之處。Pi 刻意&lt;strong&gt;不內建&lt;/strong&gt;以下功能，以維持核心的輕量與 Token 高效能：&lt;ul&gt;&lt;li&gt;&lt;strong&gt;無 MCP（Model Context Protocol）&lt;/strong&gt;&lt;li&gt;&lt;strong&gt;無子代理（Sub-agents）&lt;/strong&gt;&lt;li&gt;&lt;strong&gt;無權限彈窗提示&lt;/strong&gt;&lt;li&gt;&lt;strong&gt;無內建規劃模式（Plan Mode）&lt;/strong&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;那如果需要這些功能該怎麼辦？自己動手加！&lt;/strong&gt; Pi 提供了極為強大的「擴充（Extensions）」與「套件（Packages）」機制。所有的擴充功能都是 TypeScript 模組，可以自由讀寫 tools、指令、快速鍵甚至 TUI 介面。&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 comment&quot;&gt;# 安裝來自 npm 的套件&lt;/span&gt;
pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; npm:@foo/pi-tools

&lt;span class=&quot;token comment&quot;&gt;# 甚至安裝可以在終端機玩 DOOM 的套件&lt;/span&gt;
pi &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; git:github.com/badlogic/pi-doom&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2 id=&quot;如何安裝與開始使用-Pi?&quot;&gt;如何安裝與開始使用 Pi？&lt;/h2&gt;&lt;p&gt;安裝 Pi 極為簡單，它支援多種安裝方式：&lt;h3 id=&quot;1.-使用-curl-安裝(macOS/Linux)&quot;&gt;1. 使用 curl 安裝（macOS/Linux）&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;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;h3 id=&quot;2.-使用-npm/pnpm/bun-全域安裝&quot;&gt;2. 使用 npm/pnpm/bun 全域安裝&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;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;# 或&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&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;# 或&lt;/span&gt;
bun &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; --ignore-scripts @earendil-works/pi-coding-agent&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;結語:回歸極簡的開發美學&quot;&gt;結語：回歸極簡的開發美學&lt;/h2&gt;&lt;p&gt;Pi Coding Agent 重新定義了 AI 程式助手與開發者之間的關係。它不試圖去接管你的整個 IDE 或工作流，而是作為一個忠實、極快且高度可配置的終端機工具，默默地為你提供協助。&lt;p&gt;如果你已經厭倦了那些沉重、黑盒且難以控制的 AI 工具，不妨試試 Pi Coding Agent，打造一個真正屬於你自己的 AI 助手！</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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E7%82%BA%E4%BB%80%E9%BA%BC%E4%B8%80%E8%88%AC-WordPress-%E5%8C%AF%E5%87%BA%E6%96%B9%E5%BC%8F%E9%80%99%E9%BA%BC%E7%97%9B%E8%8B%A6?&quot;&gt;為什麼一般 WordPress 匯出方式這麼痛苦？&lt;/a&gt;&lt;/ul&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%8B:11ty-%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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#%E7%9B%B4%E6%8E%A5%E5%9F%B7%E8%A1%8C%E4%B8%80%E8%A1%8C%E6%8C%87%E4%BB%A4&quot;&gt;直接執行一行指令&lt;/a&gt;&lt;/ul&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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#eleventy-base-blog&quot;&gt;eleventy-base-blog&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/11ty-import-tutorial/#eleventy-excellent&quot;&gt;eleventy-excellent&lt;/a&gt;&lt;/ul&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;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 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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#WordPress:%E6%88%90%E7%86%9F%E7%9A%84%E5%85%A8%E5%8A%9F%E8%83%BD-CMS&quot;&gt;WordPress：成熟的全功能 CMS&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#11ty:%E7%8F%BE%E4%BB%A3%E5%8C%96%E7%9A%84%E9%9D%9C%E6%85%8B%E7%B6%B2%E7%AB%99%E7%94%9F%E6%88%90%E5%99%A8&quot;&gt;11ty：現代化的靜態網站生成器&lt;/a&gt;&lt;/ul&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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E6%8A%80%E8%A1%93%E6%9E%B6%E6%A7%8B&quot;&gt;技術架構&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%96%8B%E7%99%BC%E9%AB%94%E9%A9%97&quot;&gt;開發體驗&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E6%95%88%E8%83%BD%E8%A1%A8%E7%8F%BE&quot;&gt;效能表現&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%AE%89%E5%85%A8%E6%80%A7%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%B6%AD%E8%AD%B7%E6%88%90%E6%9C%AC%E8%88%87%E8%A4%87%E9%9B%9C%E5%BA%A6&quot;&gt;維護成本與複雜度&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%85%A7%E5%AE%B9%E7%AE%A1%E7%90%86%E8%88%87%E5%8D%94%E4%BD%9C&quot;&gt;內容管理與協作&lt;/a&gt;&lt;/ul&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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%81%B8%E6%93%87-WordPress-%E7%9A%84%E6%83%85%E5%A2%83&quot;&gt;選擇 WordPress 的情境&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E9%81%B8%E6%93%87-11ty-%E7%9A%84%E6%83%85%E5%A2%83&quot;&gt;選擇 11ty 的情境&lt;/a&gt;&lt;/ul&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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#WordPress-%E9%81%A9%E5%90%88%E6%A1%88%E4%BE%8B&quot;&gt;WordPress 適合案例&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#11ty-%E9%81%A9%E5%90%88%E6%A1%88%E4%BE%8B&quot;&gt;11ty 適合案例&lt;/a&gt;&lt;/ul&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;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%BE%9E-WordPress-%E9%81%B7%E7%A7%BB%E5%88%B0-11ty&quot;&gt;從 WordPress 遷移到 11ty&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/wordpress-vs-11ty/#%E5%BE%9E-11ty-%E9%81%B7%E7%A7%BB%E5%88%B0-WordPress&quot;&gt;從 11ty 遷移到 WordPress&lt;/a&gt;&lt;/ul&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>
  <entry>
    <title>1 個程式範例，快速學習 JavaScript 物件導向語法</title>
    <link href="https://kamadiam.com/javascript-oop/" />
    <updated>2024-01-01T00:27:42Z</updated>
    <id>https://kamadiam.com/javascript-oop/</id>
    <content type="html">&lt;p&gt;當深入 JavaScript 的核心時，傳統的物件導向編程（OOP）技術顯得非常重要。這種編程風格不僅為程式碼提供了清晰的結構，而且還促進了模組化和重用，這對於大型和複雜的應用程式開發尤為關鍵。&lt;p&gt;&lt;strong&gt;為什麼要學習 JavaScript OOP？&lt;/strong&gt;&lt;p&gt;JavaScript 雖然最初是基於原型的語言，但 ES6（ES2015）引入了類別（class）語法，讓開發者能夠使用更傳統的物件導向編程方式。這種方式讓程式碼更容易理解、維護和擴展。&lt;p&gt;本篇文章將透過一個完整的範例，一步步探討 JavaScript 中傳統物件導向編程的關鍵概念，包括類別的定義、公共和私有屬性的宣告、建構函數、方法的使用，以及類別的繼承等。這將幫助你深入理解 JavaScript 中的 OOP，並將這些知識應用於編程實踐中。&lt;p&gt;&lt;strong&gt;完整 OOP 語法範例：&lt;/strong&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 comment&quot;&gt;// 定義一個類別 (Define a Class)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 類別是 JavaScript 中用於建立物件的模板。它封裝了相關的屬性和方法。&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 公共屬性 (Declare a Public Property)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 公共屬性可以在類別實例的任何地方被存取和修改。&lt;/span&gt;
    color&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 私有屬性 (Declare a Private Property)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 私有屬性僅在定義它們的類別內部可存取，外部無法直接存取。&lt;/span&gt;
    #brand&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 建構函數 (Declare Constructor)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 建構函數是在建立類別實例時自動呼叫的特殊方法，用於初始化類別的屬性。&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;brand&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; color&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;#brand &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; brand&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 公共方法 (Declare a Public Method)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 公共方法可以被類別實例及繼承該類別的其他類別的實例呼叫。&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;displayInfo&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;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;This is a &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; car.&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 comment&quot;&gt;// 私有方法 (Declare a Private Method)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 私有方法僅能在定義它的類別內部被呼叫，對外部是不可見的。&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;#privateMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Brand is &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;#brand&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 comment&quot;&gt;// Getter 和 Setter&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Getter 和 Setter 用於對類別的私有屬性進行安全的存取和更新。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;brand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;#privateMethod&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;set&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;brand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newBrand&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;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;#brand &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newBrand&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 靜態方法和屬性 (Static Methods and Fields)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 靜態方法和屬性屬於類別本身，而不是類別的任何特定實例。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; numberOfWheels &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;carDescription&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Cars usually have &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;numberOfWheels&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; wheels.&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 comment&quot;&gt;// 擴展一個類別 (Extend a Class)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 使用 &#39;extends&#39; 關鍵字建立一個新類別，繼承另一個類別的屬性和方法。&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ElectricCar&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Car&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;brand&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batteryLife&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;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;brand&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 呼叫父類別建構函數&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;batteryLife &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; batteryLife&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 覆寫方法&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;displayInfo&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;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;This is a &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; electric car with a battery life of &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;batteryLife&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; hours.&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 comment&quot;&gt;// 建立一個實例 (Create an Instance)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 使用 &#39;new&#39; 關鍵字和類別名稱建立該類別的一個新實例。&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myCar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ElectricCar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Tesla&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;red&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&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 comment&quot;&gt;// 呼叫方法 (Call a Method)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 透過類別實例呼叫在類別中定義的方法。&lt;/span&gt;
myCar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;displayInfo&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 comment&quot;&gt;// This is a red electric car with a battery life of 24 hours.&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 點表示法 vs 括號表示法 (Dot vs Bracket Notation)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 使用點表示法或括號表示法存取物件的屬性。點表示法更直觀，而括號表示法在屬性名為變數時很有用。&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myCar&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// red (點表示法)&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myCar&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;color&#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 comment&quot;&gt;// red (括號表示法)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這個範例透過詳細的註解解釋了 JavaScript 中的關鍵物件導向概念，包括如何定義類別、宣告屬性和方法、建立和使用實例，以及如何實現繼承和多型性。透過這個實際的範例，你可以更好地理解和掌握 JavaScript 的物件導向特性。&lt;p&gt;&lt;strong&gt;範例說明：&lt;/strong&gt;&lt;p&gt;這個範例建立了一個 &lt;code&gt;Car&lt;/code&gt; 類別作為基礎類別，然後建立了一個 &lt;code&gt;ElectricCar&lt;/code&gt; 類別來繼承它。這展示了：&lt;ul&gt;&lt;li&gt;如何定義類別和屬性&lt;li&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;以下是 JavaScript 物件導向編程的關鍵概念：&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;類別（Class）&lt;/strong&gt;：用於建立物件的模板，封裝了相關的屬性和方法。類別定義了物件的結構和行為。&lt;li&gt;&lt;p&gt;&lt;strong&gt;公共與私有屬性&lt;/strong&gt;：公共屬性可被外部存取和修改，私有屬性（以 &lt;code&gt;#&lt;/code&gt; 開頭）僅在類別內部可存取，這提供了更好的封裝性。&lt;li&gt;&lt;p&gt;&lt;strong&gt;建構函數（Constructor）&lt;/strong&gt;：在建立實例時自動呼叫的特殊方法，用於初始化物件的屬性。這是建立物件時的第一個步驟。&lt;li&gt;&lt;p&gt;&lt;strong&gt;繼承（Inheritance）&lt;/strong&gt;：使用 &lt;code&gt;extends&lt;/code&gt; 關鍵字讓子類別繼承父類別的屬性和方法。這允許你重用程式碼並建立更複雜的類別層次結構。&lt;li&gt;&lt;p&gt;&lt;strong&gt;靜態方法與屬性&lt;/strong&gt;：屬於類別本身，不需要建立實例即可使用。通常用於工具函數或類別層級的資料。&lt;li&gt;&lt;p&gt;&lt;strong&gt;Getter 和 Setter&lt;/strong&gt;：提供安全的方式存取和修改私有屬性。這允許你在存取屬性時執行額外的邏輯，例如驗證或計算。&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;實際應用：&lt;/strong&gt;&lt;p&gt;透過這些概念，你可以建立結構清晰、易於維護的 JavaScript 程式碼。物件導向編程特別適合：&lt;ul&gt;&lt;li&gt;大型應用程式的開發&lt;li&gt;需要重用程式碼的場景&lt;li&gt;需要模組化和封裝的專案&lt;li&gt;團隊協作開發&lt;/ul&gt;&lt;p&gt;掌握這些概念後，你就能夠寫出更專業、更易於維護的 JavaScript 程式碼。</content>
  </entry>
  <entry>
    <title>如何在 SvelteKit 中管理前端環境變數</title>
    <link href="https://kamadiam.com/sveltekit-env/" />
    <updated>2023-12-30T01:06:48Z</updated>
    <id>https://kamadiam.com/sveltekit-env/</id>
    <content type="html">&lt;p&gt;大家都知道後端節點（如 Node.js）可以輕鬆地透過 &lt;code&gt;.env&lt;/code&gt; 檔案或 &lt;code&gt;process&lt;/code&gt; 物件來存取環境變數。但在純前端應用程式，尤其是使用如 SvelteKit 這樣的現代框架時，這個任務看起來就沒那麼直觀了。本文將介紹如何在 SvelteKit 中有效地管理和存取環境變數。&lt;h2 id=&quot;在-Node.js-中讀取-.env-檔案&quot;&gt;在 Node.js 中讀取 &lt;code&gt;.env&lt;/code&gt; 檔案&lt;/h2&gt;&lt;p&gt;在 Node.js 應用程式中，環境變數通常透過 &lt;code&gt;.env&lt;/code&gt; 檔案來管理。這些變數可以用來儲存應用程式配置、機密鑰匙或其他環境特定的設定。下面是如何在 Node.js 中讀取 &lt;code&gt;.env&lt;/code&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; dotenv &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

dotenv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&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;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;YOUR_ENV_VARIABLE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在上述程式碼中，我們使用 &lt;code&gt;dotenv&lt;/code&gt; 函式庫來載入 &lt;code&gt;.env&lt;/code&gt; 檔案中的變數。然後，你可以透過 Node.js 的 &lt;code&gt;process.env&lt;/code&gt; 物件來存取這些變數。&lt;h2 id=&quot;在-SvelteKit-中管理環境變數&quot;&gt;在 SvelteKit 中管理環境變數&lt;/h2&gt;&lt;p&gt;SvelteKit 是一個基於 Svelte 的全端框架，提供了一套更高層次的抽象，特別是在管理環境變數時。在 SvelteKit 中，環境變數不是直接讀取 &lt;code&gt;.env&lt;/code&gt; 檔案中的變數。相反，它們需要透過特定的配置來使其在前端程式碼中可用。&lt;p&gt;SvelteKit 不能直接讀取 &lt;code&gt;.env&lt;/code&gt; 檔案的環境變數，意思是它們不是自動地、直接地從 &lt;code&gt;.env&lt;/code&gt; 檔案讀取並暴露給前端程式碼。這與 Node.js 中的處理方式有所不同，Node.js 可以直接透過 &lt;code&gt;process.env&lt;/code&gt; 存取 &lt;code&gt;.env&lt;/code&gt; 檔案中的變數。&lt;p&gt;在 SvelteKit 中，雖然 &lt;code&gt;.env&lt;/code&gt; 檔案仍然用於定義環境變數，但這些變數需要透過 SvelteKit 和其底層的建置工具（Vite）的特定配置來暴露。有一個重要規則：在 &lt;code&gt;.env&lt;/code&gt; 檔案中定義的變數需要以 &lt;code&gt;PUBLIC_&lt;/code&gt; 開頭，這樣 Vite 才會在建置過程中將它們暴露給前端程式碼。&lt;p&gt;所以，當我們在 SvelteKit 中談論環境變數時，它們確實是在 &lt;code&gt;.env&lt;/code&gt; 檔案中定義的，但它們的暴露和存取方式是由 SvelteKit 和 Vite 的配置決定的，而非直接從 &lt;code&gt;.env&lt;/code&gt; 檔案自動讀取。這是一個重要的安全機制，確保只有明確標記為公開的變數才會暴露給前端。&lt;h2 id=&quot;讀取環境變數範例&quot;&gt;讀取環境變數範例&lt;/h2&gt;&lt;h3 id=&quot;步驟-1:創建-.env-檔案&quot;&gt;步驟 1：創建 &lt;code&gt;.env&lt;/code&gt; 檔案&lt;/h3&gt;&lt;p&gt;首先，在你的 SvelteKit 專案根目錄下創建一個 &lt;code&gt;.env&lt;/code&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 constant&quot;&gt;PUBLIC_CLIENT_ID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;test-id&quot;&lt;/span&gt;

&lt;span class=&quot;token constant&quot;&gt;PUBLIC_CALLBACK&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:5173/oauth2callback&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 SvelteKit 中，所有要公開的環境變數都應以 &lt;code&gt;PUBLIC_&lt;/code&gt; 開頭，這樣它們才會被 Vite（SvelteKit 底層的構建工具）公開給前端。&lt;h3 id=&quot;步驟-2:存取環境變數&quot;&gt;步驟 2：存取環境變數&lt;/h3&gt;&lt;p&gt;在 SvelteKit 應用程式中，可以直接 &lt;code&gt;import&lt;/code&gt; $env/static/public 來存取這些變數：&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PUBLIC_CALLBACK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PUBLIC_CLIENT_ID&lt;/span&gt; &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;&#39;$env/static/public&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; redirect_uri &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PUBLIC_CALLBACK&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; client_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;PUBLIC_CLIENT_ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;步驟-3:切換開發環境與正式環境&quot;&gt;步驟 3：切換開發環境與正式環境&lt;/h3&gt;&lt;p&gt;你可以在專案根目錄放兩個 &lt;code&gt;.env&lt;/code&gt; 檔案，分別是 &lt;code&gt;.env&lt;/code&gt; 和 &lt;code&gt;.env.production&lt;/code&gt;。這樣當你在本機開發使用 &lt;code&gt;pnpm run dev&lt;/code&gt; 時，程式會使用 &lt;code&gt;.env&lt;/code&gt; 的變數，而當你使用 &lt;code&gt;pnpm run build&lt;/code&gt; 時，就會改為使用 &lt;code&gt;.env.production&lt;/code&gt; 中的變數。這讓你可以輕鬆地在開發和正式環境之間切換不同的配置。&lt;p&gt;完整說明請參考 &lt;a href=&quot;https://kit.svelte.dev/docs/modules#$env-static-public&quot;&gt;$env/static/public&lt;/a&gt;</content>
  </entry>
  <entry>
    <title>什麼是 Javascript module，讓 JavaScript 程式碼更有組織</title>
    <link href="https://kamadiam.com/what-is-javascript-module/" />
    <updated>2023-12-26T19:54:07Z</updated>
    <id>https://kamadiam.com/what-is-javascript-module/</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/what-is-javascript-module/#%E7%B6%B2%E9%A0%81%E9%96%8B%E7%99%BC%E7%9A%84%E6%97%A9%E6%9C%9F%E6%8C%91%E6%88%B0&quot;&gt;網頁開發的早期挑戰&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/what-is-javascript-module/#JavaScript-%E6%A8%A1%E7%B5%84%E7%9A%84%E6%9C%AC%E8%B3%AA&quot;&gt;JavaScript 模組的本質&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/what-is-javascript-module/#%E7%8F%BE%E4%BB%A3-JavaScript-%E6%A8%A1%E7%B5%84%E7%9A%84%E9%A1%9E%E5%9E%8B&quot;&gt;現代 JavaScript 模組的類型&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/what-is-javascript-module/#CommonJS-%E6%A8%A1%E7%B5%84&quot;&gt;CommonJS 模組&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/what-is-javascript-module/#ECMAScript(ES)%E6%A8%A1%E7%B5%84&quot;&gt;ECMAScript（ES）模組&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/what-is-javascript-module/#%E5%8E%9F%E7%94%9F%E8%88%87%E9%9D%9E%E5%8E%9F%E7%94%9F%E7%9A%84%E6%AF%94%E8%BC%83&quot;&gt;原生與非原生的比較&lt;/a&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;我們可能都很會使用開發 Node.js 程式，使用各種前端工具，但可能不是很了解什麼是 Javascript module、ES modules、CommonJS Module，又為什麼有些程式使用 &lt;code&gt;require&lt;/code&gt;，有些程式使用 &lt;code&gt;import&lt;/code&gt;？&lt;h2 id=&quot;網頁開發的早期挑戰&quot;&gt;網頁開發的早期挑戰&lt;/h2&gt;&lt;p&gt;在 JavaScript 模組成為標準之前，開發大型網頁應用程式是一項相當複雜的任務。當時開發者面臨許多挑戰：&lt;h4 id=&quot;全域命名空間污染&quot;&gt;全域命名空間污染&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;命名衝突&lt;/strong&gt;：所有 JavaScript 變數和函數預設在全域命名空間中。這導致了命名衝突，特別是在使用多個腳本時。&lt;p&gt;&lt;strong&gt;維護困難&lt;/strong&gt;：隨著程式碼庫的增長，找出命名衝突的源頭變得越來越困難。&lt;h4 id=&quot;依賴管理的挑戰&quot;&gt;依賴管理的挑戰&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;手動管理&lt;/strong&gt;：開發者需要手動管理腳本之間的依賴關係，確保它們以正確的順序載入。&lt;p&gt;&lt;strong&gt;效能問題&lt;/strong&gt;：隨著腳本數量的增加，網頁載入時間增長，影響使用者體驗。&lt;h4 id=&quot;重複程式碼&quot;&gt;重複程式碼&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;重複性工作&lt;/strong&gt;：缺乏模組化導致程式碼重複，特別是在大型團隊或多個專案中。&lt;p&gt;為了應對這些挑戰，開發者們採用了不同的策略：&lt;p&gt;&lt;strong&gt;立即呼叫函數表達式（IIFE）&lt;/strong&gt;：用於建立區域作用域，避免全域變數污染。&lt;p&gt;&lt;strong&gt;命名空間模式&lt;/strong&gt;：透過建立一個全域物件來儲存所有功能和變數，減少全域變數的數量。&lt;p&gt;但這些方式在專案範圍擴大時，也變得窒礙難行，所以漸漸開始有在前端引入模組的想法出現。&lt;h2 id=&quot;JavaScript-模組的本質&quot;&gt;JavaScript 模組的本質&lt;/h2&gt;&lt;p&gt;在 JavaScript 的世界中，模組就像是應用程式的樂高積木，它們透過將程式碼分解成更小、可重複使用的部分，幫助組織和管理程式碼。&lt;p&gt;所有這些模組系統都有一個共同點：它們允許你匯入和匯出內容。&lt;p&gt;&lt;strong&gt;模組化程式碼&lt;/strong&gt;：將模組視為個別的腳本檔案，每個模組封裝特定的功能或一組相關功能。&lt;p&gt;&lt;strong&gt;範圍和封裝&lt;/strong&gt;：模組有助於封裝程式碼。除非明確匯出，否則模組中的變數和函數對其他模組不可見。&lt;p&gt;假設有一個用於實用功能的模組（&lt;code&gt;utils.js&lt;/code&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 comment&quot;&gt;// utils.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b&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;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;subtract&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; b&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;main.js&lt;/code&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 comment&quot;&gt;// main.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; add&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subtract &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;&#39;./utils.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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 comment&quot;&gt;// 輸出：8&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subtract&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&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 comment&quot;&gt;// 輸出：2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用模組自然會產生諸多設計上的優點：&lt;p&gt;&lt;strong&gt;可維護性&lt;/strong&gt;：將複雜的程式碼分解成易於管理的部分。&lt;p&gt;&lt;strong&gt;可重用性&lt;/strong&gt;：允許在應用程式的不同部分重複使用程式碼。&lt;p&gt;&lt;strong&gt;命名空間管理&lt;/strong&gt;：減少全域命名空間污染，最小化衝突。&lt;p&gt;&lt;strong&gt;依賴性管理&lt;/strong&gt;：明確定義程式碼各部分之間的依賴關係。&lt;h2 id=&quot;現代-JavaScript-模組的類型&quot;&gt;&lt;strong&gt;現代 JavaScript 模組的類型&lt;/strong&gt;&lt;/h2&gt;&lt;h3 id=&quot;CommonJS-模組&quot;&gt;CommonJS 模組&lt;/h3&gt;&lt;p&gt;非原生 JavaScript 模組，在 ES6 模組標準之前，JavaScript 沒有內建的模組系統，非原生模組是透過各種工具和規範實現。&lt;p&gt;類型包括 CommonJS（Node.js 中使用）、AMD（Asynchronous Module Definition）、UMD（Universal Module Definition）等。&lt;p&gt;主要透過工具如 Webpack 或 Babel 轉譯或封裝，以支援模組化，使用 &lt;code&gt;require()&lt;/code&gt; 進行匯入和 &lt;code&gt;module.exports&lt;/code&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 comment&quot;&gt;// CommonJS 模組的匯出&lt;/span&gt;
module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &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 function-variable function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token operator&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;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Hello, &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 comment&quot;&gt;// 匯入&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; sayHello &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;./module&#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;h3 id=&quot;ECMAScript(ES)模組&quot;&gt;ECMAScript（ES）模組&lt;/h3&gt;&lt;p&gt;原生 JavaScript 模組（也稱為 ECMAScript 模組或 ES 模組）是 ECMAScript 2015 (ES6) 標準的一部分；使用 &lt;code&gt;import&lt;/code&gt; 和 &lt;code&gt;export&lt;/code&gt; 語句，現代瀏覽器和 Node.js 都已開始原生支援。&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 comment&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;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Hello, &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 comment&quot;&gt;// 匯入&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; sayHello &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;&#39;./module.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;模組程式和一般的 JavaScript 程式放在瀏覽器執行時，還有一個很重要的差異：&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token 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;classic.js&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 script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&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;classic.js&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 script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- 引入程式會執行多次 --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token 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;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&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;module.js&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 script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&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;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&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;module.js&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 script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&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;module&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 script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./module.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- 模組只會執行一次 --&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;原生 JavaScript 模組&lt;th&gt;非原生 JavaScript 模組&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;語法&lt;/strong&gt;&lt;td&gt;使用 ES6 &lt;code&gt;import&lt;/code&gt; 和 &lt;code&gt;export&lt;/code&gt;&lt;td&gt;依賴特定規範，如 CommonJS 的 &lt;code&gt;require&lt;/code&gt; 和 &lt;code&gt;module.exports&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;執行環境&lt;/strong&gt;&lt;td&gt;現代瀏覽器和最新版本的 Node.js 直接支援&lt;td&gt;多在特定環境（如 Node.js）或需透過轉譯工具在瀏覽器中執行&lt;tr&gt;&lt;td&gt;&lt;strong&gt;載入機制&lt;/strong&gt;&lt;td&gt;支援非同步載入，適合大型應用和網頁環境&lt;td&gt;主要用於同步載入&lt;tr&gt;&lt;td&gt;&lt;strong&gt;工具依賴&lt;/strong&gt;&lt;td&gt;不依賴於外部工具或編譯器，簡化設定和部署流程&lt;td&gt;通常需要像 Webpack 或 Babel 這樣的打包工具&lt;/table&gt;&lt;p&gt;現代化的瀏覽器已開始支援原生 JavaScript module。&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/nEGxSf3Bv9-768.webp 768w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/nEGxSf3Bv9-768.png&quot; alt=&quot;&quot; width=&quot;768&quot; height=&quot;538&quot;&gt;&lt;/picture&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/uSRfcOnmhk-768.webp 768w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/uSRfcOnmhk-768.png&quot; alt=&quot;&quot; width=&quot;768&quot; height=&quot;538&quot;&gt;&lt;/picture&gt;&lt;p&gt;透過以上簡短說明，應該就能基本了解什麼是 JavaScript module，接下來能更認識什麼是 Webpack 打包工具，更能充分使用 Vite 這類更現代化的前端開發工具。&lt;p&gt;參考來源:&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://v8.dev/features/modules&quot;&gt;https://v8.dev/features/modules&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/mdn/js-examples/tree/main/module-examples&quot;&gt;https://github.com/mdn/js-examples/tree/main/module-examples&lt;/a&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>如何批量取消訂閱 YouTube 頻道，使用 YouTube Subscriptions API</title>
    <link href="https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/" />
    <updated>2023-12-22T18:40:39Z</updated>
    <id>https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/</id>
    <content type="html">&lt;p&gt;這篇文章將帶領大家透過一個實際案例，使用 Google YouTube API、OAuth、Svelte 和 TailwindCSS 建立一個簡單、方便的工具來批量取消訂閱 YouTube 頻道。&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/how-to-mass-unsubscribe-youtube-channels/#%E5%8E%9F%E5%9B%A0&quot;&gt;原因&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E9%96%8B%E7%99%BC%E8%A8%88%E7%95%AB&quot;&gt;開發計畫&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E6%BA%96%E5%82%99-Google-API&quot;&gt;準備 Google API&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E5%BB%BA%E7%AB%8B%E6%96%B0%E5%B0%88%E6%A1%88&quot;&gt;建立新專案&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#OAuth-%E8%A8%AD%E5%AE%9A&quot;&gt;OAuth 設定&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#SvelteKit-%E5%88%9D%E5%A7%8B%E5%B0%88%E6%A1%88&quot;&gt;SvelteKit 初始專案&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#TailwindCSS-%E7%BE%8E%E5%8C%96%E4%BB%8B%E9%9D%A2&quot;&gt;TailwindCSS 美化介面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E7%AC%AC%E4%B8%80%E5%80%8B%E7%95%AB%E9%9D%A2&quot;&gt;第一個畫面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E9%A0%BB%E9%81%93%E7%AE%A1%E7%90%86%E4%BB%8B%E9%9D%A2&quot;&gt;頻道管理介面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E5%AF%A6%E9%9A%9B%E6%B8%AC%E8%A9%A6%E7%95%AB%E9%9D%A2&quot;&gt;實際測試畫面&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/how-to-mass-unsubscribe-youtube-channels/#%E5%A6%82%E4%BD%95%E6%A7%8B%E5%BB%BA%E8%88%87%E7%99%BC%E5%B8%83&quot;&gt;如何構建與發布&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;原因&quot;&gt;原因&lt;/h2&gt;&lt;p&gt;像我這樣，訂閱了上百個 YouTube 頻道，卻發現大多數時間都在滑過不看的內容，這不僅分散注意力，也減少了尋找有趣內容的效率。&lt;p&gt;土法煉鋼一個一個點頻道退訂，大概退了一二十個頻道後，終於還是受不了，這樣點真的很累。YouTube 的管理介面對於批量操作真不友好，搜尋很多網路解法，並沒有找到方便好用又快速的方式。&lt;p&gt;不如自己來寫個工具，構想大概就用個簡單頁面顯示我的訂閱，然後使用 YouTube API 刪除挑選的訂閱。查看一下 Google 文件，果然有簡單的 API 可以用，那就開始吧。&lt;p&gt;&lt;a href=&quot;https://developers.google.com/youtube/v3/docs/subscriptions&quot;&gt;參考 Subscriptions API&lt;/a&gt;&lt;h2 id=&quot;開發計畫&quot;&gt;開發計畫&lt;/h2&gt;&lt;p&gt;任何開發計畫第一件事，一定是把本機開發環境弄好，讓開發節奏順暢。&lt;p&gt;預計使用 SvelteKit 開發一個純網頁的前端應用，不需要後端 Server，只需要能呼叫 YouTube API 就行。&lt;p&gt;應該會需要使用 OAuth 授權，才能取得訂閱頻道清單。&lt;p&gt;畫面要簡單也不能太醜，&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;TailwindCSS&lt;/a&gt; 能快速解決。&lt;h2 id=&quot;準備-Google-API&quot;&gt;準備 Google API&lt;/h2&gt;&lt;p&gt;要使用 Google API，首先需要在 &lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google Cloud Platform&lt;/a&gt; 上建立一個新的專案，然後在該專案中啟用 YouTube Data API v3。&lt;h3 id=&quot;建立新專案&quot;&gt;建立新專案&lt;/h3&gt;&lt;h4 id=&quot;登入-Google-Cloud-Console,建立一個新專案&quot;&gt;登入 Google Cloud Console，建立一個新專案。&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/WQwuH7hLV8-1834.webp 1834w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/WQwuH7hLV8-1834.png&quot; alt=&quot;&quot; width=&quot;1834&quot; height=&quot;1384&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;在建立的專案中,導航到「API-與服務」&gt;「啟用-API-和服務」&quot;&gt;在建立的專案中，導航到「API 與服務」&amp;gt;「啟用 API 和服務」。&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/gQP5AC7Jv--1746.webp 1746w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/gQP5AC7Jv--1746.png&quot; alt=&quot;&quot; width=&quot;1746&quot; height=&quot;206&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;搜尋並選擇「YouTube-Data-API-v3」,然後啟用它&quot;&gt;搜尋並選擇「YouTube Data API v3」，然後啟用它。&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/5Ve5KnczUl-2048.webp 2048w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/5Ve5KnczUl-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;754&quot;&gt;&lt;/picture&gt;&lt;h3 id=&quot;OAuth-設定&quot;&gt;OAuth 設定&lt;/h3&gt;&lt;h4 id=&quot;在相同的專案中,建立憑證,以便存取已啟用的-API&quot;&gt;在相同的專案中，建立憑證，以便存取已啟用的 API。&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/JCAnk8I9EP-2048.webp 2048w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/JCAnk8I9EP-2048.png&quot; alt=&quot;&quot; width=&quot;2048&quot; height=&quot;620&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;設置-OAuth-同意畫面,提供必要的應用資訊&quot;&gt;設置 OAuth 同意畫面，提供必要的應用資訊。&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/rNfBcBQCB4-1090.webp 1090w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/rNfBcBQCB4-1090.png&quot; alt=&quot;&quot; width=&quot;1090&quot; height=&quot;1202&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;在-OAuth-用戶端設置中,新增授權的重定向-URI,這將用於-OAuth-流程&quot;&gt;在 OAuth 用戶端設置中，新增授權的重定向 URI，這將用於 OAuth 流程。&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/SlMZNDPV56-768.webp 768w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/SlMZNDPV56-768.png&quot; alt=&quot;&quot; width=&quot;768&quot; height=&quot;299&quot;&gt;&lt;/picture&gt;&lt;p&gt;這是本機的測試 callback 網址，可以新增 URI 分別對應不同執行環境。&lt;p&gt;這個專案需要額外授權，所以需要經過 Google 審核，不然就只能自己使用，或者設定測試人員，分享給別人使用，最多 100 個人。&lt;h2 id=&quot;SvelteKit-初始專案&quot;&gt;SvelteKit 初始專案&lt;/h2&gt;&lt;p&gt;使用以下命令來建立一個新的 SvelteKit 專案：&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;pnpm&lt;/span&gt; create svelte@latest youtube-app&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這將建立一個基礎的 SvelteKit 專案，你可以開始新增自己的程式碼。&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;code &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 Visual Studio Code 開啟專案。&lt;h2 id=&quot;TailwindCSS-美化介面&quot;&gt;TailwindCSS 美化介面&lt;/h2&gt;&lt;p&gt;為了快速而美觀地構建 UI，這裡將使用 TailwindCSS。以下是整合 TailwindCSS 的步驟：&lt;p&gt;安裝 tailwindcss 及其相關依賴項目：&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;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; tailwindcss postcss autoprefixer&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後產生 tailwind.config.js 和 postcss.config.js 檔案：&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;pnpm&lt;/span&gt; dlx tailwindcss init &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安裝 DaisyUI（一個基於 Tailwind 的組件庫）：&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;pnpm&lt;/span&gt; i &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; daisyui@latest&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改 svelte.config.js&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;import adapter from &lt;span class=&quot;token string&quot;&gt;&#39;@sveltejs/adapter-auto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; vitePreprocess &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; from &lt;span class=&quot;token string&quot;&gt;&#39;@sveltejs/vite-plugin-svelte&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/** @type {import(&#39;@sveltejs/kit&#39;).Config} */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;const config =&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;kit:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;adapter&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 property&quot;&gt;preprocess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vitePreprocess&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;
export default config&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;修改 tailwind.config.js&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 comment&quot;&gt;/** @type {import(&#39;tailwindcss&#39;).Config} */&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 punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;content&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;&#39;./src/**/*.{html,js,svelte,ts}&#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 literal-property property&quot;&gt;theme&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;extend&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 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 literal-property property&quot;&gt;plugins&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 function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;daisyui&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;/code&gt;&lt;/pre&gt;&lt;p&gt;建立一個 &lt;code&gt;./src/app.css&lt;/code&gt; 檔案&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;@tailwind base&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
@tailwind components&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
@tailwind utilities&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;建立 &lt;code&gt;./src/routes/+layout.svelte&lt;/code&gt; 檔案並匯入新建立的 app.css 檔案：&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;../app.css&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;slot&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;a href=&quot;https://tailwindcss.com/docs/guides/sveltekit&quot;&gt;參考教學來源&lt;/a&gt;&lt;h2 id=&quot;第一個畫面&quot;&gt;第一個畫面&lt;/h2&gt;&lt;p&gt;萬事俱備，先啟動 Server 看看&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;pnpm&lt;/span&gt; dev&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/ERjgXQ5WgB-1102.webp 1102w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/ERjgXQ5WgB-1102.png&quot; alt=&quot;&quot; width=&quot;1102&quot; height=&quot;326&quot;&gt;&lt;/picture&gt;&lt;p&gt;接下來建立一個簡單的登入頁面，允許使用者透過 Google 認證來登入。使用剛剛設定的 OAuth 設定來實現這一點。&lt;p&gt;修改 ./src/routes/+page.svelte&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&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;ts&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 script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 重定向 URI, 在 OAuth 驗證流程中使用&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; redirect_uri &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;http://localhost:5173/oauth2callback&#39;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 替換你自己的 client_id&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; client_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;your_client_id&#39;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/*
   * 創建表單以從 Google 的 OAuth 2.0 伺服器請求 access token。
   */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;oauthSignIn&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 comment&quot;&gt;// Google 的 OAuth 2.0 端點，用於請求 access token&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; oauth2Endpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://accounts.google.com/o/oauth2/v2/auth&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 創建 &amp;lt;form&gt; 元素，提交參數到 OAuth 2.0 端點。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;form&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;
    form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET&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 comment&quot;&gt;// 以 GET 請求發送。&lt;/span&gt;
    form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oauth2Endpoint&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;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Params&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;key&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// 傳遞給 OAuth 2.0 端點的參數。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      client_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      redirect_uri&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;response_type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;token&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;scope&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.googleapis.com/auth/youtubepartner&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 comment&quot;&gt;// 將表單參數添加為隱藏的輸入值。&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&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; p &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; params&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; input &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;input&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;
      input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hidden&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;
      input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;p&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;
      form&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;input&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 comment&quot;&gt;// 將表單添加到頁面並提交，以打開 OAuth 2.0 端點。&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&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;form&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&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;text-3xl m-4&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;Mass Unsubscribe YouTube&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;h1&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;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token 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;btn btn-warning&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;on:&lt;/span&gt;click&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;{oauthSignIn}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;使用 Google 帳號登入&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;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;p&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;h2 id=&quot;頻道管理介面&quot;&gt;頻道管理介面&lt;/h2&gt;&lt;p&gt;接下來將新增一個頁面來展示使用者的 YouTube 頻道訂閱列表，並允許他們選擇要取消訂閱的頻道。&lt;p&gt;修改 ./src/routes/oauth2callback/+page.svelte&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&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;ts&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 script&quot;&gt;&lt;span class=&quot;token language-javascript&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; onMount &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;svelte&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; page &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;$app/stores&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 從 URL 字串中解析出存取令牌&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getAccessTokenFromString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;#access_token=([^&amp;amp;]*)&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; match &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; str&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;regex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; match &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; match&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&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 comment&quot;&gt;// 取得當前頁面 URL 的存取令牌&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; accessToken &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getAccessTokenFromString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hash&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 這裡放置你的 API 金鑰&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;key&#39;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 存放訂閱頻道的陣列&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;subscriptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; any&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token 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 comment&quot;&gt;// 頁面載入時執行&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;onMount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 從 YouTube API 取得訂閱頻道&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://youtube.googleapis.com/youtube/v3/subscriptions?part=snippet&amp;amp;mine=true&amp;amp;key=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;key&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;amp;maxResults=50&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET&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;headers&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;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; accessToken&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 function&quot;&gt;then&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 parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&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 function&quot;&gt;then&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 parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        subscriptions&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 operator&quot;&gt;...&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        subscriptions &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 operator&quot;&gt;...&lt;/span&gt;subscriptions&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nextPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nextPageToken&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 function&quot;&gt;catch&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 parameter&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&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 comment&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;nextPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&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;token&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;token&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;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://youtube.googleapis.com/youtube/v3/subscriptions?part=snippet&amp;amp;mine=true&amp;amp;key=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;key&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;amp;maxResults=50&amp;amp;pageToken=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;token&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GET&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;headers&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;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; accessToken&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 function&quot;&gt;then&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 parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&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 function&quot;&gt;then&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 parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          subscriptions&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 operator&quot;&gt;...&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          subscriptions &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 operator&quot;&gt;...&lt;/span&gt;subscriptions&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nextPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nextPageToken&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 comment&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;unsubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; string&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;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;https://youtube.googleapis.com/youtube/v3/subscriptions?id=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;id&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;DELETE&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;headers&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;Authorization&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bearer &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; accessToken&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 function&quot;&gt;then&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 parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&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;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;status &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;204&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;
            subscriptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subscriptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&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 parameter&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; sub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; id&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 comment&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;unsubscribeAll&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;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Do you really want to unsubscribe all channels?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
      subscriptions&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 punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token 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;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;unsubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;unsubscribe &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;sub&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;snippet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&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 number&quot;&gt;2000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        i&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 punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&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;text-center text-4xl mt-4&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;You have {subscriptions.length} subscriptions&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;h1&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;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

    {#each subscriptions as sub}
    &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;li&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;m-12 border-2 p-4 flex flex-col&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;a&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;https://www.youtube.com/channel/{sub.snippet.resourceId.channelId}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;target&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;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&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;self-center&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;{sub.snippet.thumbnails.default.url}&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;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;h-24&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;a&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;h2&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;text-center text-xl p-2&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;{sub.snippet.title}&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;h2&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;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{sub.snippet.description}&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;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &amp;lt;button class=&quot;btn btn-warning mt-2 self-end&quot; on:click={()=&gt;{unsubscribe(sub.id)}}&gt;unsubscribe&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;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;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    {/each}

    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;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;btn btn-error w-full&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;on:&lt;/span&gt;click&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;{unsubscribeAll}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Unsubscribe All&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;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;ul&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;p&gt;參考教學： &lt;a href=&quot;https://developers.google.com/youtube/v3/guides/auth/client-side-web-apps&quot;&gt;Using OAuth 2.0 for JavaScript Web Applications&lt;/a&gt;&lt;h2 id=&quot;實際測試畫面&quot;&gt;實際測試畫面&lt;/h2&gt;&lt;p&gt;因為這是未發布的測試應用程式，需要加入測試帳號才能使用，或者也可以直接發布，一樣可以進行測試。&lt;h4 id=&quot;新增要測試使用的-google-帳號&quot;&gt;新增要測試使用的 google 帳號&lt;/h4&gt;&lt;p&gt;最多可以新增 100 個。&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/ia_ZBZWowv-1078.webp 1078w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/ia_ZBZWowv-1078.png&quot; alt=&quot;&quot; width=&quot;1078&quot; height=&quot;470&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;打開本機網址-http://localhost:5173/&quot;&gt;打開本機網址 http://localhost:5173/&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/HGVIVq_7Pw-1106.webp 1106w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/HGVIVq_7Pw-1106.png&quot; alt=&quot;&quot; width=&quot;1106&quot; height=&quot;244&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;選擇帳戶&quot;&gt;選擇帳戶&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/VtmWq_oqlC-916.webp 916w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/VtmWq_oqlC-916.png&quot; alt=&quot;&quot; width=&quot;916&quot; height=&quot;1486&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;安全驗證&quot;&gt;安全驗證&lt;/h4&gt;&lt;p&gt;尚未經過 Google 驗證，所以會出現警告訊息，保護使用者資料。&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/R9_h0CXx2J-1256.webp 1256w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/R9_h0CXx2J-1256.png&quot; alt=&quot;&quot; width=&quot;1256&quot; height=&quot;870&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;確認授權&quot;&gt;確認授權&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/QBw1Zo7KCP-920.webp 920w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/QBw1Zo7KCP-920.png&quot; alt=&quot;&quot; width=&quot;920&quot; height=&quot;1398&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;查看目前所有訂閱頻道&quot;&gt;查看目前所有訂閱頻道&lt;/h4&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/0y9uIDsV-k-1504.webp 1504w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/0y9uIDsV-k-1504.png&quot; alt=&quot;&quot; width=&quot;1504&quot; height=&quot;1134&quot;&gt;&lt;/picture&gt;&lt;p&gt;點擊【unsubscribe】就會直接取消訂閱選擇的頻道。&lt;br&gt;點擊【Unsubscribe All】就會取消訂閱所有的頻道。&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/huihere/youtube-app&quot;&gt;完整程式碼&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/unsubscribe&quot;&gt;測試網頁&lt;/a&gt;&lt;/ul&gt;&lt;h2 id=&quot;如何構建與發布&quot;&gt;如何構建與發布&lt;/h2&gt;&lt;p&gt;待續...</content>
  </entry>
  <entry>
    <title>TypeScript 入門：建立開發環境，並執行第一個 TypeScript 程式</title>
    <link href="https://kamadiam.com/typescript-getting-started/" />
    <updated>2023-11-26T19:59:54Z</updated>
    <id>https://kamadiam.com/typescript-getting-started/</id>
    <content type="html">&lt;p&gt;歡迎來到 TypeScript 的世界，一個讓 JavaScript 面面俱到的超級英雄！在這篇文章中，我們將一探 TypeScript 的奧秘，並學習如何在 macOS 上搭建開發環境和執行 TypeScript 程式。準備好開始吧！&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/typescript-getting-started/#%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B-TypeScript-%E9%96%8B%E7%99%BC%E7%92%B0%E5%A2%83&quot;&gt;如何建立 TypeScript 開發環境&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E5%AE%89%E8%A3%9D-Node.js&quot;&gt;安裝 Node.js&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E5%AE%89%E8%A3%9D-TypeScript-Compiler-(tsc)&quot;&gt;安裝 TypeScript Compiler (tsc)&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E5%88%9D%E5%A7%8B%E5%8C%96-tsconfig&quot;&gt;初始化 tsconfig&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E5%A6%82%E4%BD%95%E9%81%8B%E8%A1%8C-TypeScript&quot;&gt;如何運行 TypeScript&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E4%BD%BF%E7%94%A8-node&quot;&gt;使用 node&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#%E4%BD%BF%E7%94%A8-ts-node&quot;&gt;使用 ts-node&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#TypeScript-Playground&quot;&gt;TypeScript Playground&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#Deno&quot;&gt;Deno&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/typescript-getting-started/#Bun&quot;&gt;Bun&lt;/a&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;如何建立-TypeScript-開發環境&quot;&gt;如何建立 TypeScript 開發環境&lt;/h2&gt;&lt;p&gt;在 macOS 上搭建 TypeScript 開發環境就像是準備一頓豐盛的晚餐，你需要一些基本的食材和調味料。這裡，我們的食材包括 Node.js 和一個適當的 TypeScript 配置。&lt;h3 id=&quot;安裝-Node.js&quot;&gt;安裝 Node.js&lt;/h3&gt;&lt;p&gt;首先，你需要安裝 Node.js。Node.js 就像是廚房中的烤箱，是執行 JavaScript（和 TypeScript）的基本工具。&lt;ol&gt;&lt;li&gt;前往 &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js 官網&lt;/a&gt;。&lt;li&gt;選擇適合 macOS 的版本下載並安裝。&lt;/ol&gt;&lt;p&gt;也許你知道什麼是 Homebrew， 那就簡單了。&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;安裝-TypeScript-Compiler-(tsc)&quot;&gt;安裝 TypeScript Compiler (tsc)&lt;/h3&gt;&lt;p&gt;&lt;code&gt;tsc&lt;/code&gt; 即 TypeScript 編譯器，是 TypeScript 生態系統中的關鍵工具。TypeScript 編譯器負責將 TypeScript 程式碼（包含型別註釋和現代 JavaScript 特性）轉換成純 JavaScript 程式碼，這樣的程式碼能夠在任何 JavaScript 環境中執行，比如瀏覽器或 Node.js。&lt;p&gt;要使用 &lt;code&gt;tsc&lt;/code&gt;，你通常會透過 Node.js package manager 在全域或在你的專案中本地安裝 TypeScript。&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;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; typescript &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後運行 &lt;code&gt;tsc&lt;/code&gt; 命令，後跟你想編譯的檔案名稱。例如：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;tsc hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以下是 &lt;code&gt;tsc&lt;/code&gt; 的主要功能：&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;編譯&lt;/strong&gt;：&lt;code&gt;tsc&lt;/code&gt; 讀取 TypeScript 檔案（&lt;code&gt;.ts&lt;/code&gt; 或包含 JSX 時的 &lt;code&gt;.tsx&lt;/code&gt;），並輸出 JavaScript 檔案（&lt;code&gt;.js&lt;/code&gt;）。它根據 &lt;code&gt;tsconfig.json&lt;/code&gt; 檔案或命令列參數指定的選項進行編譯&lt;li&gt;&lt;p&gt;&lt;strong&gt;型別檢查&lt;/strong&gt;：在編譯過程中，&lt;code&gt;tsc&lt;/code&gt; 會檢查型別錯誤，如果程式碼不符合指定的型別約束，它將發出警告。這一步對於在開發過程早期捕獲錯誤至關重要&lt;li&gt;&lt;p&gt;&lt;strong&gt;配置&lt;/strong&gt;：您可以使用 &lt;code&gt;tsconfig.json&lt;/code&gt; 檔案對編譯器進行微調，其中包括設定哪些檔案包含在內、編譯到哪個版本的 JavaScript、是否產生來源映射（source maps）以便於除錯等&lt;li&gt;&lt;p&gt;&lt;strong&gt;整合&lt;/strong&gt;：&lt;code&gt;tsc&lt;/code&gt; 可以整合到建置過程中，並得到各種 IDE 的支援，提供即時的錯誤資訊和程式碼編寫回饋&lt;/ul&gt;&lt;h3 id=&quot;初始化-tsconfig&quot;&gt;初始化 tsconfig&lt;/h3&gt;&lt;p&gt;接下來，我們需要初始化 TypeScript 的配置文件 &lt;code&gt;tsconfig.json&lt;/code&gt;。這個文件就像是食譜，告訴 TypeScript 如何處理你的代碼。&lt;p&gt;&lt;code&gt;tsconfig.json&lt;/code&gt; 是 TypeScript 專案的配置檔案，它指導 TypeScript 編譯器（tsc）如何編譯 TypeScript 程式碼。這個檔案允許開發者設定編譯選項，並定義哪些檔案應該被包含或排除在編譯過程之外。&lt;p&gt;打開終端機（Terminal），執行以下命令來初始化 TypeScript 配置：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;tsc &lt;span class=&quot;token parameter variable&quot;&gt;--init&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這會在你的專案目錄中建立一個 &lt;code&gt;tsconfig.json&lt;/code&gt; 檔案。&lt;p&gt;一個基本的 &lt;code&gt;tsconfig.json&lt;/code&gt; 可能看起來像這樣：&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;compilerOptions&quot;&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 property&quot;&gt;&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;es5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;commonjs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;strict&quot;&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 property&quot;&gt;&quot;outDir&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist&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;這個配置會告訴 TypeScript 編譯器目標是 ES5 版本的 JavaScript，並使用 CommonJS 模組系統。&lt;code&gt;&amp;quot;strict&amp;quot;: true&lt;/code&gt; 開啟所有嚴格的型別檢查選項，確保編譯過程中進行嚴格的型別檢查。&lt;h2 id=&quot;如何運行-TypeScript&quot;&gt;如何運行 TypeScript&lt;/h2&gt;&lt;p&gt;TypeScript 的世界充滿了多種執行程式碼的方式，就像你可以用不同的烹飪方式來準備一道菜。&lt;h3 id=&quot;使用-node&quot;&gt;使用 node&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/mjw25JAzIw-260.webp 260w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/mjw25JAzIw-260.png&quot; alt=&quot;&quot; width=&quot;260&quot; height=&quot;76&quot;&gt;&lt;/picture&gt;&lt;p&gt;事實上你無法使用 node 直接執行 TypeScript 程式，必須先使用 &lt;code&gt;tsc&lt;/code&gt; 將 TypeScript 編譯成 JavaScript 程式，然後才可以使用 node 執行。&lt;p&gt;首先，安裝 TypeScript：&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;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; typescript &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後，使用 &lt;code&gt;tsc&lt;/code&gt; 編譯你的 TypeScript 文件：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;tsc hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這會生成一個 &lt;code&gt;hello.js&lt;/code&gt; 文件。現在，使用 Node.js 運行這個文件：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; hello.js&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;使用-ts-node&quot;&gt;使用 ts-node&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/d4CRhH_XJT-1376.webp 1376w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/d4CRhH_XJT-1376.png&quot; alt=&quot;&quot; width=&quot;1376&quot; height=&quot;522&quot;&gt;&lt;/picture&gt;&lt;p&gt;&lt;code&gt;ts-node&lt;/code&gt; 是一個方便的工具，可以直接執行 TypeScript 程式碼，無需先將其編譯為 JavaScript。這就像是一個即食餐點，快速且方便。&lt;p&gt;安裝 &lt;code&gt;ts-node&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 function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; ts-node &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後直接執行你的 TypeScript 檔案：&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;ts&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;node hello&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ts&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;TypeScript-Playground&quot;&gt;TypeScript Playground&lt;/h3&gt;&lt;p&gt;如果你不想在本地安裝任何東西，TypeScript Playground 是一個線上沙盒工具，讓你可以寫 TypeScript 並即時看到結果。&lt;p&gt;訪問 &lt;a href=&quot;https://www.typescriptlang.org/play&quot;&gt;TypeScript Playground&lt;/a&gt; 並開始玩轉 TypeScript！&lt;h3 id=&quot;Deno&quot;&gt;Deno&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/zTuxuQvDXq-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/zTuxuQvDXq-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;116&quot;&gt;&lt;/picture&gt;&lt;p&gt;Deno 是一個現代的 JavaScript/TypeScript 執行環境，內建了很多好玩的特性。它就像是一個高科技廚房，擁有你需要的一切。&lt;p&gt;安裝 Deno：&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;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; deno &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然後，編寫你的第一個 TypeScript 程式，並使用 Deno 執行它。&lt;p&gt;Deno 會自動處理 TypeScript 的編譯工作。&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 comment&quot;&gt;// hello.ts&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello from Deno!&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;執行它：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;deno run hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;Bun&quot;&gt;Bun&lt;/h3&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/t8mUqWJJcj-300.webp 300w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/t8mUqWJJcj-300.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;116&quot;&gt;&lt;/picture&gt;&lt;p&gt;Bun 是一個新興的 JavaScript 執行環境，專注於效能和開發者體驗。想像一下，一個超級充電的廚房機器人幫助你烹飪！&lt;p&gt;安裝 Bun：&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;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; bun &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;編寫你的 TypeScript 程式：&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 comment&quot;&gt;// hello.ts&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello from Bun!&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;使用 Bun 執行它：&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;bun run hello.ts&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;恭喜你，你已經完成了 TypeScript 的入門課程！現在，你可以開始探索這個強大語言的更多可能性了。記住，編程就像烹飪一樣，要不斷嘗試新的配方和工具。祝你在 TypeScript 的旅程中玩得開心！ 🚀🎉</content>
  </entry>
  <entry>
    <title>PHP Operators 大全，一次看懂所有運算子</title>
    <link href="https://kamadiam.com/php-operators/" />
    <updated>2023-11-25T16:49:14Z</updated>
    <id>https://kamadiam.com/php-operators/</id>
    <content type="html">&lt;p&gt;PHP 是一種廣泛使用的腳本語言，擁有豐富的運算子。理解這些 PHP Operators 是掌握 PHP 程式設計的關鍵。本篇文章將提供清晰的範例和解釋。&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/php-operators/#%E7%AE%97%E8%A1%93%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;算術運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E5%8A%A0%E6%B3%95(+)&quot;&gt;加法（+）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E6%B8%9B%E6%B3%95(-)&quot;&gt;減法（-）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%B9%98%E6%B3%95(*)&quot;&gt;乘法（*）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%99%A4%E6%B3%95(/)&quot;&gt;除法（/）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E6%A8%A1%E6%95%B8(%)&quot;&gt;模數（%）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E6%8C%87%E6%95%B8(**)&quot;&gt;指數（**）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E8%B3%A6%E5%80%BC%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;賦值運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E5%9F%BA%E6%9C%AC%E8%B3%A6%E5%80%BC(=)&quot;&gt;基本賦值（=）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E7%B5%84%E5%90%88%E9%81%8B%E7%AE%97%E5%AD%90-(+=)&quot;&gt;組合運算子 (+=)&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E6%AF%94%E8%BC%83%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;比較運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E7%9B%B8%E7%AD%89(==)&quot;&gt;相等（==）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E5%AE%8C%E5%85%A8%E7%9B%B8%E5%90%8C(===)&quot;&gt;完全相同（===）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%81%9E%E5%A2%9E/%E9%81%9E%E6%B8%9B%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;遞增/遞減運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%81%9E%E5%A2%9E(++)&quot;&gt;遞增（++）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%81%9E%E6%B8%9B(--)&quot;&gt;遞減（--）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%82%8F%E8%BC%AF%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;邏輯運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#And(&amp;&amp;and)&quot;&gt;And（&amp;amp;&amp;amp;、and）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#Or(||or)&quot;&gt;Or（||、or）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#Not(!)&quot;&gt;Not（!）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#Xor(xor)&quot;&gt;Xor（xor）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E5%AD%97%E4%B8%B2%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;字串運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%B8%B2%E6%8E%A5(..=)&quot;&gt;串接（.、.=）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%99%A3%E5%88%97%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;陣列運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E8%81%AF%E5%90%88(+)&quot;&gt;聯合（+）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E7%9B%B8%E7%AD%89(==)&quot;&gt;相等（==）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E7%B5%95%E5%B0%8D%E7%9B%B8%E5%90%8C(===)&quot;&gt;絕對相同（===）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%B8%8D%E7%9B%B8%E7%AD%89(!=-%E6%88%96-%3C%3E)&quot;&gt;不相等（!= 或 &amp;lt;&amp;gt;）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%9D%9E%E5%AE%8C%E5%85%A8%E7%9B%B8%E5%90%8C(!==)&quot;&gt;非完全相同（!==）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E6%A2%9D%E4%BB%B6(%E4%B8%89%E5%85%83)%E9%81%8B%E7%AE%97%E5%AD%90(?-:)&quot;&gt;條件（三元）運算子（? :）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E7%A9%BA%E5%90%88%E4%BD%B5%E9%81%8B%E7%AE%97%E5%AD%90(??)&quot;&gt;空合併運算子（??）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%8C%AF%E8%AA%A4%E6%8E%A7%E5%88%B6%E9%81%8B%E7%AE%97%E5%AD%90(@)&quot;&gt;錯誤控制運算子（@）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E9%A1%9E%E5%9E%8B%E9%81%8B%E7%AE%97%E5%AD%90(instanceof)&quot;&gt;類型運算子（instanceof）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%BD%8D%E5%85%83%E9%81%8B%E7%AE%97%E5%AD%90&quot;&gt;位元運算子&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%BD%8D%E5%85%83-AND(&amp;)&quot;&gt;位元 AND（&amp;amp;）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%BD%8D%E5%85%83-OR(|)&quot;&gt;位元 OR（|）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%BD%8D%E5%85%83-XOR(^)&quot;&gt;位元 XOR（^）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E4%BD%8D%E5%85%83-NOT(~)&quot;&gt;位元 NOT（~）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E5%B7%A6%E7%A7%BB(%3C%3C)&quot;&gt;左移（&amp;lt;&amp;lt;）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E5%8F%B3%E7%A7%BB(%3E%3E)&quot;&gt;右移（&amp;gt;&amp;gt;）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/php-operators/#%E7%B8%BD%E7%B5%90&quot;&gt;總結&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;算術運算子&quot;&gt;算術運算子&lt;/h2&gt;&lt;p&gt;算術運算子用於基本的數學運算。&lt;h3 id=&quot;加法(+)&quot;&gt;加法（&lt;code&gt;+&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將兩個值相加。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：8&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;減法(-)&quot;&gt;減法（&lt;code&gt;-&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;從一個值中減去另一個值。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;乘法(*)&quot;&gt;乘法（&lt;code&gt;*&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將兩個值相乘。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：15&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;除法(/)&quot;&gt;除法（&lt;code&gt;/&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將一個值除以另一個值。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;模數(%)&quot;&gt;模數（&lt;code&gt;%&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;返回除法的餘數。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;指數(**)&quot;&gt;指數（&lt;code&gt;**&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;次方。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：125&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;賦值運算子&quot;&gt;賦值運算子&lt;/h2&gt;&lt;p&gt;賦值運算子用於將值寫入變數。&lt;h3 id=&quot;基本賦值(=)&quot;&gt;基本賦值（&lt;code&gt;=&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將值賦給變數。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;組合運算子-(+=)&quot;&gt;組合運算子 (&lt;code&gt;+=&lt;/code&gt;)&lt;/h3&gt;&lt;p&gt;結合算術操作和賦值。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 等同於 $a = $a + 3&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：8&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;對於 &lt;code&gt;-=&lt;/code&gt;（減法賦值）、&lt;code&gt;*=&lt;/code&gt;（乘法賦值）、&lt;code&gt;/=&lt;/code&gt;（除法賦值）、&lt;code&gt;%=&lt;/code&gt;（模數賦值）、&lt;code&gt;**=&lt;/code&gt;（指數賦值）和 &lt;code&gt;.=&lt;/code&gt;（串接賦值）都是一樣的邏輯。&lt;h2 id=&quot;比較運算子&quot;&gt;比較運算子&lt;/h2&gt;&lt;p&gt;比較運算子用來比較兩個值。&lt;h3 id=&quot;相等(==)&quot;&gt;相等（&lt;code&gt;==&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;檢查兩個值是否相等。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;完全相同(===)&quot;&gt;完全相同（&lt;code&gt;===&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;檢查值是否相等且類型相同。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(false)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;!=&lt;/code&gt;（不等於）、&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;（不等於）、&lt;code&gt;!==&lt;/code&gt;（非完全相同）、&lt;code&gt;&amp;gt;&lt;/code&gt;（大於）、&lt;code&gt;&amp;lt;&lt;/code&gt;（小於）、&lt;code&gt;&amp;gt;=&lt;/code&gt;（大於等於）、&lt;code&gt;&amp;lt;=&lt;/code&gt;（小於等於）都是比較兩個值，得到一個布林值。&lt;h2 id=&quot;遞增/遞減運算子&quot;&gt;遞增/遞減運算子&lt;/h2&gt;&lt;p&gt;用於增加或減少變數的值。&lt;h3 id=&quot;遞增(++)&quot;&gt;遞增（&lt;code&gt;++&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將變數的值增加一。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$a&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 keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：6&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;遞減(--)&quot;&gt;遞減（&lt;code&gt;--&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將變數的值減少一。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$a&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 keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;邏輯運算子&quot;&gt;邏輯運算子&lt;/h2&gt;&lt;p&gt;邏輯運算子用於根據一個或多個條件來決定布林值（真或假）。&lt;h3 id=&quot;And(&amp;&amp;and)&quot;&gt;And（&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;、&lt;code&gt;and&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;當且僅當兩個操作數都為真時，結果才為真。&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 和 &lt;code&gt;and&lt;/code&gt; 在功能上是相同的，但 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 的優先級更高。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(false)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(false)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;Or(||or)&quot;&gt;Or（&lt;code&gt;||&lt;/code&gt;、&lt;code&gt;or&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;當至少一個操作數為真時，結果為真。&lt;code&gt;||&lt;/code&gt; 和 &lt;code&gt;or&lt;/code&gt; 在功能上是相同的，但 &lt;code&gt;||&lt;/code&gt; 的優先級更高。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;Not(!)&quot;&gt;Not（&lt;code&gt;!&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;用於反轉操作數的布林值。如果操作數為真，則返回假，反之亦然。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&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 comment&quot;&gt;// 輸出：bool(false)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;Xor(xor)&quot;&gt;Xor（&lt;code&gt;xor&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;當兩個操作數中僅有一個為真時，結果為真。如果兩個操作數都是真或都是假，則結果為假。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;xor&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(false)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;字串運算子&quot;&gt;字串運算子&lt;/h2&gt;&lt;p&gt;字串運算子用於操作字串。&lt;h3 id=&quot;串接(..=)&quot;&gt;串接（&lt;code&gt;.&lt;/code&gt;、&lt;code&gt;.=&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;連接兩個字串。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot; World&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：Hello World&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;陣列運算子&quot;&gt;陣列運算子&lt;/h2&gt;&lt;p&gt;陣列運算子用於比較和合併陣列，這些運算子使得處理陣列成為一個更加簡單的控制方式。&lt;h3 id=&quot;聯合(+)&quot;&gt;聯合（&lt;code&gt;+&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;聯合運算子用於合併兩個陣列。如果有重複的鍵，則以左邊陣列的鍵值為準。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&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 double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&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 variable&quot;&gt;$b&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 double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;berry&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;c&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;cherry&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 variable&quot;&gt;$result&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;print_r&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$result&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 comment&quot;&gt;// 輸出：Array ([a] =&gt; apple [b] =&gt; banana [c] =&gt; cherry)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;相等(==)-2&quot;&gt;相等（&lt;code&gt;==&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;如果兩個陣列具有相同的鍵值對，則這兩個陣列相等。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&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 double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&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 variable&quot;&gt;$b&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 double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&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;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;絕對相同(===)&quot;&gt;絕對相同（&lt;code&gt;===&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;不僅內容必須相同，陣列中的元素順序和類型也必須完全一致。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&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 double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&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 variable&quot;&gt;$b&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 double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&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 variable&quot;&gt;$c&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 double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&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;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(false)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$c&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;不相等(!=-或-&lt;&gt;)&quot;&gt;不相等（&lt;code&gt;!=&lt;/code&gt; 或 &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;如果兩個陣列的鍵值對不完全相同，則它們不相等。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&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 double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&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 variable&quot;&gt;$b&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 double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;berry&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&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;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;非完全相同(!==)&quot;&gt;非完全相同（&lt;code&gt;!==&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;如果兩個陣列在類型、值、順序或類型中有任何差異，則它們不完全相同。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&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 double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&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 variable&quot;&gt;$b&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 double-quoted-string&quot;&gt;&quot;b&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;banana&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;a&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;apple&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;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;條件(三元)運算子(?-:)&quot;&gt;條件（三元）運算子（&lt;code&gt;? :&lt;/code&gt;）&lt;/h2&gt;&lt;p&gt;為條件語句提供簡寫。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Greater&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Lesser&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;空合併運算子(??)&quot;&gt;空合併運算子（&lt;code&gt;??&lt;/code&gt;）&lt;/h2&gt;&lt;p&gt;Null Coalescing Operator，返回第一個非空值，意思是如果第一個值是空值就返回第二個值。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：value&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;也可以串接使用：&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：value&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;參考：&lt;a href=&quot;https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce&quot;&gt;Null Coalescing Operator&lt;/a&gt;&lt;h2 id=&quot;錯誤控制運算子(@)&quot;&gt;錯誤控制運算子（&lt;code&gt;@&lt;/code&gt;）&lt;/h2&gt;&lt;p&gt;抑制錯誤訊息。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; @&lt;span class=&quot;token function&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;nonexistentfile.txt&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;這樣會抑制 &lt;code&gt;file_get_contents&lt;/code&gt; 拋出錯誤。&lt;h2 id=&quot;類型運算子(instanceof)&quot;&gt;類型運算子（&lt;code&gt;instanceof&lt;/code&gt;）&lt;/h2&gt;&lt;p&gt;檢查物件是否為特定類別。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name-definition class-name&quot;&gt;MyClass&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 variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&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 comment&quot;&gt;// 輸出：bool(true)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;位元運算子&quot;&gt;位元運算子&lt;/h2&gt;&lt;p&gt;位元運算子用來對整數中的位元進行操作，這些運算子通常用於高效率的資料處理和底層資料操作。&lt;h3 id=&quot;位元-AND(&amp;)&quot;&gt;位元 AND（&lt;code&gt;&amp;amp;&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;位元 AND 運算子。只有當兩個相對應的位元都是 1 時，結果位元才是 1。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 1001 in binary&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 0101 in binary&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：1 (0001 in binary)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;位元-OR(|)&quot;&gt;位元 OR（&lt;code&gt;|&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;位元 OR 運算子。如果兩個相對應的位元中至少有一個是 1，則結果位元是 1。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 1001 in binary&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 0101 in binary&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：13 (1101 in binary)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;位元-XOR(^)&quot;&gt;位元 XOR（&lt;code&gt;^&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;位元 XOR 運算子。當兩個相對應的位元不同時，結果位元是 1。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 1001 in binary&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 0101 in binary&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：12 (1100 in binary)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;位元-NOT(~)&quot;&gt;位元 NOT（&lt;code&gt;~&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;位元 NOT 運算子。對整數的位元進行反轉，即 0 變 1，1 變 0。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 1001 in binary&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：-10（二進位補碼表示）&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;左移(&lt;&lt;)&quot;&gt;左移（&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將整數的位元向左移動指定的位數（右邊補 0）。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 1001 in binary&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：36 (100100 in binary)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;右移(&gt;&gt;)&quot;&gt;右移（&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;）&lt;/h3&gt;&lt;p&gt;將整數的位元向右移動指定的位數。&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 1001 in binary&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 輸出：2 (10 in binary)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;這些位元運算子在處理效能敏感或底層資料操作的場景中特別有用，例如在加密、圖像處理、自訂資料結構或低階網路通訊中。&lt;h2 id=&quot;總結&quot;&gt;總結&lt;/h2&gt;&lt;p&gt;以上每一個運算子都提供了特定功能，使得程式碼更加高效、靈活，並能夠處理各種複雜的資料操作和邏輯判斷。&lt;p&gt;運算子在程式語言中都有其獨特的角色，理解並運用這些運算子是走上 PHP 程式設計之路的重要一步。從基本的算術運算到複雜的陣列和位元操作，熟練掌握這些工具將使你能夠更深入地探索 PHP 的強大潛力，並開發出更加健壯和靈活的應用程式。&lt;p&gt;參考來源：&lt;a href=&quot;https://www.php.net/manual/en/language.operators.php&quot;&gt;php.language.operators&lt;/a&gt;</content>
  </entry>
  <entry>
    <title>justify-content vs align-content，Flexbox 的垂直與水平對齊方式</title>
    <link href="https://kamadiam.com/justify-content-vs-align-content/" />
    <updated>2023-11-23T18:12:50Z</updated>
    <id>https://kamadiam.com/justify-content-vs-align-content/</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/justify-content-vs-align-content/#%E4%BB%80%E9%BA%BC%E6%98%AF%E4%B8%BB%E8%BB%B8(Main-Axis)%E5%92%8C%E4%BA%A4%E5%8F%89%E8%BB%B8(Cross-Axis)&quot;&gt;什麼是主軸（Main Axis）和交叉軸（Cross Axis）&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#%E4%B8%BB%E8%BB%B8(Main-Axis)&quot;&gt;主軸（Main Axis）&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#%E4%BA%A4%E5%8F%89%E8%BB%B8(Cross-Axis)&quot;&gt;交叉軸（Cross Axis）&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#Flexbox-%E4%B8%AD%E7%9A%84-Justify-Content-%E8%88%87-Align-Content-%E6%AF%94%E8%BC%83&quot;&gt;Flexbox 中的 Justify-Content 與 Align-Content 比較&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#Justify-Content&quot;&gt;Justify-Content&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#Align-Content&quot;&gt;Align-Content&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#%E4%B8%BB%E8%A6%81%E5%B7%AE%E7%95%B0%E7%B8%BD%E7%B5%90&quot;&gt;主要差異總結&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/justify-content-vs-align-content/#%E7%A8%8B%E5%BC%8F%E7%AF%84%E4%BE%8B(%E4%B8%BB%E8%BB%B8%E4%BA%92%E6%8F%9B)&quot;&gt;程式範例（主軸互換）&lt;/a&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;CSS Flexbox 是一種用於在網頁上建立靈活佈局的 CSS3 佈局模型。它允許容器內的子元素能夠在需要時伸縮，以適應不同的顯示空間，其中最常使用的屬性就是 justify-content 和 align-content。&lt;h2 id=&quot;什麼是主軸(Main-Axis)和交叉軸(Cross-Axis)&quot;&gt;什麼是主軸（Main Axis）和交叉軸（Cross Axis）&lt;/h2&gt;&lt;p&gt;在 Flexbox 佈局中，主軸（Main Axis）和交叉軸（Cross Axis）是兩個關鍵概念，用來描述 Flexbox 內部項目的排列方式。理解這兩個軸線對於掌握對齊規則非常重要，因為 Flexbox 項目的排列會依據軸的走向，而有不同的方向效果。&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/NEInRwbErx-768.webp 768w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/NEInRwbErx-768.png&quot; alt=&quot;Pasted image 20231123164457.png&quot; width=&quot;768&quot; height=&quot;354&quot;&gt;&lt;/picture&gt;&lt;p&gt;圖片來源：&lt;a href=&quot;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot;&gt;A Complete Guide to Flexbox | CSS-Tricks&lt;/a&gt;&lt;h3 id=&quot;主軸(Main-Axis)&quot;&gt;主軸（Main Axis）&lt;/h3&gt;&lt;p&gt;主軸是 Flexbox 中項目排列的主要方向。在 Flexbox 中，您可以透過 &lt;code&gt;flex-direction&lt;/code&gt; 屬性來設定主軸的方向。&lt;p&gt;&lt;strong&gt;方向選擇：&lt;/strong&gt;&lt;p&gt;當 &lt;code&gt;flex-direction: row&lt;/code&gt; 時，主軸沿水平方向，從左到右。&lt;p&gt;當 &lt;code&gt;flex-direction: row-reverse&lt;/code&gt; 時，主軸仍然是水平的，但方向從右到左。&lt;p&gt;當 &lt;code&gt;flex-direction: column&lt;/code&gt; 時，主軸變為垂直方向，從上到下。&lt;p&gt;當 &lt;code&gt;flex-direction: column-reverse&lt;/code&gt; 時，主軸仍為垂直方向，但方向從下到上。&lt;h3 id=&quot;交叉軸(Cross-Axis)&quot;&gt;交叉軸（Cross Axis）&lt;/h3&gt;&lt;p&gt;交叉軸一定垂直於主軸。&lt;p&gt;&lt;strong&gt;方向選擇：&lt;/strong&gt;&lt;p&gt;如果主軸是水平的（&lt;code&gt;flex-direction: row&lt;/code&gt; 或 &lt;code&gt;row-reverse&lt;/code&gt;），交叉軸則是垂直的。&lt;p&gt;如果主軸是垂直的（&lt;code&gt;flex-direction:column&lt;/code&gt; 或 &lt;code&gt;column-reverse&lt;/code&gt;），交叉軸則是水平的。&lt;h2 id=&quot;Flexbox-中的-Justify-Content-與-Align-Content-比較&quot;&gt;Flexbox 中的 Justify-Content 與 Align-Content 比較&lt;/h2&gt;&lt;p&gt;在 CSS Flexbox 佈局中，&lt;code&gt;justify-content&lt;/code&gt; 和 &lt;code&gt;align-content&lt;/code&gt; 是兩個核心屬性，用於調整 Flexbox 內項目的對齊和分布。&lt;h3 id=&quot;Justify-Content&quot;&gt;Justify-Content&lt;/h3&gt;&lt;p&gt;&lt;code&gt;justify-content&lt;/code&gt; 屬性用於沿著 Flexbox 的主軸對齊項目。主軸的方向由 &lt;code&gt;flex-direction&lt;/code&gt; 屬性決定。當我們使用 &lt;code&gt;justify-content&lt;/code&gt; 時，主要是針對主軸進行調整，它包含了多種值，例如：&lt;h4 id=&quot;flex-start&quot;&gt;&lt;code&gt;flex-start&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;使項目靠近主軸的起始端&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/a302aVE25w-1750.webp 1750w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/a302aVE25w-1750.png&quot; alt=&quot;&quot; width=&quot;1750&quot; height=&quot;1174&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;flex-end&quot;&gt;&lt;code&gt;flex-end&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;使項目靠近主軸的終端&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/uegwi4ulzX-1748.webp 1748w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/uegwi4ulzX-1748.png&quot; alt=&quot;&quot; width=&quot;1748&quot; height=&quot;1174&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;center&quot;&gt;&lt;code&gt;center&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;在主軸中心對齊項目&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/lj7T2gl3SM-1748.webp 1748w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/lj7T2gl3SM-1748.png&quot; alt=&quot;&quot; width=&quot;1748&quot; height=&quot;1168&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;space-betweenspace-around-和-space-evenly&quot;&gt;&lt;code&gt;space-between&lt;/code&gt;、&lt;code&gt;space-around&lt;/code&gt; 和 &lt;code&gt;space-evenly&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;則分別提供了不同的項目間距分布方式。&lt;h3 id=&quot;Align-Content&quot;&gt;Align-Content&lt;/h3&gt;&lt;p&gt;而 &lt;code&gt;align-content&lt;/code&gt; 屬性則是用於在 Flexbox 的交叉軸上對齊多行，且僅當容器為多行時（即 &lt;code&gt;flex-wrap&lt;/code&gt; 屬性為 &lt;code&gt;wrap&lt;/code&gt; 或 &lt;code&gt;wrap-reverse&lt;/code&gt;）才有效。&lt;p&gt;這個屬性不是對單個項目進行操作，而是針對整個行的對齊方式。例如，&lt;h4 id=&quot;flex-start-2&quot;&gt;&lt;code&gt;flex-start&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;使行靠近交叉軸的起始端&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/uMXEvOefgw-1752.webp 1752w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/uMXEvOefgw-1752.png&quot; alt=&quot;&quot; width=&quot;1752&quot; height=&quot;1184&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;flex-end-2&quot;&gt;&lt;code&gt;flex-end&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;靠近終端&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/OO_rM_Dt7F-1748.webp 1748w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/OO_rM_Dt7F-1748.png&quot; alt=&quot;&quot; width=&quot;1748&quot; height=&quot;1176&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;center-2&quot;&gt;&lt;code&gt;center&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;在交叉軸中心對齊。&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/LWADVZlkWE-1756.webp 1756w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/LWADVZlkWE-1756.png&quot; alt=&quot;&quot; width=&quot;1756&quot; height=&quot;1178&quot;&gt;&lt;/picture&gt;&lt;h4 id=&quot;space-betweenspace-around-和-stretch&quot;&gt;&lt;code&gt;space-between&lt;/code&gt;、&lt;code&gt;space-around&lt;/code&gt; 和 &lt;code&gt;stretch&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;則影響行間的分布和拉伸。&lt;h3 id=&quot;主要差異總結&quot;&gt;主要差異總結&lt;/h3&gt;&lt;h4 id=&quot;對齊軸線:&quot;&gt;&lt;strong&gt;對齊軸線&lt;/strong&gt;：&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; 在主軸上進行操作。&lt;li&gt;&lt;code&gt;align-content&lt;/code&gt; 在交叉軸上進行操作。&lt;/ul&gt;&lt;h4 id=&quot;適用情況:&quot;&gt;&lt;strong&gt;適用情況&lt;/strong&gt;：&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; 影響容器內的個別項目。&lt;li&gt;&lt;code&gt;align-content&lt;/code&gt; 影響多行 Flexbox 中的整行。&lt;/ul&gt;&lt;h4 id=&quot;有效條件:&quot;&gt;&lt;strong&gt;有效條件&lt;/strong&gt;：&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; 適用於單行和多行容器。&lt;li&gt;&lt;code&gt;align-content&lt;/code&gt; 需要多行（即設定了 &lt;code&gt;flex-wrap: wrap&lt;/code&gt;）才有效果。&lt;/ul&gt;&lt;h4 id=&quot;佈局影響:&quot;&gt;&lt;strong&gt;佈局影響&lt;/strong&gt;：&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;justify-content&lt;/code&gt; 決定項目在主軸上的間距和對齊方式。&lt;li&gt;&lt;code&gt;align-content&lt;/code&gt; 決定多行在交叉軸上的分布和間距。&lt;/ul&gt;&lt;h3 id=&quot;程式範例(主軸互換)&quot;&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 selector&quot;&gt;.flex-container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 影響 main axis 項目 */&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;align-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 影響 cross axis 項目分布 */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kamadiam.com/img/built/TGrTSOP366-1752.webp 1752w&quot;&gt;&lt;img src=&quot;https://kamadiam.com/img/built/TGrTSOP366-1752.png&quot; alt=&quot;&quot; width=&quot;1752&quot; height=&quot;1178&quot;&gt;&lt;/picture&gt;&lt;p&gt;在這個例子中，我們把 &lt;code&gt;flex-direction&lt;/code&gt; 改為 &lt;code&gt;column&lt;/code&gt;，所以主軸和交叉軸會互換，結果一樣都是置中對齊，但排列卻是不同的方向。&lt;p&gt;更多參考教學：&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://kamadiam.com/css-flexbox-tutorial/&quot;&gt;CSS Flexbox 佈局教學，附實用排版測試工具&lt;/a&gt;&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot;&gt;A Complete Guide to Flexbox | CSS-Tricks – CSS-Tricks&lt;/a&gt;&lt;/ul&gt;</content>
  </entry>
</feed>