”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 构建 Chrome 扩展:快速概述

构建 Chrome 扩展:快速概述

发布于2024-11-08
浏览:133

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]删除
最新教程 更多>
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    在Java 中,以全屏幕独立模式运行Java应用程序时,通常无法按期望的工作可能无法使用JAVA应用程序时,将用户输入在Java ProblemPassive rendering mode allows the use of KeyListener and ActionListener inter...
    编程 发布于2025-06-08
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-06-08
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-06-08
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-06-08
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-06-08
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-06-08
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-06-08
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-06-08
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 的 ...
    编程 发布于2025-06-08
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-06-08
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-06-08
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-06-08
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-06-08
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-06-08
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-06-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3