---
# System prepended metadata

title: Build & Publish a Custom Google Chrome Extension
tags: [Chrome Extension]

---

# 專案目標與成品行為

* 用純 HTML（HTML）與 CSS（CSS）做一個「快速啟動器」Chrome 擴充功能（Chrome extension）
* 點擊工具列圖示後開啟 Popup（Popup），裡面是一排社群/網站連結
* 點擊連結會在新分頁開啟（target="_blank"）
* 用途偏新手入門：理解專案結構、manifest 設定、如何載入本地擴充功能、如何上架流程概念

# 專案資料夾與圖示資產規劃

* 建立專案資料夾（例如 traversee-launcher）
* 準備工具列用主圖示 icon.png（icon.png），尺寸 19×19
* 準備商店/擴充功能用大圖示 icon_128.png（icon_128.png），尺寸 128×128
* 另建 images（images）資料夾放 Popup 內顯示的 logo 圖（例如 traversee-logo.png），示範尺寸約 150×150
* 主圖示放在根目錄是因為它屬於擴充功能本體資源，Popup 內 logo 則放 images 便於管理

# manifest.json（Manifest V2）重點欄位

* manifest_version（manifest_version）使用 2（Manifest V2），並提醒不同時期可能需要查官方文件版本差異
* name（name）設定擴充功能名稱（例如 Traverse Launcher）
* description（description）設定簡短描述
* version（version）設定版本號（例如 1.0.0）
* icons（icons）指定 128px 圖示路徑（icon_128.png）
* browser_action（browser_action）用來定義工具列行為與 Popup
* browser_action.default_icon（default_icon）指定工具列 19px 圖示（icon.png）
* browser_action.default_popup（default_popup）指定 Popup HTML（popup.html）
* permissions（permissions）宣告權限，示範只用 activeTab（activeTab）

# 檔案建立：popup.html 與 popup.js

* 建立 popup.html（popup.html）作為 Popup 的 UI 入口
* 建立 popup.js（popup.js）作為未來需要互動邏輯時的腳本位置
* 本範例強調不需要 JavaScript（JavaScript），popup.js 先保留不用

# popup.html：外部資源引入

* 使用 Google Fonts（Google Fonts）載入 Open Sans（Open Sans）字體
* 使用 Font Awesome（Font Awesome）CDN 引入圖示字型與圖示 class
* 這些外部資源用 link（link tag）放在 head（head）內

# popup.html：結構區塊與語意

* modal-header（modal-header）區塊放標題與 logo
* logo（logo）標題內含圖片 logo-icon（logo-icon）與文字標題
* version（version）用 span（span）顯示版本字串（例如 1.0.0）
* modal-content（modal-content）放簡短描述文字
* modal-icons（modal-icons）放各平台捷徑圖示

# 連結清單與圖示呈現方式

* 使用 flex-container（flex-container）搭配 Flexbox（Flexbox）來排版
* 每個捷徑是一個 flex（flex）區塊，裡面是 a（anchor）連結
* 每個 a 內用 i（i tag）套 Font Awesome class，例如 fa fa-globe（fa fa-globe）
* 連結都加 target="_blank"（target="_blank"）確保在新分頁開啟
* 示範連結平台包含個人網站、YouTube、Twitter、Facebook、GitHub

# 本地預覽與目前畫面狀態

* 可直接用瀏覽器開啟 popup.html 先看靜態版
* 也可用 VS Code Live Server（Live Server）快速預覽
* 目前只完成 HTML 結構與外部資源引入，尚未加 CSS 樣式，因此畫面「不太好看」是預期狀態

---

# 在 popup.html 內加入 CSS 的方式

* 在 head（head）加入 style（style tag）直接寫內嵌樣式（Inline CSS）
* 這種做法適合小型 Popup，檔案少、好搬移，但專案變大會較難維護

# 全域樣式：html、body

* 設定字體為 Open Sans（Open Sans）與 sans-serif（sans-serif）
* 設定基本字級（font-size）為 14px
* 取消預設外距（margin: 0）與內距（padding: 0）
* 設定最小高度（min-height）180px，固定寬度（width）384px 讓 Popup 尺寸一致

# 標題樣式：h1（Logo 文字）

* 字體改用 Menlo（Menlo）作為標題字體
* 字級（font-size）22px、字重（font-weight）400，並把 margin 設為 0
* 設定品牌色（color）為 #2f5876

# 連結樣式：a:link、a:visited

* 連結顏色統一設為黑色（color: black）
* 移除外框（outline: 0）避免點擊後出現預設 focus 外框
* 移除底線（text-decoration: none）讓圖示連結更乾淨

# Logo 圖片樣式：img

* 設定寬度（width）30px 讓 Popup header 的 logo 不會太大
* 用於控制 header 中 logo-icon（logo-icon）的視覺比例

# Header 區塊：modal-header

* 使用 align-items: center（align-items: center）讓 header 內容垂直置中
* 加底部分隔線（border-bottom）0.5px solid #dadada 做出區塊切分感

# 內容區塊：modal-content

* 設定左右內距（padding）為 0 20px，讓文字不貼邊
* 上下留白較少以維持 Popup 精簡

# 圖示區塊：modal-icons

* 加上部分隔線（border-top）0.5px solid #dadada
* 固定高度（height）50px，寬度（width）100% 撐滿容器

# Logo 排版：logo、logo-icon

* logo（logo）加 padding 16px，讓 header 內部有舒服留白
* logo-icon（logo-icon）使用 vertical-align: text-bottom（vertical-align: text-bottom）讓圖標對齊文字基線
* logo-icon（logo-icon）加 margin-right 12px 讓圖標與標題文字有間距

# 版本字樣：version

* 顏色設為 #444（#444）降低存在感但仍清楚
* 字級（font-size）18px，與標題搭配不會太小

# 圖示列排版：flex-container

* 設定 display: flex（display: flex）使用 Flexbox（Flexbox）布局
* justify-content: space-between（justify-content: space-between）讓圖示平均分散
* padding 設 10px 20px，保留上下與左右的留白

# 單一圖示項目：flex 與 hover 效果

* flex（flex）預設透明度（opacity）1
* 加入 transition（transition）讓透明度變化更平滑：opacity 0.2s ease-in-out
* 設定 width 120px 控制每個圖示區塊寬度
* flex:hover（flex:hover）把 opacity 降到 0.4，達成滑過淡化效果

# Font Awesome 圖示大小與顏色

* 針對 .flex .fa（.flex .fa）設定 font-size 40px 放大圖示
* 圖示顏色（color）設為品牌色 #2f5876，與標題一致

# popup.js 的處理方式

* 雖然本範例不使用 JavaScript（JavaScript），仍在 popup.html 末端引入 popup.js（popup.js）
* 保留未來要加互動邏輯時的擴充空間

# 載入本地擴充功能測試

* 前往 chrome://extensions（chrome://extensions）並開啟開發者模式（Developer mode）
* 使用「Load unpacked」（Load unpacked）選取專案資料夾載入
* 若工具列沒有顯示圖示，可重啟 Chrome 或到拼圖選單固定（Pin）擴充功能
* 點擊工具列圖示會開啟 Popup，點擊任一圖示連結會以新分頁開啟

# 上架 Chrome Web Store 的流程重點

* 將整個專案資料夾壓縮為 zip（zip file）作為上傳檔
* 到 Chrome Web Store 開發者後台（Developer dashboard）選擇新增項目並上傳 zip
* 需要提供 128×128 圖示（128×128 icon）
* 需要提供至少一張截圖（Screenshot），尺寸建議 1280×800 或 640×400
* 送出後審核通過即可在商店搜尋到並安裝（Add to Chrome）


---


# Terminology
* 啟動器擴充套件（Launcher Extension）：以彈窗提供捷徑連結，快速開啟常用網站或工具的擴充型態
* 純前端擴充（HTML/CSS-only Extension）：不依賴 JavaScript 邏輯、以靜態頁面呈現功能的擴充做法
* Manifest v2（MV2, Manifest Version 2）：舊版擴充規格，使用 browser_action 等欄位描述行為
* manifest.json（擴充描述檔）：擴充套件的必要檔案，定義名稱、版本、權限、圖示與彈窗入口
* browser_action（工具列動作）：MV2 的工具列按鈕設定區，指定圖示與預設彈窗
* default_popup（預設彈窗）：指定點擊擴充圖示時顯示的 HTML 檔案
* default_icon（預設圖示）：指定工具列按鈕使用的圖示檔與對應尺寸
* icons 欄位（Icons Manifest Field）：宣告不同尺寸圖示供商店與系統介面使用
* 工具列圖示（Toolbar Icon）：顯示在瀏覽器工具列上的擴充按鈕圖示
* 應用程式圖示（App Icon）：用於商店列表、詳情頁與安裝流程的主要圖示（常見 128×128）
* 圖示尺寸規範（Icon Size Guidelines）：不同展示位置需要不同像素尺寸的圖示配置規則
* 彈窗頁面（Popup Page）：點擊擴充圖示後出現的小型 HTML 視窗，用於快速操作與導覽
* 外部連結（External Links）：在擴充彈窗中指向外部網站的超連結集合
* 新分頁開啟（target="_blank"）：讓連結在新分頁開啟以避免覆蓋目前工作頁面
* 活躍分頁權限（activeTab Permission）：允許擴充在使用者互動後暫時存取目前分頁的權限
* 權限最小化（Principle of Least Privilege）：只申請必要權限以降低風險並提升使用者信任
* 開發者模式（Developer Mode）：啟用後可載入未封裝擴充並查看錯誤與除錯資訊
* 載入未封裝擴充（Load Unpacked Extension）：直接從本機資料夾載入擴充進行測試的方式
* 本機測試（Local Testing）：在未上架前於本機環境反覆載入、驗證與調整的流程
* 資料夾結構（Project Folder Structure）：以根目錄放 manifest 與圖示、子目錄放資源的組織方式
* 靜態資源（Static Assets）：圖示、圖片、字型等不需編譯即可被引用的檔案
* 影像資源目錄（Images Directory）：集中管理彈窗內使用的圖片與品牌素材的資料夾
* 品牌識別（Branding）：透過顏色、字體、Logo 一致化提升辨識度與專業感的設計策略
* Google Fonts（Google 字型服務）：以 CDN 載入網頁字型的服務，常用於提升排版一致性
* Open Sans（Open Sans）：常用的無襯線網頁字體，適合 UI 與資訊呈現
* 字型後備（Font Fallback）：當主要字體不可用時，指定替代字體以確保顯示穩定
* Font Awesome（Font Awesome）：以圖示字型／SVG 提供大量通用圖示的前端資源庫
* CDN（Content Delivery Network）：透過分散節點加速載入第三方資源的網路分發方式
* Link 標籤載入（<link rel="stylesheet">）：在 HTML 中引入外部 CSS 的標準做法
* Emmet（Emmet）：用縮寫快速生成 HTML/CSS 結構的編輯器工具
* Flexbox（CSS Flexible Box Layout）：用於一維佈局的 CSS 模型，適合對齊與分配空間
* Flex 容器（Flex Container）：設定 display:flex 的父元素，控制子元素排列方式
* justify-content（主軸對齊）：控制 Flex 子項在主軸上的對齊與空間分配（如 space-between）
* space-between（兩端對齊分散）：在 Flex 主軸上把剩餘空間平均分配到項目間的值
* 盒模型（Box Model）：CSS 對元素內容、內距、邊框、外距的尺寸計算模型
* 內距（Padding）：元素內容與邊框之間的空間，用於留白與提升可讀性
* 外距（Margin）：元素與元素之間的空間，用於版面間隔與視覺節奏
* 邊框（Border）：元素邊緣線條，可用於分隔區塊與建立層次
* 最小高度（min-height）：限制元素最小高度，確保彈窗不會過小影響閱讀
* 固定寬度（Fixed Width）：用固定像素設定彈窗寬度，避免版面在不同內容下抖動
* 透明度（Opacity）：控制元素不透明度，常用於 hover 視覺回饋
* 過渡效果（CSS Transition）：讓樣式變更以動畫方式平滑呈現的 CSS 機制
* easing（Ease-in-out）：過渡曲線，讓動畫開始與結束更自然、減少突兀感
* hover 狀態（:hover Pseudo-class）：滑鼠懸停時套用的樣式狀態，用於互動提示
* 文字裝飾（text-decoration）：控制連結底線等文字修飾，常用於移除預設下劃線
* 連結狀態（:link/:visited）：控制未點擊與已造訪連結的樣式一致性與可讀性
* Web Store 開發者後台（Chrome Web Store Developer Dashboard）：管理上架、版本、素材與審核流程的控制台
* 打包壓縮（ZIP Packaging）：將擴充檔案壓縮成 ZIP 以便上傳到商店審核
* 商店素材（Store Listing Assets）：上架所需的圖示、截圖、描述與宣傳圖等資產
* 截圖規格（Screenshot Requirements）：商店要求的最小解析度與尺寸比例（如 1280×800 或 640×400）
* 上架審核（Review & Publishing）：提交後由商店流程檢查合規與內容，通過後公開可安裝
* 搜尋可見度（Store Search Visibility）：在商店搜尋結果中的曝光能力，影響自然安裝量
