当前位置: 首页 > news >正文

初识浏览器扩展,搭建你的“秘密基地”

第一章:初识浏览器扩展,搭建你的“秘密基地”

本章目标:成功创建并运行你的第一个“Hello, World”浏览器扩展。


你的浏览器,不止于“浏览”

嘿,朋友!欢迎来到我们的专栏。

在正式敲下第一行代码前,我想请你先闭上眼睛(好吧,别真的闭上,不然就没法看了),回想一下你每天是如何使用浏览器的。

你可能会打开它查资料、看视频、刷社交媒体,或者在某个在线文档上奋笔疾书。对大多数人来说,浏览器就是一个通往互联网世界的“窗口”。但你有没有想过,这个“窗口”,其实可以被我们亲手改造成一扇“任意门”,一个“万能工具箱”,甚至是一个装备了各种黑科技的“未来驾驶舱”?

让这一切成为可能的,就是我们今天的主角——浏览器扩展(Browser Extension)

如果你觉得这个词听起来有点“技术宅”,那换个说法:广告拦截插件、密码管理工具、网页翻译器、购物比价助手……这些你可能每天都在使用的“小玩意儿”,本质上都是浏览器扩展。它们就像是给你的浏览器配备的“外挂装备”,小到改变网页颜色,大到与复杂的服务器进行交互,无所不能。

正如我在开篇时提到的,我开发 Chat2File-deepseek 的初衷,仅仅是为了解决一个个人痛点。但当我看到一个小小的想法,最终变成了工具栏上一个可以点击的图标,并在我的工作流中真正发挥作用时,那种创造的快乐是难以言喻的。

这趟旅程,我不想让你只做个看客。我要带你成为一名**“浏览器世界的建筑师”。而今天,我们的任务,就是为我们未来的宏伟蓝图,打下第一块地基,搭建起一个最最基础的,但却至关重要的——“秘密基地”**。


1.1 什么是浏览器扩展?—— 城市里的“万能铺子”

让我们用一个生动的比喻来理解。

想象一下,你的浏览器(Chrome, Edge, Firefox等)是一座繁华的现代化大都市。城市里有各种各样的公共设施:道路(网络连接)、广场(搜索引擎)、商店(网站)、图书馆(维基百科)等等。你作为市民,可以自由地在城市里穿行、消费、学习。

那么,浏览器扩展是什么呢?

它们就是由像你我这样的开发者,在这座城市里开设的**“万能铺子”“便民服务站”**。

  • AdBlock / uBlock Origin:这是城市入口处的“智能安保亭”。它会帮你识别并拦截那些烦人的广告传单和弹窗,让你的城市漫步之旅清爽无比。
  • Tampermonkey (油猴):这是一个神奇的“魔法工坊”。你可以在这里编写或安装各种“魔法卷轴”(用户脚本),对城市里的任何一座建筑(网站)进行“附魔”——比如给视频网站增加倍速播放按钮,或者给购物网站增加历史价格曲线。
  • Notion Web Clipper / 印象笔记·剪藏:这是一个“数字捕蝶网”。当你在城市里发现任何美丽的风景(有价值的文章、图片),轻轻一挥,就能将它完整、优雅地捕捉到你的私人收藏馆里。
  • Dark Reader:这是“夜猫子专用护目镜”。一键开启,整个城市的灯光都会变得柔和、护眼,让你在深夜“冲浪”时也能倍感舒适。

![一张包含上述几个扩展图标的拼图]

看,这些“铺子”和“服务站”并没有改变城市本身(它们不会修改浏览器内核),但它们极大地丰富和改善了市民(我们)的生活体验。

从技术的角度讲,浏览器扩展其实就是一堆我们前端开发者再熟悉不过的文件:HTML、CSS 和 JavaScript。只不过,浏览器赋予了它们一些“特权”——也就是一套特殊的 JavaScript API。通过这些 API,我们的代码就能“合法地”做到一些普通网页做不到的事情,比如:

  • 读取和修改你当前打开的所有标签页信息。
  • 在用户点击工具栏图标时,弹出一个自定义的小窗口。
  • 在特定网站上运行我们自己的脚本,修改页面内容。
  • 将数据安全地存储在浏览器本地。
  • 在后台持续监听某些事件(比如下载完成)。

所以,请放下你的敬畏之心。开发浏览器扩展,并不是什么需要学习屠龙之术的黑魔法。它更像是你已经掌握的十八般武艺(HTML/CSS/JS),终于找到了一个可以大展拳脚、创造无限可能的全新舞台。

准备好上台表演了吗?别急,我们先得去“市政厅”办一张“营业执照”。


1.2 扩展的核心:manifest.json —— 你的“营业执照”与“身份证明”

在我们的“浏览器大都市”里,不是随随便便就能开店的。城市管理者(浏览器)需要确保每一家“铺子”都是安全、合规、身份明确的。

因此,每一个扩展都必须拥有一个核心文件,它的名字是 manifest.json

你可以把这个文件想象成你的扩展向浏览器提交的 “身份证明” + “营业执照申请表”。它是一个遵循特定格式的 JSON 文件,你在里面用声明式的语言,清清楚楚地告诉浏览器:

  • “我是谁?”(名字、版本、描述)
  • “我长什么样?”(图标)
  • “我想开一个什么样的店?”(是工具栏弹窗,还是后台服务?)
  • “我需要哪些营业许可?”(权限申请,比如是否需要读取标签页)
  • “我的店员(脚本)都在哪里?”(脚本文件的路径)

浏览器在加载你的扩展时,会做的第一件事就是阅读这份 manifest.json 文件。如果格式有误,或者申请了不被允许的权限,浏览器会直接拒绝加载,并在控制台里毫不留情地告诉你:“对不起,你的申请不合格!”

Manifest V3:更安全、更现代的规范

你可能在查阅资料时,看到过 Manifest V2 (MV2) 和 Manifest V3 (MV3) 的说法。简单来说,这是扩展规范的两个主要版本。MV3 是 Google 推出的新一代规范,它在安全性、性能和隐私保护上都做了重要的改进。

虽然目前 MV2 仍然存在,但 Chrome 网上应用店已经不再接受新的 MV2 扩展上架,并且正在逐步淘汰所有存量的 MV2 扩展。所以,我们这个专栏将完全基于现代的 Manifest V3 规范进行教学,让你从一开始就站在正确的、面向未来的起跑线上。

解剖 manifest.json 的核心字段

好了,理论说得够多了。让我们直接来看一张最最基础的“营业执照”长什么样。下面,我们将为我们的第一个“Hello, World”小铺子,起草一份申请。

{"manifest_version": 3,"name": "我的第一个扩展","version": "1.0.0","description": "这是一个从零到一教程中诞生的神奇扩展!","icons": {"16": "images/icon16.png","48": "images/icon48.png","128": "images/icon128.png"},"action": {"default_icon": "images/icon16.png","default_title": "点击我!","default_popup": "popup.html"}
}

别怕,我们像庖丁解牛一样,把它一块块拆开来看:

  1. "manifest_version": 3

    • 含义:这是最重要的声明,没有之一!它像是在申请表的顶端加粗写着:“本人申请办理 V3 版本 营业执照”。浏览器一看到这个,就知道要用最新的 V3 规范来审核和运行你的扩展。这是必填项。
  2. "name": "我的第一个扩展"

    • 含义:你的“铺子”叫什么名字。这个名字会显示在扩展管理页面、应用商店等地方。简单明了,必填项
  3. "version": "1.0.0"

    • 含义:当前的版本号。这对于后续的更新迭代至关重要。我们通常遵循 语义化版本(Semantic Versioning)规范,即“主版本号.次版本号.修订号”(MAJOR.MINOR.PATCH)。
      • PATCH (修订号): 修复了一些 bug。
      • MINOR (次版本号): 增加了一些新功能,且向下兼容。
      • MAJOR (主版本号): 做了不向下兼容的重大改动。
    • 养成好习惯,从 1.0.0 开始。这是必填项
  4. "description": "这是一个..."

    • 含义:一句话简介。用简短的文字描述你的扩展是做什么的。它会显示在扩展管理页面的名称下方。
  5. "icons": { ... }

    • 含义:你的“品牌 Logo”。这里定义了你的扩展在不同场景下显示的图标。
      • "16": 16x16 像素,通常显示在浏览器工具栏上(但 action.default_icon 的优先级更高)。
      • "48": 48x48 像素,显示在扩展管理页面 (chrome://extensions)。
      • "128": 128x128 像素,在安装和应用商店展示时使用。
    • 最佳实践:提供所有推荐尺寸的图标,会让你的扩展看起来更专业。这里的路径是相对于扩展根目录的。
  6. "action": { ... }

    • 含义:这是 MV3 中一个非常核心的概念,它定义了用户与你的扩展进行主要交互的方式,通常是指用户点击浏览器工具栏上你的扩展图标时的行为。
    • "default_icon": 指定显示在工具栏上的图标。它会覆盖 icons 中定义的 16px 图标。
    • "default_title": 当用户的鼠标悬停在工具栏图标上时,显示的提示文字。
    • "default_popup": 关键中的关键! 这里指定了一个 HTML 文件。当用户点击图标时,浏览器会加载并弹出一个小窗口,窗口的内容就是这个 HTML 文件。这就是我们常说的 Popup 页面

呼——!恭喜你,你已经完成了最枯燥但也是最重要的一步:理论学习。你现在已经完全理解了这张“营业执照”的含义。

是时候卷起袖子,亲手把它“打印”出来了。


1.3 Hello, World! —— 建造你的第一个“秘密基地”

理论说一千道一万,不如亲手敲一行。现在,我们将遵循最神圣的编程传统,创建我们的第一个“Hello, World”扩展。

第一步:创建项目文件夹(选址盖楼)

首先,在你的电脑上找一个你喜欢的地方(比如桌面,或者你的代码项目文件夹),创建一个新的文件夹。这个文件夹就是我们扩展的根目录,我们所有的代码和资源都将放在这里。

给它起个名字,比如 my-first-extension

// 你的电脑上的某个位置
my-first-extension
第二步:准备资源文件(准备建材)

我们的 manifest.json 里提到了 images 文件夹和几个图标文件。为了让我们的扩展看起来不那么“秃”,我们先来准备一下。

my-first-extension 文件夹里,创建一个名为 images 的子文件夹。

my-first-extension
└── images

然后,你需要准备几张 .png 格式的图标。你可以自己用工具画,也可以从 icon-icons.com、Flaticon 等网站上找一些免费的图标。重要的是,你需要把它们处理成三个尺寸:16x1648x48128x128 像素。

为了方便你快速开始,我这里提供一个简单的图标供你使用(你可以右键保存下图,或者直接用任何一张你喜欢的 16x16 的图片代替)。

![一张简单的16x16像素的笑脸或灯泡图标]
(假设你保存为了 icon16.png)

现在,我们简化一下,只准备一个 icon16.png。为了让 manifest.json 能找到它,我们把它直接放在 images 文件夹里。在后续的章节中,我们再补全其他尺寸。

你的文件结构现在是:

 my-first-extension
└── images└── icon16.png

(注意:为了让代码跑起来,manifest.json 中提到的其他图标 icon48.pngicon128.png 也要先放进去,哪怕只是复制 icon16.png 并重命名。否则浏览器加载时会报“找不到文件”的错误。)

第三步:撰写“营业执照” (manifest.json)

现在,在 my-first-extension 的根目录(与 images 文件夹同级)下,创建一个新的文本文件,命名为 manifest.json

用你喜欢的代码编辑器(如 VS Code)打开它,然后把我们刚才详细解读过的那段 JSON 代码一字不差地复制进去。

// my-first-extension/manifest.json{"manifest_version": 3,"name": "我的第一个扩展","version": "1.0.0","description": "这是一个从零到一教程中诞生的神奇扩展!","icons": {"16": "images/icon16.png","48": "images/icon48.png","128": "images/icon128.png"},"action": {"default_icon": "images/icon16.png","default_title": "点我,有惊喜!","default_popup": "popup.html"}
}

千万注意:JSON 格式非常严格,不能有任何多余的逗号(比如最后一个 } 前面不能有逗号),所有字符串必须用双引号 "" 包裹。

第四步:搭建“门面” (popup.html)

我们的“执照”上写了,当用户点击图标时,要展示一个叫 popup.html 的页面。现在我们就来创建它。

同样,在 my-first-extension 的根目录下,创建一个新的 HTML 文件,命名为 popup.html

打开它,写入最最基础的 HTML 代码:

<!-- my-first-extension/popup.html --><!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>我的弹窗</title><style>body {width: 200px;height: 100px;text-align: center;font-family: sans-serif;}</style>
</head>
<body><h1>你好,扩展世界!</h1><p>🎉</p>
</body>
</html>

这段代码非常简单:

  • 它创建了一个标准的 HTML5 页面。
  • <style> 标签里,我们给弹窗设置了一个固定的宽度和高度,并让内容居中,否则它会自适应内容大小,看起来很奇怪。
  • <body> 里,我们放了一个大标题 <h1> 和一个小小的庆祝 emoji。

至此,我们“秘密基地”的所有建筑材料和设计图纸都已经准备就绪!

最终的文件夹结构应该是这样的:

my--first-extension/
├── images/
│   ├── icon16.png
│   ├──  icon48.png
│   └── icon128.png
├── manifest.json
└── popup.html
第五步:盛大开业!—— 在浏览器中加载你的扩展

激动人心的时刻到了!我们要亲手把这个扩展“安装”到浏览器里。这个过程,我们称之为**“加载已解压的扩展程序”**。

Google Chrome 为例 (Microsoft Edge 步骤几乎完全一样):

  1. 打开扩展管理页面

    • 在地址栏输入 chrome://extensions 并回车。
    • 或者,点击浏览器右上角的“三个点”菜单 -> “扩展” -> “管理扩展程序”。
  2. 打开“开发者模式”

    • 在这个页面的右上角,你会看到一个名为 “开发者模式” (Developer mode) 的开关。把它打开!
    • 打开后,你会发现页面上多出了一排按钮:“加载已解压的扩展程序”、“打包扩展程序”等。

![一张截图,高亮显示“开发者模式”的开关位置]

  1. 加载你的“秘密基地”

    • 点击左上角的 “加载已解-压的扩展程序” (Load unpacked) 按钮。
    • 此时会弹出一个文件选择对话框。
    • 关键操作选择我们刚才创建的 my-first-extension 整个文件夹,然后点击“选择文件夹”或“确定”。不要选错了,是选择包含 manifest.json 的那个根文件夹
  2. 见证奇迹的时刻

    • 如果一切顺利,没有任何拼写错误或格式问题,你会在扩展管理页面上看到一个新的卡片,上面写着“我的第一个扩展”,还有我们设置的版本号和描述。
    • 同时,请把目光移向你的浏览器工具栏(地址栏右侧)。你会发现,那里多出了一个我们指定的 icon16.png 图标!

![一张截图,展示扩展已成功加载的卡片和工具栏上的新图标]

  1. 最后的互动
    • 将鼠标悬停在那个新图标上,是不是看到了提示文字:“点我,有惊喜!”?
    • 现在,用力点击它
    • Booooom! 一个小小的窗口从图标下方弹出,上面赫然写着:“你好,扩展世界!🎉”

恭喜你!你,已经成功地创造并运行了你的第一个浏览器扩展!

你不再只是一个使用者,你已经迈出了成为创造者的第一步。感受一下这小小的、但却无比真实的成就感。


1.4 事后复盘:刚才究竟发生了什么?以及“踩坑”指南

在我们庆祝之前,让我们快速回顾一下这个魔法般的流程,并为你准备一份“新手踩坑应急指南”。

流程回顾
  1. 当你点击“加载已解压的扩展程序”并选择文件夹时,浏览器做的第一件事就是冲进这个文件夹,找到 manifest.json 文件。
  2. 浏览器像一位严格的考官,逐行阅读 manifest.json,检查语法,理解你的意图。
  3. 它读到 "action" 字段,知道了:“哦,这家伙想在工具栏上放个图标,点击图标还要弹出一个叫 popup.html 的窗口。”
  4. 于是,它在工具栏上为你预留了一个位置,放上了你指定的 action.default_icon
  5. 当你点击那个图标时,浏览器立刻执行 action 里定义的命令:加载 popup.html 文件,并将它的内容渲染在一个特殊的小窗口里展示给你。

整个过程,就像是上演了一出由 manifest.json 导演,浏览器负责执行的微型舞台剧。

新手踩坑应急指南

编程世界里,第一次就完美运行是小概率事件。如果你在加载时遇到了问题,别慌,99% 的新手都会遇到。来看看你踩了哪个坑:

  • 坑点一:加载后出现红色错误提示“清单文件无效” (Manifest is not valid)

    • 原因manifest.json 文件内容有误。
    • 排查
      1. JSON 格式错误:检查是不是哪个地方多了或少了一个逗号 ,,是不是用了单引号 ' 而不是双引号 "。你可以把你的 JSON 内容复制到 JSONLint 这样的在线校验工具里检查一下。
      2. 必填字段缺失:检查 manifest_version, name, version 这三个必填项是不是都写了。
      3. 拼写错误:检查 "manifest_version" 是不是写成了 "manifest_version_" 之类的。
  • 坑点二:扩展加载成功了,但图标是个破碎的图片

    • 原因manifest.json 里指定的图标路径不正确。
    • 排查:检查 iconsaction.default_icon 里的路径,例如 "images/icon16.png",是不是和你实际的文件结构完全一致。路径是大小写敏感的!
  • 坑点三:我修改了 popup.html 的内容,但点击图标弹出的还是旧的内容

    • 原因:对于已解压的扩展,大多数文件(尤其是 manifest.json 和后台脚本)的修改,不会自动生效
    • 解决方法:回到 chrome://extensions 页面,找到你的扩展卡片,点击那个圆形的刷新箭头按钮(“更新”)。这样浏览器就会重新加载你的所有文件。对于 Popup 页面和内容脚本的简单修改,有时关闭再打开 Popup 即可,但养成修改后点击刷新按钮的习惯是最好的。

![一张截图,高亮显示扩展卡片上的刷新按钮]


本章总结与展望

好了,建筑师!今天,我们完成了三件了不起的大事:

  1. 认知破冰:我们彻底搞懂了浏览器扩展的本质,它不再是神秘的黑科技,而是我们前端技能的延伸。
  2. 理论奠基:我们深入学习了扩展的灵魂——manifest.json 文件,掌握了 V3 规范下的核心字段。
  3. 实践落地:我们亲手搭建了项目结构,编写了代码,并成功在浏览器里运行了我们的第一个“Hello, World”扩展。

虽然它现在还很简单,只能弹出一个静态的窗口,但这个小小的“秘密基地”,是我们未来所有宏大构想的起点。它证明了我们有能力将想法付诸实践。

请务必亲自完成本章的所有步骤,没有什么比亲眼看到自己的作品运行起来更具激励作用了。

在下一章,我们将为这个略显单调的“基地”添砖加瓦。我们将学习如何:

  • 用 CSS 美化我们的 Popup 界面。
  • 用 JavaScript 赋予它交互能力,让它能响应我们的点击。

我们将正式开始“智能标签页管家”的界面构建工作。

保持这份兴奋和好奇心,我们的旅程才刚刚开始。

我们下期再见!

http://www.dtcms.com/a/317911.html

相关文章:

  • 基于2025年《Science》期刊论文的科研图表Python绘制分析
  • CDP集群中通过Hive外部表迁移HBase数据的操作记录
  • 使用 Apache DolphinScheduler 构建和部署大数据平台,将任务提交至 AWS 的实践经验
  • 常用排序方法
  • Redis的分布式序列号生成器原理
  • Vue Vant使用
  • CEH、OSCP、CISP、CISSP 四大网络安全认证攻略
  • o2o 商城系统数据分析管理系统模块设计
  • ZYNQ实现FFT信号处理项目
  • Godot ------ 初级人物血条制作02
  • SpringCloud -- elasticsearch(二)
  • wordpress网站的“管理员邮箱地址”有什么用?
  • CVE-2021-30661、CVE-2021-30665、CVE-2021-30666
  • c++类常用默认成员函数细节分析
  • Godot ------ 初级人物血条制作01
  • linux-系统性能监控
  • 如何测试一个机器是大端还是小端
  • cocos Uncaught TypeError: Cannot read properties of null (reading ‘SetActive‘)
  • 达梦数据库日常运维命令
  • Node.js从入门到精通完整指南
  • 查看ubuntu server 的基本信息
  • 【DeepID】《Deep Learning Face Representation from Predicting 10,000 Classes》
  • 项目中使用的设计模式
  • GPT-OSS 与 Ollama 完整安装使用教程
  • 如何自动生成 API 接口文档 - 一份详细指南
  • 强强联合:OpenAI正式登陆AWS!
  • 基于AI的自动驾驶汽车(AI-AV)网络安全威胁缓解框架
  • Windows 如何上架 iOS 应用?签名上传全流程 + 工具推荐
  • 跨过BI,企业能直接用AI实现数据分析吗?
  • Template 显式实例化 隐式实例化