# 瀏覽器擴充功能專案第一部分:關於瀏覽器的一切 ```mermaid journey title Your Browser Extension Development Journey section Foundation Understand browsers: 3: Student Learn extension types: 4: Student Setup development: 4: Student section Development Build interface: 4: Student Add functionality: 5: Student Handle data: 5: Student section Integration Test in browser: 5: Student Debug issues: 4: Student Polish experience: 5: Student ```  > 手繪筆記由 [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob) 提供 ## 課前測驗 [課前測驗](https://ff-quizzes.netlify.app/web/quiz/23) ### 簡介 瀏覽器擴充功能是增強網頁瀏覽體驗的小型應用程式。就像 Tim Berners-Lee 最初對互動式網路的願景一樣,擴充功能擴展了瀏覽器的功能,超越了簡單的文件檢視。從保護帳戶安全的密碼管理器到幫助設計師抓取完美色彩的色彩選擇器,擴充功能解決了日常瀏覽的挑戰。 在我們開始建立您的第一個擴充功能之前,先來了解瀏覽器的運作原理。就像 Alexander Graham Bell 在發明電話之前需要了解聲音傳輸一樣,了解瀏覽器的基本原理將幫助您創建能與現有瀏覽器系統無縫整合的擴充功能。 在本課程結束時,您將了解瀏覽器架構並開始建立您的第一個擴充功能。 ```mermaid mindmap root((Browser Architecture)) Core Components Rendering Engine JavaScript Engine Network Stack Storage APIs User Interface Address Bar Tab Management Bookmarks Extension Icons Extension System Manifest Files Content Scripts Background Pages Popup Windows Security Model Same-Origin Policy Permissions API Content Security Isolated Worlds Development Tools DevTools Integration Debug Console Performance Monitor Extension Inspector ``` ## 了解網頁瀏覽器 網頁瀏覽器本質上是一個複雜的文件解釋器。當您在地址欄輸入 "google.com" 時,瀏覽器會執行一系列複雜的操作——從全球伺服器請求內容,到解析並渲染代碼成為您看到的互動式網頁。 這個過程類似於 Tim Berners-Lee 在 1990 年設計的第一個網頁瀏覽器 WorldWideWeb,旨在讓超連結文件對每個人都可訪問。 ✅ **一點歷史**:第一個瀏覽器名為 'WorldWideWeb',由 Timothy Berners-Lee 爵士於 1990 年創建。  > 一些早期的瀏覽器,圖片來源 [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing) ### 瀏覽器如何處理網頁內容 從輸入 URL 到看到網頁的過程涉及幾個協調的步驟,這些步驟在幾秒鐘內完成: ```mermaid sequenceDiagram participant User participant Browser participant Extension participant DNS participant Server User->>Browser: Types URL and presses Enter Browser->>Extension: Trigger beforeRequest event Extension->>Extension: Check if URL needs modification Browser->>DNS: Looks up server IP address DNS->>Browser: Returns IP address Browser->>Server: Requests web page content Server->>Browser: Sends HTML, CSS, and JavaScript Browser->>Extension: Trigger beforeResponse event Extension->>Extension: Modify content if needed Browser->>User: Renders complete web page Extension->>User: Show extension UI updates ``` **這個過程完成了以下工作:** - **轉換** 人類可讀的 URL 為伺服器的 IP 地址,通過 DNS 查詢 - **建立** 使用 HTTP 或 HTTPS 協議與網頁伺服器的安全連接 - **請求** 從伺服器獲取特定網頁內容 - **接收** 伺服器提供的 HTML 標記、CSS 樣式和 JavaScript 代碼 - **渲染** 所有內容成為您看到的互動式網頁 ### 瀏覽器核心功能 現代瀏覽器提供了許多擴充功能開發者可以利用的功能: | 功能 | 目的 | 擴充功能機會 | |------|------|-------------| | **渲染引擎** | 顯示 HTML、CSS 和 JavaScript | 修改內容、注入樣式 | | **JavaScript 引擎** | 執行 JavaScript 代碼 | 自定義腳本、API 交互 | | **本地存儲** | 本地保存數據 | 用戶偏好、緩存數據 | | **網路堆疊** | 處理網頁請求 | 請求監控、數據分析 | | **安全模型** | 保護用戶免受惡意內容影響 | 內容過濾、安全增強 | **了解這些功能有助於您:** - **識別** 您的擴充功能可以增加最大價值的地方 - **選擇** 適合擴充功能功能的瀏覽器 API - **設計** 與瀏覽器系統高效協作的擴充功能 - **確保** 您的擴充功能遵循瀏覽器安全最佳實踐 ### 跨瀏覽器開發考量 不同的瀏覽器以略有不同的方式實現標準,類似於不同的程式語言可能以不同方式處理相同的算法。Chrome、Firefox 和 Safari 各自具有獨特的特性,開發者在開發擴充功能時必須考慮這些特性。 > 💡 **專業提示**:使用 [caniuse.com](https://www.caniuse.com) 檢查不同瀏覽器是否支持某些網頁技術。這在規劃擴充功能的功能時非常有用! **擴充功能開發的關鍵考量:** - **測試** 您的擴充功能在 Chrome、Firefox 和 Edge 瀏覽器上的表現 - **適應** 不同瀏覽器的擴充功能 API 和清單格式 - **處理** 不同的性能特性和限制 - **提供** 瀏覽器特定功能的備選方案,應對可能不可用的情況 ✅ **分析洞察**:您可以通過在網頁開發專案中安裝分析套件來確定用戶偏好的瀏覽器。這些數據幫助您優先支持最受歡迎的瀏覽器。 ## 了解瀏覽器擴充功能 瀏覽器擴充功能通過直接添加功能到瀏覽器介面來解決常見的網頁瀏覽挑戰。擴充功能提供了即時訪問工具和功能,而不需要單獨的應用程式或複雜的工作流程。 這個概念類似於早期計算機先驅如 Douglas Engelbart 所設想的通過技術增強人類能力——擴充功能增強了瀏覽器的基本功能。 ```mermaid quadrantChart title Browser Extension Categories x-axis Simple --> Complex y-axis Personal Use --> Professional Tools quadrant-1 Developer Tools quadrant-2 Enterprise Solutions quadrant-3 Personal Utilities quadrant-4 Productivity Apps Ad Blockers: [0.3, 0.2] Password Managers: [0.7, 0.3] Color Pickers: [0.4, 0.8] Code Formatters: [0.8, 0.9] Note Taking: [0.6, 0.5] Video Downloaders: [0.5, 0.2] Time Trackers: [0.7, 0.6] Screenshot Tools: [0.4, 0.4] ``` **流行的擴充功能類別及其好處:** - **生產力工具**:任務管理器、筆記應用程式和時間追蹤器幫助您保持組織性 - **安全增強**:密碼管理器、廣告攔截器和隱私工具保護您的數據 - **開發者工具**:代碼格式化工具、色彩選擇器和調試工具簡化開發過程 - **內容增強**:閱讀模式、視頻下載器和截圖工具改善您的網頁體驗 ✅ **反思問題**:您最喜歡的瀏覽器擴充功能是什麼?它們執行哪些特定任務,如何改善您的瀏覽體驗? ### 🔄 **教學檢查** **瀏覽器架構理解**:在進入擴充功能開發之前,確保您能夠: - ✅ 解釋瀏覽器如何處理網頁請求並渲染內容 - ✅ 識別瀏覽器架構的主要組成部分 - ✅ 理解擴充功能如何與瀏覽器功能整合 - ✅ 認識保護用戶的安全模型 **快速自我測試**:您能追溯從輸入 URL 到看到網頁的路徑嗎? 1. **DNS 查詢** 將 URL 轉換為 IP 地址 2. **HTTP 請求** 從伺服器獲取內容 3. **解析** 處理 HTML、CSS 和 JavaScript 4. **渲染** 顯示最終網頁 5. **擴充功能** 可以在多個步驟中修改內容 ## 安裝和管理擴充功能 了解擴充功能的安裝過程有助於您預測用戶在安裝您的擴充功能時的體驗。安裝過程在現代瀏覽器中是標準化的,介面設計略有不同。  > **重要**:在測試您自己的擴充功能時,請確保開啟開發者模式並允許來自其他商店的擴充功能。 ### 開發擴充功能安裝過程 當您開發和測試自己的擴充功能時,請遵循以下工作流程: ```mermaid flowchart TD A[Write Code] --> B[Build Extension] B --> C{First Install?} C -->|Yes| D[Load Unpacked] C -->|No| E[Reload Extension] D --> F[Test Functionality] E --> F F --> G{Working Correctly?} G -->|No| H[Debug Issues] G -->|Yes| I[Ready for Users] H --> A I --> J[Publish to Store] style A fill:#e1f5fe style F fill:#e8f5e8 style I fill:#f3e5f5 style J fill:#fff3e0 ``` ```bash # Step 1: Build your extension npm run build ``` **此命令完成的工作:** - **編譯** 您的源代碼為瀏覽器可用的文件 - **打包** JavaScript 模塊為優化的包 - **生成** 最終的擴充功能文件到 `/dist` 文件夾 - **準備** 您的擴充功能進行安裝和測試 **步驟 2:導航到瀏覽器擴充功能** 1. **打開** 瀏覽器的擴充功能管理頁面 2. **點擊** 右上角的 "設置和更多" 按鈕(`...` 圖標) 3. **選擇** 下拉菜單中的 "擴充功能" **步驟 3:加載您的擴充功能** - **對於新安裝**:選擇 `load unpacked` 並選擇您的 `/dist` 文件夾 - **對於更新**:點擊已安裝擴充功能旁邊的 `reload` - **對於測試**:啟用 "開發者模式" 以訪問額外的調試功能 ### 正式擴充功能安裝 > ✅ **注意**:這些開發指令專門針對您自己建立的擴充功能。要安裝已發布的擴充功能,請訪問官方瀏覽器擴充功能商店,例如 [Microsoft Edge 附加元件商店](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home)。 **理解差異:** - **開發安裝** 允許您在開發期間測試未發布的擴充功能 - **商店安裝** 提供經過審核的已發布擴充功能,並自動更新 - **側載** 允許從官方商店外安裝擴充功能(需要開發者模式) ## 建立您的碳足跡擴充功能 我們將創建一個瀏覽器擴充功能,顯示您所在地區能源使用的碳足跡。此專案展示了基本的擴充功能開發概念,同時創建了一個實用的環保工具。 這種方法遵循 "學以致用" 的原則,自 John Dewey 的教育理論以來已被證明有效——結合技術技能與有意義的現實應用。 ### 專案需求 在開始開發之前,讓我們收集所需的資源和依賴項: **所需 API 訪問:** - **[CO2 Signal API key](https://www.co2signal.com/)**:輸入您的電子郵件地址以獲取免費 API 密鑰 - **[地區代碼](http://api.electricitymap.org/v3/zones)**:使用 [Electricity Map](https://www.electricitymap.org/map) 查找您的地區代碼(例如,波士頓使用 'US-NEISO') **開發工具:** - **[Node.js 和 NPM](https://www.npmjs.com)**:用於安裝專案依賴項的套件管理工具 - **[起始代碼](../../../../5-browser-extension/start)**:下載 `start` 文件夾以開始開發 ✅ **了解更多**:通過此 [全面的學習模組](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon) 增強您的套件管理技能 ### 理解專案結構 理解專案結構有助於高效組織開發工作。就像亞歷山大圖書館為了方便知識檢索而組織一樣,良好的代碼結構使開發更高效: ``` project-root/ ├── dist/ # Built extension files │ ├── manifest.json # Extension configuration │ ├── index.html # User interface markup │ ├── background.js # Background script functionality │ └── main.js # Compiled JavaScript bundle ├── src/ # Source development files │ └── index.js # Your main JavaScript code ├── package.json # Project dependencies and scripts └── webpack.config.js # Build configuration ``` **分解每個文件的功能:** - **`manifest.json`**:**定義**擴充功能的元數據、權限和入口點 - **`index.html`**:**創建**用戶點擊擴充功能時出現的介面 - **`background.js`**:**處理**背景任務和瀏覽器事件監聽器 - **`main.js`**:**包含**編譯後的最終 JavaScript - **`src/index.js`**:**存放**主要開發代碼,最終編譯為 `main.js` > 💡 **組織提示**:將您的 API 密鑰和地區代碼存放在安全的筆記中,以便在開發期間輕鬆參考。您需要這些值來測試擴充功能的功能。 ✅ **安全提示**:切勿將 API 密鑰或敏感憑證提交到您的代碼庫。我們將在接下來的步驟中展示如何安全地處理這些信息。 ## 建立擴充功能介面 現在我們將建立用戶介面組件。該擴充功能使用兩個屏幕的方式:一個用於初始設置的配置屏幕,另一個用於顯示數據的結果屏幕。 這遵循自計算機早期以來在介面設計中使用的漸進披露原則——以邏輯順序揭示信息和選項,避免讓用戶感到不知所措。 ### 擴充功能視圖概述 **設置視圖** - 初次使用者配置:  **結果視圖** - 顯示碳足跡數據:  ### 建立配置表單 設置表單在初次使用時收集用戶配置數據。一旦配置完成,這些信息將保存在瀏覽器存儲中以供未來使用。 在 `/dist/index.html` 文件中,添加以下表單結構: ```html
``` **此表單完成的工作:** - **創建** 具有適當標籤和輸入關聯的語義表單結構 - **啟用** 瀏覽器自動完成功能以改善用戶體驗 - **要求** 使用 `required` 屬性在提交之前填寫所有字段 - **組織** 輸入,使用描述性類名便於樣式和 JavaScript 定位 - **提供** 清晰的指示,幫助首次設置擴充功能的用戶 ### 建立結果顯示 接下來,創建顯示碳足跡數據的結果區域。在表單下方添加以下 HTML: ```htmlRegion:
Carbon Usage:
Fossil Fuel Percentage: