首页 web前端 js教程 Chrome 扩展 - 环境设置

Chrome 扩展 - 环境设置

Jan 04, 2025 pm 03:51 PM

我想在我的浏览器中添加一些愚蠢的功能。也许我可以通过简单的扩展来添加它?虽然不存在,但是自己写应该很容易吧?

这就是我几天前的想法。虽然我没有完全错,但开发过程的某些部分比我预期的要耗时一些。我不会说困难,而是很难使用可用的文档来弄清楚。虽然在developer.chrome.com上对API文档、核心概念等进行了很好的描述,但我想要一种特定的开发体验:

  • 具有正确键入 chrome 命名空间的 TypeScript
  • 将代码拆分为多个文件并导入/导出必要的内容
  • 使用简单的 console.log 和/或调试器调试我的代码
  • manifest.json 中的自动补全
  • 简单的设置,在我的node_modules中没有任何捆绑程序和一半的互联网
  • 在浏览器中更新和测试扩展程序的简单方法

无论好坏,我都设法按照自己的意愿进行设置。在这篇文章中,我将简要解释一般扩展概念并向您展示我如何设置我的开发环境。在接下来的一两篇文章中,我将重点介绍我的简单页面音频扩展的实现细节。

TLDR:
如果您只想要代码,这里是样板存储库:

Chrome extension  - environment setup 巫杜教 / chromium 扩展样板

Chrom 扩展样板

此存储库旨在成为开发 chromium 扩展的起点。

它尽可能简约,但带有预先配置:

  • manifest.json 的自动补全
  • TypeScript 从 ts 文件夹转译到 dist 目录
  • chrome 命名空间的类型
  • 正常工作导出和导入(使用 VS Code 工作区设置来实现正确的自动导入格式)
  • 示例清单.json

编码愉快!


在 GitHub 上查看


ℹ️ 我在下面的所有地方都使用 Windows 11、MS Edge、VS Code 和 npm ℹ️


扩展的简要介绍

Chrome extension  - environment setup

让我们从一般扩展概念的速成课程开始。

每个扩展都有一个manifest.json 文件,用于定义其名称、版本、所需权限和使用的文件。扩展可以通过多种不同的方式提供功能:

  • 通过弹出窗口 - 扩展弹出窗口是当您单击扩展栏中的扩展图标时打开的小窗口,
  • 通过内容脚本 - 直接注入网站并具有 DOM 访问权限的脚本,
  • 通过后台(服务工作者)脚本 - 脚本在单独的上下文中运行,独立于打开的网站

还有其他方法,但我将在本指南中坚持使用这三种方法。

另一个重要的概念是消息传递。通常,我们需要结合上述方法,因为它们都有不同的局限性。例如,后台脚本不依赖于打开的选项卡,对于持久状态更有用,但无法访问任何网站的 DOM。因此,我们可能需要从后台脚本获取一些扩展范围的数据,使用消息将其传递到内容脚本,并从那里修改网站。

了解一些有关权限的基础知识也很有用。简而言之,如果 manifest.json 未指定正确的权限,某些 API 将无法按预期工作。例如,如果我们不指定“tabs”权限,则从 tabs API 返回的对象将不会有 url 字段。另一方面,我们不应该要求太多的权限 - 如果扩展程序要公开,用户可能会担心授予对太多内容的访问权限。


创建一个简单的扩展

Chrome extension  - environment setup

灵感来自 https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world

让我们首先使用一个极其简单的扩展来理解我们开发工作流程的核心概念,该扩展仅在弹出窗口中显示一些文本。

文件

首先,我们需要一个manifest.json文件:

1

2

3

4

5

6

7

8

9

10

11

// manifest.json

{

  "name": "Hello World",

  "description": "Shows Hello World text",

  "version": "1.0",

  "manifest_version": 3,

  "action": {

    "default_popup": "hello.html",

    "default_icon": "icon.png"

  }

}

登录后复制
登录后复制
登录后复制
登录后复制

名称、描述、版本和manifest_version可能是不言自明的。 action.default_popup 是单击扩展图标时将呈现的 HTML 文件的路径。 default_icon 是扩展图标的路径。两个路径都相对于manifest.json 位置。

现在,在与manifest.json相同的目录中添加icon.png(例如这个)和hello.html文件。
hello.html 看起来像这样:

1

2

<!-- hello.html -->

<p>Hello world</p>

登录后复制
登录后复制
登录后复制
登录后复制

你的整个目录应该是这样的:

1

2

3

4

5

6

7

8

9

10

11

// manifest.json

{

  "name": "Hello World",

  "description": "Shows Hello World text",

  "version": "1.0",

  "manifest_version": 3,

  "action": {

    "default_popup": "hello.html",

    "default_icon": "icon.png"

  }

}

登录后复制
登录后复制
登录后复制
登录后复制

激活扩展

要激活您的扩展程序:

  1. 转到edge://extensions/
  2. 在左侧边栏中,启用“开发者模式”
    • 可能还需要“允许其他商店的扩展”
  3. 在扩展列表上方点击“加载已解压的文件”
  4. 选择包含扩展文件的文件夹
  5. 您的扩展程序应该出现在列表中,并且其图标出现在扩展程序工具栏中?

现在,单击图标后,它将显示一个带有“Hello world”文本的小弹出窗口。

这涵盖了最重要的基础知识。让我们转向更有趣的事情。

Chrome extension  - environment setup


页面-音频扩展环境设置

Chrome extension  - environment setup

在manifest.json中自动完成

我们将从 manifest.json 和空目录开始。

在编写manifest.json 文件时能够自动完成会很棒,不是吗?幸运的是,它是一个定义明确的标准,并且在 https://json.schemastore.org/chrome-manifest 上有一个 JSON 模式。我们只需要在manifest.json开头的“$schema”键下使用它:

1

2

<!-- hello.html -->

<p>Hello world</p>

登录后复制
登录后复制
登录后复制
登录后复制

VS Code 立即开始帮助我们建议字段名称并在缺少必填字段时显示警告。太棒了!?

要使用一些东西来测试我们的设置,请使用manifest.json,如下所示:

1

2

3

4

.

├── hello.html

├── icon.png

└── manifest.json

登录后复制
登录后复制
  • 图标 - 这只是指定扩展图标的不同方式
  • 背景部分 - 指定 Service Worker JS 文件的路径及其类型;它是模块,因为代码稍后将使用导出和导入

打字稿

使用 TypeScript...好吧,需要 TypeScript。如果您尚未安装,请从
开始

1

2

3

4

// manifest.json

{

    "$schema": "https://json.schemastore.org/chrome-manifest"

}

登录后复制
登录后复制

基本配置

为了让事情组织起来,但又不要太复杂,我将 .ts 源文件保留在 ts 目录中。它们将被转译器从那里获取并作为 .js 文件放入 dist 目录中。

这由以下 .tsconfig 描述:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// manifest.json

{

    "$schema": "https://json.schemastore.org/chrome-manifest",

    "name": "Page Audio",

    "version": "0.0.0.1",

    "manifest_version": 3,

    "icons": {

        "16": "icons/logo16x16.png",

        "32": "icons/logo32x32.png",

        "48": "icons/logo48x48.png",

        "128": "icons/logo128x128.png"

    },

    "background": {

        "service_worker": "dist/background.js",

        "type": "module"

    }

}

登录后复制
登录后复制

最重要的位是compiler.rootDir 和compiler.outDir。其他字段可以具有不同的值或完全删除(至少其中一些)。

这是基本配置 - 将一些文件放在 ts 目录中并在根目录中运行 tsc 将在 dist 中创建相应的 .js 文件。然而,我们缺少一个重要的部分 - 我们将使用的 chrome 命名空间的类型。最简单的解决方案是通过 npm 添加它们。

添加镀铬类型

创建一个空的package.json,仅包含括号:

1

2

3

4

5

6

7

8

9

10

11

// manifest.json

{

  "name": "Hello World",

  "description": "Shows Hello World text",

  "version": "1.0",

  "manifest_version": 3,

  "action": {

    "default_popup": "hello.html",

    "default_icon": "icon.png"

  }

}

登录后复制
登录后复制
登录后复制
登录后复制

并在命令行中运行:

1

2

<!-- hello.html -->

<p>Hello world</p>

登录后复制
登录后复制
登录后复制
登录后复制

您还可以添加脚本来运行 tsc build 并在监视模式下运行。最终的 package.json 应如下所示:

1

2

3

4

.

├── hello.html

├── icon.png

└── manifest.json

登录后复制
登录后复制

ℹ️ chrome 类型版本可能会更高。 ℹ️

添加类型后,我们需要让 TypeScript 了解它们。为此,只需更新 .tsconfig.json:

1

2

3

4

// manifest.json

{

    "$schema": "https://json.schemastore.org/chrome-manifest"

}

登录后复制
登录后复制

测试我们的设置是否正常工作:

  1. 在ts文件夹中,创建background.ts文件,内容如下

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    // manifest.json

    {

        "$schema": "https://json.schemastore.org/chrome-manifest",

        "name": "Page Audio",

        "version": "0.0.0.1",

        "manifest_version": 3,

        "icons": {

            "16": "icons/logo16x16.png",

            "32": "icons/logo32x32.png",

            "48": "icons/logo48x48.png",

            "128": "icons/logo128x128.png"

        },

        "background": {

            "service_worker": "dist/background.js",

            "type": "module"

        }

    }

    登录后复制
    登录后复制
  2. 在命令行中,运行

    1

    npm install -g typescript

    登录后复制
  3. 验证 dist 目录是否已创建并且 background.js 文件是否出现在其中

  4. 更改 ts/background.ts 文件中 console.log 字符串中的某些内容并保存

  5. 检查是否自动更新了 dist/background.js。

如果有效,那就太棒了!我们几乎一切都准备好了?

您还可以验证您的目录结构是否类似于:

1

2

3

4

5

6

7

8

9

10

// .tsconfig

{

    "compilerOptions": {

        "target": "ES6",

        "module": "ES6",

        "outDir": "./dist",

        "rootDir": "./ts",

        "strict": true,

    }

}

登录后复制

进出口

正如我所提到的,我想将代码分割成更小的文件。为此,导出和导入必须正确工作。

朝这个方向迈出的一步是将manifest.json 中的service_worker 指定为“type”:“module”。然而,在使用模块时,TypeScript 和 JavaScript 之间有一个区别 - TypeScript 在导入时不需要文件扩展名,而 JavaScript 则需要。例如,这个导入:

1

2

3

// package.json

{

}

登录后复制

在 TS 中可以工作,但 JS 需要

1

npm i -D chrome-types

登录后复制

了解 TS 转换器 对导入路径不执行任何操作 也很重要。它足够“聪明”,能够理解从 file.js 导入时它还应该查找 file.ts。

结合所有这些,TS 也会对 JS 风格的导入感到满意,并且在从 file.js 导入时将使用相应的 TS 文件。 我们需要做的是确保 TS 文件中的所有导入都具有 .js 扩展名。要在 VS Code 中实现自动化:

  1. 按 CTRL , 打开设置
  2. 切换到“工作区”选项卡
  3. 搜索 typescript.preferences.importModuleSpecifierEnding
  4. 将其设置为“.js / .ts”选项

现在,每当您使用 VS Code 自动导入时,它都会将 .js 添加到文件名中?

要测试一切是否正常工作:

  1. 使用以下内容创建 ts/hello.ts 文件

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    // package.json

    {

        "scripts": {

            "build": "tsc",

            "watch": "tsc -w"

        },

        "devDependencies": {

            "chrome-types": "^0.1.327"

        }

    }

    登录后复制
  2. 在 ts/background.ts 中删除当前的 console.log 行并开始输入“hello”

  3. 在您使用 Tab 接受建议后,VS Code 应该自动完成它并添加正确的导入

  4. 最后,文件应如下所示:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    // manifest.json

    {

      "name": "Hello World",

      "description": "Shows Hello World text",

      "version": "1.0",

      "manifest_version": 3,

      "action": {

        "default_popup": "hello.html",

        "default_icon": "icon.png"

      }

    }

    登录后复制
    登录后复制
    登录后复制
    登录后复制

请注意,导入以 .js 扩展名结尾。如果你检查 dist/background.js 扩展也在那里,这就是使一切正常工作的原因。

为了确保我们处于同一阶段,您可以比较目录结构:

1

2

<!-- hello.html -->

<p>Hello world</p>

登录后复制
登录后复制
登录后复制
登录后复制

Service Worker 的开发工具

好的,我们有不错的开发经验。我们还添加了一些 console.log 调用...但是现在在哪里可以找到它们?

如果您在内容脚本中添加 console.log,您只需打开开发工具,它们就会在那里,因为内容脚本在与其注入的页面相同的上下文中工作。然而,来自后台脚本的 console.log 被隐藏得更多一些。

  1. 打开 edge://extensions/ 并加载您的扩展(如果您尚未这样做)
  2. 在列表中找到您的扩展
  3. 单击“检查视图”行中的“service worker”链接:

    Chrome extension  - environment setup

  4. 应打开一个新的开发工具窗口,您将在其中看到来自 Service Worker 的日志

    • 如果您没有看到日志,请单击“检查视图”下方的“重新加载”

图块底部的三个链接也非常重要

  • “重新加载”-刷新整个扩展,包括对manifest.json的更改;查看此表以了解何时可能需要重新加载
  • “删除”- 删除扩展
  • “详细信息”- 显示有关扩展程序的更多信息,例如其权限
  • (可选)“错误” - 如果安装 Service Worker 时出现错误,此链接将出现并带您进入错误列表

唷。这花了一些时间,但最终我们的环境已经设置好了。从现在开始,我们只需

  1. 运行 npm run watch (如果你停止了它)
  2. 在 ts 目录中写入我们的代码
  3. (可选)从扩展选项卡重新加载扩展

我们的扩展将自动更新! ⚙️

如果您知道如何自动“重新加载”(无需精心设计的黑客攻击),请在评论中告诉我

概括

Chrome extension  - environment setup

我们的环境已经准备好了!

  • 自动完成在manifest.json中工作,所以我们不必猜测正确的值是什么
  • TypeScript 帮助我们正确使用 chrome API
  • 代码可以分割成更小的逻辑文件
  • 我们在ts文件夹中编写的代码会自动更新
  • 我们知道在哪里可以找到服务工作者和内容脚本的开发工具

在下一部分中,我将描述我的小型“页面音频”扩展的实现细节。

感谢您的阅读!

以上是Chrome 扩展 - 环境设置的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript:探索网络语言的多功能性 JavaScript:探索网络语言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

如何使用Next.js(前端集成)构建多租户SaaS应用程序 如何使用Next.js(前端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:22 AM

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

使用Next.js(后端集成)构建多租户SaaS应用程序 使用Next.js(后端集成)构建多租户SaaS应用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

See all articles