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

构建 Chrome 扩展:快速概述

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

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]删除
最新教程 更多>
  • 如何处理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”错误可能会令人困惑。以下是解决此问题的潜在原因...
    编程 发布于2024-11-08
  • 如何使用 SimpleDateFormat 解析带有“Z”文字的日期?
    如何使用 SimpleDateFormat 解析带有“Z”文字的日期?
    在 SimpleDateFormat 日期解析中处理 'Z' 文字在日期解析领域,'Z' 文字具有特殊的意义。它用作指示指定时间使用 UTC 作为参考点的标记。然而,使用 SimpleDateFormat 解析带有此文字的日期可能会对某些特定模式带来挑战。正如您所遇到...
    编程 发布于2024-11-08
  • 检索表单输入时如何处理空 $_POST 值
    检索表单输入时如何处理空 $_POST 值
    检查 $_POST 空值通过 $_POST 从表单检索用户输入时,验证该值是否为空至关重要空或为空。否则可能会导致意外行为或安全漏洞。在提供的代码中,条件 if(!isset($_POST['userName'])) 检查 'userName' 键是否存在于$_POS...
    编程 发布于2024-11-08
  • 状态和道具:掌握 React Native 应用程序中的数据流
    状态和道具:掌握 React Native 应用程序中的数据流
    如果您是 React Native 或 React 新手,您一定会遇到过“state”和“props”这两个词。了解这两者对于开发动态且适应性强的移动应用程序至关重要。我们将在这篇博客文章中深入探讨 state 和 props,检查它们的差异,并学习如何有效处理 React Native 应用程序中...
    编程 发布于2024-11-08
  • 实时 API 设计:Node.js 最佳实践(指南)
    实时 API 设计:Node.js 最佳实践(指南)
    Node.js 因其事件驱动架构和非阻塞 I/O 模型而成为构建实时 API 的流行选择。 根据最新的使用统计数据,全球有超过 1500 万开发者在使用 Node.js,其中 67% 的企业报告成功采用了该技术。 使用 Node.js 构建的实时 API 为各种应用程序提供支持,从实时聊天和协作工具...
    编程 发布于2024-11-08
  • 使用 Kubernetes、Helm 和 Ingress 部署监控堆栈
    使用 Kubernetes、Helm 和 Ingress 部署监控堆栈
    观察和管理 Kubernetes 集群的性能对于维护应用程序运行状况、识别问题和确保高可用性至关重要。我将引导您使用 kubectl 和 Helm 设置全面的监控解决方案,将 Grafana、Loki 和 Prometheus 部署到集群,以及设置 Ingress 以进行外部访问。 我们将介绍以下关...
    编程 发布于2024-11-08
  • 使用 Unity 创建增强现实应用程序
    使用 Unity 创建增强现实应用程序
    介绍 随着智能手机的兴起和 3D 图形的进步,增强现实 (AR) 近年来已成为一项流行技术。它允许用户与现实世界中的数字元素交互,创造身临其境的、引人入胜的体验。 Unity 是创建 AR 应用程序最强大的工具之一,它是一种广泛应用于游戏行业的游戏引擎。在本文中,我们将探讨使用 U...
    编程 发布于2024-11-08
  • JavaScript 如何提供原生 JSON 解析和序列化?
    JavaScript 如何提供原生 JSON 解析和序列化?
    浏览器原生 JSON 解析和序列化window.JSON 对象在现代浏览器中提供原生 JSON 支持,包括 Internet Explorer 8 、 Firefox 3.1、Safari 4 和 Chrome 3。该对象公开两个方法:JSON.parse(str)解析 JSON 字符串 str 并...
    编程 发布于2024-11-08
  • 使用 STMMCU 实现静电除尘器控制器的 SPWM ase/ase 逆变器
    使用 STMMCU 实现静电除尘器控制器的 SPWM ase/ase 逆变器
    前段时间提到中频电除尘器控制器,我仔细分析了单相和三相SPWM驱动时间,完成了STM32F103处理器上SPWM代码的编写,并用示波器测试了信号和波形,逻辑分析仪。 STM32F103的TIMER1和TIMER2支持互补的PWM输出,我选择TIMER1的CH1、CH2、CH3用于A、B、C三相驱动;...
    编程 发布于2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3