」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 建立 Chrome 擴充功能:快速概述

建立 Chrome 擴充功能:快速概述

發佈於2024-11-08
瀏覽:955

Building Chrome Extensions : A Quick Overview

模组——修改? 如果您喜欢游戏,您就会知道没有什么比玩模组游戏更好的了。这是您最喜欢的游戏,但具有额外的功能、功能和乐趣。现在,想象一下为您的网络浏览体验带来同样的兴奋。这正是浏览器扩展的作用——它们就像浏览器的模组,以您从未想过的方式增强浏览器的功能。

通过 Chrome 扩展程序,您可以调整浏览器以完美满足您的需求 - 无论是阻止特定 URL、添加新功能,还是赋予浏览器全新的外观。最好的部分是什么?您可以自己构建这些扩展。在本指南中,我将引导您逐步完成创建自己的 Chrome 扩展程序的过程。


开始使用 Web 扩展比您想象的要容易!如果您了解 JavaScript,那就轻而易举了 — 只需学习一个新的 API 即可。毕竟,它的核心仍然是 JavaScript。

本文是对以下内容的补充:Chrome 扩展手册:内存繁重到生产就绪


目录

  • 网络扩展 101
  • 分解清单:
  • 构建一个简单的图像下载器
  • 下载功能:
  • 我们已准备好测试我们的扩展
  • 加载扩展
  • 结论

网络扩展 101

Web 扩展类似于 mod,但适用于浏览器。您可以完全自定义浏览器的行为方式(例如 AdBlock)或浏览器的外观,例如 Mozilla 主题。

首先,创建一个新文件夹!

您所需要的只是一个manifest.json。这是主要功能,但用于网络扩展。这是浏览器查找的第一个文件!

{
    "manifest_version": 3,
    "name": "img-downl",
    "version": "1.0",
    "description": "image ac?",
    "content_scripts": [
        {
            "matches": [""],
            "js": ["content.js"]
        }
    ],
    "permissions": [
        "activeTab"
    ]
}

清单包含您的扩展程序的所有元数据。这就是浏览器如何理解您的扩展及其功能的方式。


分解清单:

  • “清单版本”:3, 这会告诉浏览器您将使用的 API 版本。版本 2 是之前的版本,版本 3 (V3) 是最新的 API。它更加安全、性能更高,并且大多数浏览器(包括 Chrome)已仅迁移至版本 3。

一个关键区别是从持久后台脚本转移到服务工作者。 V2 中的后台脚本在扩展的整个生命周期内运行(当用户浏览时),因此具有“持久”方面。在V3中,它们只在必要时运行!

  • 内容脚本: 内容脚本被注入到网页本身中。在我们的小扩展中,content.js 将被注入到任何匹配“matches”的 URL:[“”]。因此,当您浏览到任何 URL 或打开新选项卡时,content.js 将被注入到页面中并运行。

内容脚本与后台脚本不同,可以访问 DOM。

这是一个简单插件的基本剖析。当您构建更多扩展项目时,您将了解权限和附加功能。作为介绍,这个简单的细分就足够了。


构建一个简单的图像下载器

准备好?

这个扩展的灵感来自于我不久前参加的计算机视觉课程。我们需要实现一个从 Google 搜索下载图像的工具。

注意:我不建议始终运行此扩展程序,除非您每次浏览时都想下载图像。

在与manifest.json相同的文件夹中,创建content.js并粘贴以下内容:

async function processAllImages() {
    const images = document.querySelectorAll('img');
    let count = 0;
    for (const img of images) {
        const url = img.src;
        const filename = `image${count  }.png`; // Generate a filename for each image
        try {
            await downloadImage(url, filename);
            console.log(`Downloaded ${filename}`);
        } catch (error) {
            console.error(`Error downloading image from ${url}:`, error);
        }
    }
}
// Run the function to process and download images
processAllImages();

请记住,内容脚本被注入到网页中。例如,当您导航到 example.com 时,processAllImages 将运行。

它所做的就是抓取所有图像元素并将它们传递给下载功能:

const images = document.querySelectorAll('img');

下载功能:

async function downloadImage(url, filename) {
    return new Promise((resolve, reject) => {
        fetch(url)
            .then(response => {
                if (!response.ok) throw new Error('Network response was not ok.');
                return response.blob();
            })
            .then(blob => {
                const a = document.createElement('a');
                a.href = URL.createObjectURL(blob);
                a.download = filename;
                a.style.display = 'none';
                document.body.appendChild(a);
                a.click();
                URL.revokeObjectURL(a.href); // Clean up the object URL
                document.body.removeChild(a);
                resolve();
            })
            .catch(error => reject(error));
    });
}

注意:这仅适用于静态图像。动态和延迟加载的图像可能会损坏 - 这是您可以在未来迭代中处理的事情。


我们准备好测试我们的扩展

我使用的是 Brave,它基于 Chrome,但跨浏览器的过程是相似的。

要进行测试,您需要在所选浏览器中启用开发者模式。


加载扩展

此扩展未更改,也应该可以在 Mozilla 中运行,因为我们不依赖 Chrome 命名空间。

勇敢的:

              在地址栏中输入brave://extensions/。        

              启用开发者模式。      

              通过选择文件夹加载扩展程序。
             

Chrome 和 Edge:遵循与 Brave 类似的步骤。

         (chrome://extensions/ 或 edge://extensions/)

     


结论

模组——修改很有趣!此扩展可能很简单,但它展示了帮助您入门的基础知识。 Mozilla 的 MDN 拥有完美的资源,可帮助您加深对 Web 扩展的了解(包括一般 Web 扩展和特定于浏览器的扩展)。

记住:完成后关闭扩展或将其卸载,以避免不需要的下载。

或者更好...

挑战:找出一种接收输入的方法(提示:单击、图标和后台脚本)并仅在用户单击按钮时运行过程图像函数。

版本聲明 本文轉載於:https://dev.to/sfundomhlungu/building-chrome-extensions-101-a-quick-overview-2p96?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Laravel 中將花式文本標準化為普通文本
    在 Laravel 中將花式文本標準化為普通文本
    文章源自https://medium.com/@hafiqiqmal93/normalizing-fancy-text-to-normal-text-in-laravel-7d9ed56d5a78 使用者輸入的文字一點也不有趣。隨著 Unicode 在智慧型手機中的出現,用戶現在可以奢侈地(有時甚...
    程式設計 發佈於2024-11-08
  • 4 種頂級 API 測試工具指南
    4 種頂級 API 測試工具指南
    在 API 测试方面,拥有正确的工具可以带来巨大的改变。在本文中,我们将探讨 2024 年可用的一些最佳 API 测试工具,适合各个级别的开发人员。 回声API EchoAPI 是一种新兴且快速发展的 API 开发协作工具。与 Postman 不同,它有几个明显的优势,使其成为 P...
    程式設計 發佈於2024-11-08
  • 如何解決多項目 Gradle 配置中的測試依賴?
    如何解決多項目 Gradle 配置中的測試依賴?
    解決多項目Gradle 配置中的測試依賴關係在Gradle 中處理多項目建置時,必須在跨專案的測試程式碼之間建立有效的依賴關係。考慮專案 A 和專案 B 存在的場景,專案 B 依賴專案 A 的元件。 問題陳述在這種情況下,項目 B 的 build.gradle 可能如下所示:apply plugin...
    程式設計 發佈於2024-11-08
  • 如何在 Rust 中合理地組織你的 Tauri 命令
    如何在 Rust 中合理地組織你的 Tauri 命令
    在建立 Tauri 應用程式時,保持程式碼庫井然有序非常重要,尤其是隨著專案的成長。相信我,作為一個對 Rust 比較陌生的人,我也遇到過不少混亂的情況——花幾個小時把自己從自己挖的坑裡挖出來。如果你跟我一樣,你就會想避免這種情況。那麼,讓我們討論一下如何透過將 Tauri 命令拆分為單獨的檔案來保...
    程式設計 發佈於2024-11-08
  • ## 如何在 Docker 映像中預先快取 Go 依賴項以加快建置速度?
    ## 如何在 Docker 映像中預先快取 Go 依賴項以加快建置速度?
    利用預先快取的依賴關係高效建置 Docker 映像建置 Docker 映像時,最大限度地減少建置時間至關重要。一種策略是快取相依性。然而,這需要先建立依賴項,這可能會很耗時。 有沒有辦法預先建立 go.mod 檔案中列出的多個依賴項? 答案在於利用 Docker 的快取機制。建議的 Dockerfi...
    程式設計 發佈於2024-11-08
  • 如何刪除重複行同時保留最舊的提交?
    如何刪除重複行同時保留最舊的提交?
    管理重複行:保留最舊的提交重複資料會顯著影響任何資料庫的完整性和可用性。在這種情況下,我們的目標是根據subscriberEmail欄位消除重複行,只保留原始提交。 為了在不訴諸表交換技術的情況下實現這一點,我們可以使用以下SQL查詢: delete x from myTable x join m...
    程式設計 發佈於2024-11-08
  • 如何處理MySQL表名中的特殊字元?
    如何處理MySQL表名中的特殊字元?
    處理MySQL表名中的特殊字符MySQL將某些字符保留為特殊字符,這些字符在不經意使用時可能會與表名發生衝突。在給定的場景中,表名「e!」中的感嘆號 (!)資料插入時發生錯誤。 為了解決這個問題,MySQL 允許在使用特殊字元時用反引號 (`) 將表名括起來。這有效地“轉義”了特殊字符,並允許將其識...
    程式設計 發佈於2024-11-08
  • 了解 JVM 鎖優化
    了解 JVM 鎖優化
    并发对于开发可以执行多个并发操作的健壮、可扩展的应用程序非常关键。然而,为此需要付出同步方面的代价。由于获取和释放锁的随之而来的开销,它会产生性能成本。为了减轻这些性能成本,JVM 中融入了多种优化,例如偏向锁定、锁定消除、锁定粗化以及轻量级和重量级锁定的概念。 在本文中,我们将更详细地了解这些优化...
    程式設計 發佈於2024-11-08
  • 測試驅動開發 (TDD):嚴格的軟體開發方法
    測試驅動開發 (TDD):嚴格的軟體開發方法
    定義 TDD 測試驅動開發(TDD)是一種軟體開發方法,強調在編寫生產程式碼之前編寫測試。這是一種嚴格的方法,透過測試推動開發,有助於確保高品質的程式碼。 理解 TDD TDD 是一個循環過程,涉及三個關鍵步驟: 紅色:編寫定義程式碼所需行為的失敗測試。此步驟有助於澄清需求並確保測試集中於期望...
    程式設計 發佈於2024-11-08
  • 介面
    介面
    在物件導向程式設計中,定義類別應該做什麼是有用的,但定義類別應該做什麼是有用的。 抽象方法定義了方法的簽章而不提供實現,子類別必須實作該方法。 Java 中的介面可讓您將應該做什麼的定義與如何做的實作完全分開。 介面可以指定沒有主體的方法,該方法必須由類別實作。 實作一個介面的類別的數量沒...
    程式設計 發佈於2024-11-08
  • 在GoClipse中調試Go程式時如何避免進入彙編程式碼?
    在GoClipse中調試Go程式時如何避免進入彙編程式碼?
    使用彙編程式碼在GoClipse 中偵錯Go 程式嘗試在GoClipse 中除錯Go 程式時,使用者可能會遇到偵錯器無法正常運行的問題單步執行彙編程式碼而不是Go 程式碼。儘管正確安裝了 gdb 進行調試,但還是會發生這種情況。 設定斷點並透過 Eclipse 偵錯器執行程式時,它會輸入「rt0_d...
    程式設計 發佈於2024-11-08
  • 在 JavaScript 產生數字範圍
    在 JavaScript 產生數字範圍
    產生一個整數數組,並用從起始數字開始到結束數字結束的連續值填入該數組。 解決方案 function range(start, end) { const rangeArray = Array.from( {length: Math.ceil(end - start 1...
    程式設計 發佈於2024-11-08
  • 為什麼我的 PHP Curl 腳本中會出現「CURL 錯誤:接收失敗:連線由對等方重置」錯誤?
    為什麼我的 PHP Curl 腳本中會出現「CURL 錯誤:接收失敗:連線由對等方重置」錯誤?
    CURL ERROR: Recv failure: Connection Reset by Peer - PHP Curl遇到「CURL ERROR: Recv failure: Connection Reset by PHP Curl 中的「peer」錯誤可能會令人困惑。 1. TCP/IP 問題...
    程式設計 發佈於2024-11-08
  • 如何使用 SimpleDateFormat 解析帶有「Z」文字的日期?
    如何使用 SimpleDateFormat 解析帶有「Z」文字的日期?
    在 SimpleDateFormat 日期解析中處理 'Z' 文字在日期解析領域,'Z' 文字具有特殊的意義。它用作指示指定時間使用 UTC 作為參考點的標記。然而,使用 SimpleDateFormat 解析帶有此文字的日期可能會對某些特定模式帶來挑戰。 如您所遇到...
    程式設計 發佈於2024-11-08
  • 檢索表單輸入時如何處理空 $_POST 值
    檢索表單輸入時如何處理空 $_POST 值
    檢查$_POST 空值透過$_POST 從表單檢索使用者輸入時,驗證該值是否為空至關重要空或為空。否則可能會導致意外行為或安全漏洞。 在提供的程式碼中,條件 if(!isset($_POST['userName'])) 檢查 'userName' 鍵是否存在於$_PO...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3